diff --git a/trunk/dist/game/config/Character.properties b/trunk/dist/game/config/Character.properties index bb511e0498..31a0be381a 100644 --- a/trunk/dist/game/config/Character.properties +++ b/trunk/dist/game/config/Character.properties @@ -206,10 +206,6 @@ AltGameSkillLearn = False # Default: False AltSubClassWithoutQuests = False -# Allow player to add/change subclass at all village master -# Default: False -AltSubclassEverywhere = False - # Allow player to learn transformations without quest. # Default: False AltTransformationWithoutQuest = False @@ -285,8 +281,8 @@ MaxExpBonus = 3.5 MaxSpBonus = 3.5 # Maximum character running speed. -# Default: 250 -MaxRunSpeed = 250 +# Default: 300 +MaxRunSpeed = 300 # Maximum character Physical Critical Rate. (10 = 1%) # Default: 500 @@ -315,6 +311,7 @@ MinAbnormalStateSuccessRate = 10 MaxAbnormalStateSuccessRate = 90 # Maximum number of allowed subclasses for every player. +# Do not use more than 3! # Default: 3 MaxSubclass = 3 @@ -322,6 +319,10 @@ MaxSubclass = 3 # Default: 40 BaseSubclassLevel = 40 +# Starting level for dualclasses after reawaking. +# Default: 85 +BaseDualclassLevel = 85 + # Maximum subclass level. # Default: 80 MaxSubclassLevel = 80 @@ -363,7 +364,7 @@ FreightPrice = 1000 # Npc talk blockage. When a player talks to a NPC, he must wait some secs # before being able to walk again. In seconds -# Default: 3 +# Default: 0 # Set to 0 to disable it NpcTalkBlockingTime = 0 diff --git a/trunk/dist/game/config/General.properties b/trunk/dist/game/config/General.properties index bf2572f9f1..b829e60090 100644 --- a/trunk/dist/game/config/General.properties +++ b/trunk/dist/game/config/General.properties @@ -20,7 +20,7 @@ ServerListBrackets = False # Displays server type next to the server name on character selection. # Notes: -# Accepted Values: Normal, Relax, Test, NoLabel, Restricted, Event, Free +# Accepted Values: Normal, Relax, Test, Broad, Restricted, Event, Free, World, New, Classic # Default: Normal ServerListType = Normal @@ -405,12 +405,8 @@ GridNeighborTurnOffTime = 90 # Allow characters to receive damage from falling. # CoordSynchronize = 2 is recommended. -# True - enabled. -# False - disabled. -# Auto - True if geodata enabled and False if disabled. -# Default: Auto -EnableFallingDamage = Auto - +# Default: True +EnableFallingDamage = True # --------------------------------------------------------------------------- # Features @@ -896,9 +892,6 @@ PacketHandlerDebug = False # Default: False Developer = False -# Default: False -AcceptGeoeditorConn = False - # Don't load Handlers # Default: False AltDevNoHandlers = False diff --git a/trunk/dist/game/config/GeoData.properties b/trunk/dist/game/config/GeoData.properties index 992f0d8cd1..3511380185 100644 --- a/trunk/dist/game/config/GeoData.properties +++ b/trunk/dist/game/config/GeoData.properties @@ -2,28 +2,17 @@ # GeoData # --------------------------------------------------------------------------- -# GeoData options: -# 0 = GeoData and PathFinding OFF (default) -# 1 = GeoData is used to check Line Of Sight (LOS) targeting and -# L2Playable movement. You need to download files for data/geodata folder. -# Monsters can pass walls but not aggro (no line of sight) through them. -# 2 = Full GeoData enabled. Includes PathFinding (requires also /data/pathnode -# files if CellPathFinding not enabled) and all character moves go through -# geodata checks (if a mob passes a wall, pathfinding didn't find a route -# but we allow attack and returning home). -# Recommended server memory minimum 2 GB, rather 3 GB. +# Pathfinding options: +# 0 = Disabled +# 1 = Enabled using path node files +# 2 = Enabled using geodata cells at runtime # Default: 0 -GeoData = 0 +PathFinding = 0 # Pathnode directory # Default: data/pathnode PathnodeDirectory = data/pathnode -# Cell-level pathfinding, produces more accurate routes but is (maybe 10x) heavier to calculate. Recommended for small servers at least. -# If False, pathnode files are used. Uses a max number of nodes in calculation which can be adjusted in the algorithm if it needs to be faster. -# Default: False -CellPathFinding = False - # Pathfinding array buffers configuration PathFindBuffers = 100x6;128x6;192x6;256x4;320x4;384x4;500x2 diff --git a/trunk/dist/game/data/doors.xml b/trunk/dist/game/data/doors.xml index e3394e85f0..ea4c95a171 100644 --- a/trunk/dist/game/data/doors.xml +++ b/trunk/dist/game/data/doors.xml @@ -599,8 +599,8 @@ - - + + @@ -608,13 +608,13 @@ - - + + - - - - + + + + @@ -685,10 +685,10 @@ - - - - + + + + @@ -733,12 +733,12 @@ - - + + - - + + @@ -763,10 +763,10 @@ - - - - + + + + @@ -853,12 +853,12 @@ - - + + - - + + @@ -896,22 +896,22 @@ - - + + - - + + - - + + - - + + @@ -920,10 +920,10 @@ - - - - + + + + @@ -939,10 +939,10 @@ - - - - + + + + @@ -961,10 +961,10 @@ - - - - + + + + @@ -996,10 +996,10 @@ - - - - + + + + @@ -1013,20 +1013,20 @@ - - - - + + + + - - + + - - + + @@ -1037,14 +1037,14 @@ - - + + - - + + @@ -1053,12 +1053,12 @@ - - + + - - + + @@ -1070,12 +1070,12 @@ - - + + - - + + @@ -1097,10 +1097,10 @@ - - - - + + + + @@ -1167,10 +1167,10 @@ - - - - + + + + @@ -1296,10 +1296,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/html/admin/serverinfo.htm b/trunk/dist/game/data/html/admin/serverinfo.htm index 83519c879d..cf06c95dc3 100644 --- a/trunk/dist/game/data/html/admin/serverinfo.htm +++ b/trunk/dist/game/data/html/admin/serverinfo.htm @@ -36,7 +36,7 @@ %gameTime% (%dayNight%) - Geodata: + Pathfinding: %geodata% diff --git a/trunk/dist/game/data/html/teleporter/30146-1.htm b/trunk/dist/game/data/html/teleporter/30146-1.htm deleted file mode 100644 index b76183ceb2..0000000000 --- a/trunk/dist/game/data/html/teleporter/30146-1.htm +++ /dev/null @@ -1,11 +0,0 @@ -&$556;

- - - - - - - - - - \ No newline at end of file diff --git a/trunk/dist/game/data/html/teleporter/30146-2.htm b/trunk/dist/game/data/html/teleporter/30146-2.htm deleted file mode 100644 index 1a841bc6f9..0000000000 --- a/trunk/dist/game/data/html/teleporter/30146-2.htm +++ /dev/null @@ -1,6 +0,0 @@ -&$556;

- - - - - \ No newline at end of file diff --git a/trunk/dist/game/data/html/teleporter/30146-3.htm b/trunk/dist/game/data/html/teleporter/30146-3.htm deleted file mode 100644 index 5572da8ca3..0000000000 --- a/trunk/dist/game/data/html/teleporter/30146-3.htm +++ /dev/null @@ -1,6 +0,0 @@ -&$556;

- - - - - \ No newline at end of file diff --git a/trunk/dist/game/data/html/teleporter/32163-1.htm b/trunk/dist/game/data/html/teleporter/32163-1.htm deleted file mode 100644 index c5e2bbaf14..0000000000 --- a/trunk/dist/game/data/html/teleporter/32163-1.htm +++ /dev/null @@ -1,14 +0,0 @@ -&$556;

- - - - - - - - - - - - - \ No newline at end of file diff --git a/trunk/dist/game/data/html/teleporter/32163-2.htm b/trunk/dist/game/data/html/teleporter/32163-2.htm deleted file mode 100644 index 639d307222..0000000000 --- a/trunk/dist/game/data/html/teleporter/32163-2.htm +++ /dev/null @@ -1,5 +0,0 @@ -&$556;

- - - - \ No newline at end of file diff --git a/trunk/dist/game/data/html/teleporter/32163-3.htm b/trunk/dist/game/data/html/teleporter/32163-3.htm deleted file mode 100644 index 8000e2285c..0000000000 --- a/trunk/dist/game/data/html/teleporter/32163-3.htm +++ /dev/null @@ -1,5 +0,0 @@ -&$556;

- - - - \ No newline at end of file diff --git a/trunk/dist/game/data/html/teleporter/32163-4.htm b/trunk/dist/game/data/html/teleporter/32163-4.htm deleted file mode 100644 index 0041325a95..0000000000 --- a/trunk/dist/game/data/html/teleporter/32163-4.htm +++ /dev/null @@ -1,3 +0,0 @@ -Gatekeeper Ragara:
-The Stronghold teleport for beginners may only be used by characters lower than level 20. - \ No newline at end of file diff --git a/trunk/dist/game/data/html/teleporter/32163-5.htm b/trunk/dist/game/data/html/teleporter/32163-5.htm deleted file mode 100644 index 11538f09ea..0000000000 --- a/trunk/dist/game/data/html/teleporter/32163-5.htm +++ /dev/null @@ -1,5 +0,0 @@ -&$556;

- - - - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass.htm b/trunk/dist/game/data/html/villagemaster/SubClass.htm deleted file mode 100644 index e8f74968ea..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass.htm +++ /dev/null @@ -1,6 +0,0 @@ -Subclass:
- - - - - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_Add.htm b/trunk/dist/game/data/html/villagemaster/SubClass_Add.htm deleted file mode 100644 index 9052a07844..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_Add.htm +++ /dev/null @@ -1,4 +0,0 @@ -Add a subclass:
-Which of the following would you like to add as a subclass?
-%list% - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_AddOk.htm b/trunk/dist/game/data/html/villagemaster/SubClass_AddOk.htm deleted file mode 100644 index 4471c2d241..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_AddOk.htm +++ /dev/null @@ -1,3 +0,0 @@ -Add a subclass:
-Congratulations! You've added a new subclass. Open the Character Information window (ALT + T) to confirm. - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_Change.htm b/trunk/dist/game/data/html/villagemaster/SubClass_Change.htm deleted file mode 100644 index 3c26c50028..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_Change.htm +++ /dev/null @@ -1,5 +0,0 @@ -Subclass Change:
-When you change your subclass, all positive effects currently being applied to your character will disappear, including energy buffs.

-Please select your new subclass.
-%list% - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_ChangeNo.htm b/trunk/dist/game/data/html/villagemaster/SubClass_ChangeNo.htm deleted file mode 100644 index c15dc9edee..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_ChangeNo.htm +++ /dev/null @@ -1,4 +0,0 @@ -Change sub class:
-It is impossible to change sub classes when you have no sub class. First, add a sub class.
- - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_ChangeNotFound.htm b/trunk/dist/game/data/html/villagemaster/SubClass_ChangeNotFound.htm deleted file mode 100644 index e15775339e..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_ChangeNotFound.htm +++ /dev/null @@ -1,5 +0,0 @@ -Change Sub Class:
-It is not possible for me to change your Sub Class, I'm afraid. Why don't you go find a Master of your Sub Class ?
-All I can do for you is to teach you something new.
- - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_Current.htm b/trunk/dist/game/data/html/villagemaster/SubClass_Current.htm deleted file mode 100644 index 09cb6faaee..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_Current.htm +++ /dev/null @@ -1,4 +0,0 @@ -Change Subclass:
-Um, I don't think so. That is your current subclass... Select another subclass.
- - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_Fail.htm b/trunk/dist/game/data/html/villagemaster/SubClass_Fail.htm deleted file mode 100644 index 92ff1bbe69..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_Fail.htm +++ /dev/null @@ -1,8 +0,0 @@ -Add Subclass:
-You aren't eligible to add a subclass at this time.
-To add a subclass, you must meet the following conditions:
-First, you must obtain Mimir's Elixir. To find out more about this quest, speak with Magister Ladd at the Ivory Tower of Oren.
-There is one important thing. You must also have completed the "Fate's Whisper" quest from Maestro Reorin, who you can find in a hut east of Oren Castle Town.
-Secondly, your current occupation must be the second or third job and all of your sub classes must be at Level 75 or above. For example, if your current subclasses are Temple Knight and Silver Ranger, both Temple Knight and Silver Ranger must have reached 75 if you are to add a third subclass.
-Thirdly, all characters are limited to three subclasses. That is, if any character has already three subclasses, he or she cannot add a new one. - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_Fail_Elves.htm b/trunk/dist/game/data/html/villagemaster/SubClass_Fail_Elves.htm deleted file mode 100644 index 12236d03ad..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_Fail_Elves.htm +++ /dev/null @@ -1,3 +0,0 @@ -Add Subclass:
-Elves and Dark Elves may not use each other's subclasses. - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_Fail_Kamael.htm b/trunk/dist/game/data/html/villagemaster/SubClass_Fail_Kamael.htm deleted file mode 100644 index 4b68148403..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_Fail_Kamael.htm +++ /dev/null @@ -1,8 +0,0 @@ -Add Sub class:
-Unfortunately, you are not eligible to discuss sub class.
-In order to add a sub class, you must meet some necessary qualifications.
-First, you should complete the "Seeds of Chaos" quest. For more information about this quest, visit Hierarch Kekropus in Kamael Village.
-You should complete the "Fate's Whisper" quest before embarking on the "Seeds of Chaos" quest, however. You can receive this quest from Maestro Reorin, who lives in a hut east of the Town of Oren.
-Second, you should have a profession for your second or third transfer, and each level of sub class should be above 75. If your profession is Berserker and you have Soultaker as sub class, for example, each of two must be above 75 in order to add a second sub class.
-Third, if you are an Arbalester, Berserker and Soul Breaker, the road to a third sub class will be open. Experience it for yourself! - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_Modify.htm b/trunk/dist/game/data/html/villagemaster/SubClass_Modify.htm deleted file mode 100644 index 972cd4580d..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_Modify.htm +++ /dev/null @@ -1,11 +0,0 @@ -Addition of a sub-class:
-Which of the following sub classes would you like to change?
-Sub-class 1
- -Sub-class 2
- -Sub-class 3
- -

-If you change a sub-class, you'll start at level 40 after the 2nd class transfer. - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice.htm b/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice.htm deleted file mode 100644 index 5d098148a1..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice.htm +++ /dev/null @@ -1,5 +0,0 @@ -Addition of a sub-class:
-Please choose a sub class to change to. If the one you are looking for is not here, please seek out the appropriate master for that class.
-Warning! All classes and skills for this class will be removed.

-%list% - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice1.htm b/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice1.htm deleted file mode 100644 index 1c5b1605a4..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice1.htm +++ /dev/null @@ -1,4 +0,0 @@ -Addition of a Sub-Class:
-Which of the following sub-classes would you like to add as your current first sub-class?
-%list% - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice2.htm b/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice2.htm deleted file mode 100644 index 4065a76324..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice2.htm +++ /dev/null @@ -1,4 +0,0 @@ -Addition of a Sub-Class:
-Which of the following sub-classes would you like to add as your current second sub-class?
-%list% - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice3.htm b/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice3.htm deleted file mode 100644 index 443b1d5388..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice3.htm +++ /dev/null @@ -1,4 +0,0 @@ -Addition of a Sub-Class:
-Which of the following sub-classes would you like to add as your current third sub-class?
-%list% - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyCustom.htm b/trunk/dist/game/data/html/villagemaster/SubClass_ModifyCustom.htm deleted file mode 100644 index 7c7f5be4d1..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyCustom.htm +++ /dev/null @@ -1,6 +0,0 @@ -Addition of a sub-class:
-Which of the following sub classes would you like to change?
-%list% -

-If you change a sub-class, you'll start at level 40 after the 2nd class transfer. - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyEmpty.htm b/trunk/dist/game/data/html/villagemaster/SubClass_ModifyEmpty.htm deleted file mode 100644 index 93d70bbff5..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyEmpty.htm +++ /dev/null @@ -1,8 +0,0 @@ -Addition of a sub-class:
-Which of the following sub classes would you like to change?
-Sub-class 1
-Sub-class 2
-Sub-class 3
-

-If you change a sub-class, you'll start at level 40 after the 2nd class transfer. - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyOk.htm b/trunk/dist/game/data/html/villagemaster/SubClass_ModifyOk.htm deleted file mode 100644 index f6c7f58f58..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_ModifyOk.htm +++ /dev/null @@ -1,3 +0,0 @@ -Change Subclass:
-You've changed subclasses. Come see me if you wish to change subclasses again. - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_NoKamael.htm b/trunk/dist/game/data/html/villagemaster/SubClass_NoKamael.htm deleted file mode 100644 index 344d7787c3..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_NoKamael.htm +++ /dev/null @@ -1,3 +0,0 @@ -Sub Class:
-Only a Kamael may learn a Kamael skill, including the one beyond racial limits. - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_NoOther.htm b/trunk/dist/game/data/html/villagemaster/SubClass_NoOther.htm deleted file mode 100644 index ed34f8e128..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_NoOther.htm +++ /dev/null @@ -1,3 +0,0 @@ -Sub Class:
-Unfortunately, Kamael cannot learn the skills of other races. You should find another teacher. - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_NoSummon.htm b/trunk/dist/game/data/html/villagemaster/SubClass_NoSummon.htm deleted file mode 100644 index c7c7b20266..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_NoSummon.htm +++ /dev/null @@ -1,3 +0,0 @@ -Add Subclass:
-That isn't possible while summoning a servitor or pet. - \ No newline at end of file diff --git a/trunk/dist/game/data/html/villagemaster/SubClass_NoTransformed.htm b/trunk/dist/game/data/html/villagemaster/SubClass_NoTransformed.htm deleted file mode 100644 index 681774aa12..0000000000 --- a/trunk/dist/game/data/html/villagemaster/SubClass_NoTransformed.htm +++ /dev/null @@ -1,3 +0,0 @@ -Sub Class:
-It is imposible to change or add a sub class while you are in a transformed state. - \ No newline at end of file diff --git a/trunk/dist/game/data/multisell/2027.xml b/trunk/dist/game/data/multisell/2027.xml new file mode 100644 index 0000000000..0dedb17c21 --- /dev/null +++ b/trunk/dist/game/data/multisell/2027.xml @@ -0,0 +1,22 @@ + + + + 33491 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/multisell/311262509.xml b/trunk/dist/game/data/multisell/311262509.xml index 699d32a282..5efceeaf3d 100644 --- a/trunk/dist/game/data/multisell/311262509.xml +++ b/trunk/dist/game/data/multisell/311262509.xml @@ -6747,4 +6747,4108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/multisell/779.xml b/trunk/dist/game/data/multisell/779.xml new file mode 100644 index 0000000000..6fb06d8516 --- /dev/null +++ b/trunk/dist/game/data/multisell/779.xml @@ -0,0 +1,8736 @@ + + + + 31126 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/multisell/857.xml b/trunk/dist/game/data/multisell/857.xml new file mode 100644 index 0000000000..b1c3589a30 --- /dev/null +++ b/trunk/dist/game/data/multisell/857.xml @@ -0,0 +1,14 @@ + + + + 33491 + + + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts.cfg b/trunk/dist/game/data/scripts.cfg index bc96ff46a8..bb03c75eff 100644 --- a/trunk/dist/game/data/scripts.cfg +++ b/trunk/dist/game/data/scripts.cfg @@ -55,6 +55,7 @@ ai/npc/Pantheon/Pantheon.java ai/npc/Proclaimer/Proclaimer.java ai/npc/Rignos/Rignos.java ai/npc/Rafforty/Rafforty.java +ai/npc/Raina/Raina.java ai/npc/RemembranceTower/RemembranceTower.java ai/npc/Scarecrow/Scarecrow.java ai/npc/Sirra/Sirra.java @@ -234,8 +235,6 @@ custom/events/TvT/TvTManager/TvTManager.java custom/events/Wedding/Wedding.java # Vehicles -vehicles/BoatTalkingGludin.java -vehicles/BoatGiranTalking.java vehicles/BoatInnadrilTour.java vehicles/BoatGludinRune.java vehicles/BoatRunePrimeval.java diff --git a/trunk/dist/game/data/scripts/ai/group_template/BeastFarm.java b/trunk/dist/game/data/scripts/ai/group_template/BeastFarm.java index f690ec3346..6f6cd60657 100644 --- a/trunk/dist/game/data/scripts/ai/group_template/BeastFarm.java +++ b/trunk/dist/game/data/scripts/ai/group_template/BeastFarm.java @@ -27,15 +27,12 @@ import quests.Q00020_BringUpWithLove.Q00020_BringUpWithLove; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.NpcData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2TamedBeastInstance; -import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.network.serverpackets.NpcInfo; @@ -254,8 +251,7 @@ public final class BeastFarm extends AbstractNpcAI // player might have and initialize the Tamed Beast. if (Util.contains(TAMED_BEASTS, nextNpcId)) { - L2NpcTemplate template = NpcData.getInstance().getTemplate(nextNpcId); - L2TamedBeastInstance nextNpc = new L2TamedBeastInstance(IdFactory.getInstance().getNextId(), template, player, food, npc.getX(), npc.getY(), npc.getZ(), true); + final L2TamedBeastInstance nextNpc = new L2TamedBeastInstance(nextNpcId, player, food, npc.getX(), npc.getY(), npc.getZ(), true); TamedBeast beast = TAMED_BEAST_DATA.get(getRandom(TAMED_BEAST_DATA.size())); String name = beast.getName(); diff --git a/trunk/dist/game/data/scripts/ai/group_template/DragonValley.java b/trunk/dist/game/data/scripts/ai/group_template/DragonValley.java index a5bebf6af9..7cac409da6 100644 --- a/trunk/dist/game/data/scripts/ai/group_template/DragonValley.java +++ b/trunk/dist/game/data/scripts/ai/group_template/DragonValley.java @@ -174,7 +174,7 @@ public final class DragonValley extends AbstractNpcAI final int rnd = getRandom(3, 5); for (int i = 0; i < rnd; i++) { - final L2Playable playable = isSummon ? attacker.getSummon() : attacker; + final L2Playable playable = isSummon ? attacker.getServitors().values().stream().findFirst().orElse(attacker.getPet()) : attacker; final L2Npc minion = addSpawn(DRAKOS_ASSASSIN, npc.getX(), npc.getY(), npc.getZ() + 10, npc.getHeading(), true, 0, true); addAttackPlayerDesire(minion, playable); } @@ -276,7 +276,7 @@ public final class DragonValley extends AbstractNpcAI if ((npc.getScriptValue() < 2) && (getRandom(100) < chance)) { int val = npc.getScriptValue(); - final L2Playable attacker = isSummon ? player.getSummon() : player; + final L2Playable attacker = isSummon ? player.getServitors().values().stream().findFirst().orElse(player.getPet()) : player; final L2Npc ghost1 = addSpawn(EXPLODING_ORC_GHOST, npc.getX(), npc.getY(), npc.getZ() + 10, npc.getHeading(), false, 0, true); ghost1.getVariables().set("playable", attacker); addAttackPlayerDesire(ghost1, attacker); diff --git a/trunk/dist/game/data/scripts/ai/group_template/FairyTrees.java b/trunk/dist/game/data/scripts/ai/group_template/FairyTrees.java index 70865ab352..80988ab1ff 100644 --- a/trunk/dist/game/data/scripts/ai/group_template/FairyTrees.java +++ b/trunk/dist/game/data/scripts/ai/group_template/FairyTrees.java @@ -63,7 +63,7 @@ public class FairyTrees extends AbstractNpcAI for (int i = 0; i < 20; i++) { final L2Npc guardian = addSpawn(SOUL_GUARDIAN, npc, false, 30000); - final L2Playable attacker = isSummon ? killer.getSummon() : killer; + final L2Playable attacker = isSummon ? killer.getServitors().values().stream().findFirst().orElse(killer.getPet()) : killer; addAttackPlayerDesire(guardian, attacker); if (getRandomBoolean()) { diff --git a/trunk/dist/game/data/scripts/ai/group_template/FeedableBeasts.java b/trunk/dist/game/data/scripts/ai/group_template/FeedableBeasts.java index 6a3fcb7f31..ba3f9e43b0 100644 --- a/trunk/dist/game/data/scripts/ai/group_template/FeedableBeasts.java +++ b/trunk/dist/game/data/scripts/ai/group_template/FeedableBeasts.java @@ -22,17 +22,15 @@ import java.util.Map; import javolution.util.FastMap; import quests.Q00020_BringUpWithLove.Q00020_BringUpWithLove; +import quests.Q00655_AGrandPlanForTamingWildBeasts.Q00655_AGrandPlanForTamingWildBeasts; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.NpcData; -import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2TamedBeastInstance; -import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.network.NpcStringId; import com.l2jserver.gameserver.network.serverpackets.NpcSay; @@ -49,10 +47,20 @@ public final class FeedableBeasts extends AbstractNpcAI private static final int SKILL_GOLDEN_SPICE = 2188; private static final int SKILL_CRYSTAL_SPICE = 2189; private static final int FOODSKILLDIFF = GOLDEN_SPICE - SKILL_GOLDEN_SPICE; + // Tamed Wild Beasts + private static final int TRAINED_BUFFALO1 = 16013; + private static final int TRAINED_BUFFALO2 = 16014; + private static final int TRAINED_COUGAR1 = 16015; + private static final int TRAINED_COUGAR2 = 16016; + private static final int TRAINED_KOOKABURRA1 = 16017; + private static final int TRAINED_KOOKABURRA2 = 16018; + // private static final int TRAINED_TINY_BABY_BUFFALO = 16020; // TODO: Implement. + // private static final int TRAINED_TINY_BABY_COUGAR = 16022; // TODO: Implement. + // private static final int TRAINED_TINY_BABY_KOOKABURRA = 16024; // TODO: Implement. // @formatter:off private static final int[] TAMED_BEASTS = { - 16013, 16014, 16015, 16016, 16017, 16018 + TRAINED_BUFFALO1, TRAINED_BUFFALO2, TRAINED_COUGAR1, TRAINED_COUGAR2, TRAINED_KOOKABURRA1, TRAINED_KOOKABURRA2 }; // all mobs that can eat... private static final int[] FEEDABLE_BEASTS = @@ -63,7 +71,7 @@ public final class FeedableBeasts extends AbstractNpcAI 21481, 21482, 21483, 21484, 21485, 21486, 21487, 21488, 21489, 21490, 21491, 21492, 21493, 21494, 21495, 21496, 21497, 21498, 21499, 21500, 21501, 21502, 21503, 21504, 21505, 21506, 21507, 21824, 21825, 21826, - 21827, 21828, 21829, 16013, 16014, 16015, 16016, 16017, 16018 + 21827, 21828, 21829, TRAINED_BUFFALO1, TRAINED_BUFFALO2, TRAINED_COUGAR1, TRAINED_COUGAR2, TRAINED_KOOKABURRA1, TRAINED_KOOKABURRA2 }; // @formatter:on @@ -186,8 +194,8 @@ public final class FeedableBeasts extends AbstractNpcAI final int[][] Kookabura_1_Gold_2 = {{ 21461, 21463 }}; final int[][] Kookabura_1_Crystal_1 = {{ 21464, 21466 }}; final int[][] Kookabura_1_Crystal_2 = {{ 21465, 21467 }}; - final int[][] Kookabura_2_1 = {{ 21468, 21824}, { 16017, 16018 }}; - final int[][] Kookabura_2_2 = {{ 21469, 21825}, { 16017, 16018 }}; + final int[][] Kookabura_2_1 = {{ 21468, 21824}, { TRAINED_KOOKABURRA1, TRAINED_KOOKABURRA2 }}; + final int[][] Kookabura_2_2 = {{ 21469, 21825}, { TRAINED_KOOKABURRA1, TRAINED_KOOKABURRA2 }}; final int[][] Buffalo_0_Gold = {{ 21471, 21472, 21473, 21474 }}; final int[][] Buffalo_0_Crystal = {{ 21475, 21476, 21477, 21478 }}; @@ -195,17 +203,17 @@ public final class FeedableBeasts extends AbstractNpcAI final int[][] Buffalo_1_Gold_2 = {{ 21481, 21482 }}; final int[][] Buffalo_1_Crystal_1 = {{ 21483, 21485 }}; final int[][] Buffalo_1_Crystal_2 = {{ 21484, 21486 }}; - final int[][] Buffalo_2_1 = {{ 21487,21826}, {16013, 16014 }}; - final int[][] Buffalo_2_2 = {{ 21488,21827}, {16013, 16014 }}; + final int[][] Buffalo_2_1 = {{ 21487, 21826}, {TRAINED_BUFFALO1, TRAINED_BUFFALO2 }}; + final int[][] Buffalo_2_2 = {{ 21488, 21827}, {TRAINED_BUFFALO1, TRAINED_BUFFALO2 }}; final int[][] Cougar_0_Gold = {{ 21490, 21491, 21492, 21493 }}; - final int[][] Cougar_0_Crystal = {{ 21494,21495, 21496, 21497 }}; + final int[][] Cougar_0_Crystal = {{ 21494, 21495, 21496, 21497 }}; final int[][] Cougar_1_Gold_1 = {{ 21498, 21500 }}; final int[][] Cougar_1_Gold_2 = {{ 21499, 21501 }}; - final int[][] Cougar_1_Crystal_1 = {{ 21502,21504 }}; - final int[][] Cougar_1_Crystal_2 = {{ 21503,21505 }}; - final int[][] Cougar_2_1 = {{ 21506, 21828 }, { 16015,16016 }}; - final int[][] Cougar_2_2 = {{ 21507, 21829 }, { 16015,16016 }}; + final int[][] Cougar_1_Crystal_1 = {{ 21502, 21504 }}; + final int[][] Cougar_1_Crystal_2 = {{ 21503, 21505 }}; + final int[][] Cougar_2_1 = {{ 21506, 21828 }, { TRAINED_COUGAR1, TRAINED_COUGAR2 }}; + final int[][] Cougar_2_2 = {{ 21507, 21829 }, { TRAINED_COUGAR1, TRAINED_COUGAR2 }}; //@formatter:on // Alpen Kookabura @@ -422,11 +430,13 @@ public final class FeedableBeasts extends AbstractNpcAI } } - L2NpcTemplate template = NpcData.getInstance().getTemplate(nextNpcId); - L2TamedBeastInstance nextNpc = new L2TamedBeastInstance(IdFactory.getInstance().getNextId(), template, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ()); + final L2TamedBeastInstance nextNpc = new L2TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ()); nextNpc.setRunning(); Q00020_BringUpWithLove.checkJewelOfInnocence(player); + // Support for A Grand Plan for Taming Wild Beasts (655) quest. + Q00655_AGrandPlanForTamingWildBeasts.reward(player, nextNpc); + // also, perform a rare random chat if (getRandom(20) == 0) { diff --git a/trunk/dist/game/data/scripts/ai/group_template/FleeMonsters.java b/trunk/dist/game/data/scripts/ai/group_template/FleeMonsters.java index 6e51a588e5..0120a01a1c 100644 --- a/trunk/dist/game/data/scripts/ai/group_template/FleeMonsters.java +++ b/trunk/dist/game/data/scripts/ai/group_template/FleeMonsters.java @@ -20,7 +20,6 @@ package ai.group_template; import ai.npc.AbstractNpcAI; -import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.model.Location; @@ -67,22 +66,14 @@ public final class FleeMonsters extends AbstractNpcAI npc.disableCoreAI(true); npc.setRunning(); - final L2Summon summon = isSummon ? attacker.getSummon() : null; + final L2Summon summon = isSummon ? attacker.getServitors().values().stream().findFirst().orElse(attacker.getPet()) : null; final ILocational attackerLoc = summon == null ? attacker : summon; final double radians = Math.toRadians(Util.calculateAngleFrom(attackerLoc, npc)); final int posX = (int) (npc.getX() + (FLEE_DISTANCE * Math.cos(radians))); final int posY = (int) (npc.getY() + (FLEE_DISTANCE * Math.sin(radians))); final int posZ = npc.getZ(); - final Location destination; - if (Config.GEODATA > 0) - { - destination = GeoData.getInstance().moveCheck(npc.getX(), npc.getY(), npc.getZ(), posX, posY, posZ, attacker.getInstanceId()); - } - else - { - destination = new Location(posX, posY, posZ); - } + final Location destination = GeoData.getInstance().moveCheck(npc.getX(), npc.getY(), npc.getZ(), posX, posY, posZ, attacker.getInstanceId()); npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, destination); return super.onAttack(npc, attacker, damage, isSummon); } diff --git a/trunk/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java b/trunk/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java index e72b350e78..ade91134f1 100644 --- a/trunk/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java +++ b/trunk/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java @@ -103,7 +103,7 @@ public final class PolymorphingOnAttack extends AbstractNpcAI } npc.deleteMe(); final L2Attackable newNpc = (L2Attackable) addSpawn(tmp.get(0), npc.getX(), npc.getY(), npc.getZ() + 10, npc.getHeading(), false, 0, true); - final L2Character originalAttacker = isSummon ? attacker.getSummon() : attacker; + final L2Character originalAttacker = isSummon ? attacker.getServitors().values().stream().findFirst().orElse(attacker.getPet()) : attacker; newNpc.setRunning(); newNpc.addDamageHate(originalAttacker, 0, 500); newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalAttacker); diff --git a/trunk/dist/game/data/scripts/ai/group_template/PrimevalIsle.java b/trunk/dist/game/data/scripts/ai/group_template/PrimevalIsle.java index 811648381e..ecc838201a 100644 --- a/trunk/dist/game/data/scripts/ai/group_template/PrimevalIsle.java +++ b/trunk/dist/game/data/scripts/ai/group_template/PrimevalIsle.java @@ -326,7 +326,7 @@ public final class PrimevalIsle extends AbstractNpcAI if ((getRandom(100) <= 80) && npc.isScriptValue(0)) { npc.setScriptValue(1); - final L2Playable playable = isSummon ? attacker.getSummon() : attacker; + final L2Playable playable = isSummon ? attacker.getServitors().values().stream().findFirst().orElse(attacker.getPet()) : attacker; for (L2Character characters : npc.getKnownList().getKnownCharactersInRadius(500)) { if ((characters != null) && (characters.isAttackable()) && (getRandomBoolean())) diff --git a/trunk/dist/game/data/scripts/ai/group_template/RangeGuard.java b/trunk/dist/game/data/scripts/ai/group_template/RangeGuard.java index 746ad5782f..79f424f19b 100644 --- a/trunk/dist/game/data/scripts/ai/group_template/RangeGuard.java +++ b/trunk/dist/game/data/scripts/ai/group_template/RangeGuard.java @@ -20,7 +20,7 @@ package ai.group_template; import ai.npc.AbstractNpcAI; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.L2Playable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -95,7 +95,7 @@ public final class RangeGuard extends AbstractNpcAI @Override public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon, Skill skill) { - final L2Playable playable = (isSummon) ? attacker.getSummon() : attacker; + final L2Playable playable = (isSummon) ? attacker.getServitors().values().stream().findFirst().orElse(attacker.getPet()) : attacker; final int longRangeGuardRate = npc.getTemplate().getParameters().getInt("LongRangeGuardRate"); final double distance = Util.calculateDistance(npc, playable, true, false); diff --git a/trunk/dist/game/data/scripts/ai/individual/Beleth.java b/trunk/dist/game/data/scripts/ai/individual/Beleth.java index d9ae7e2a01..7c830a7da1 100644 --- a/trunk/dist/game/data/scripts/ai/individual/Beleth.java +++ b/trunk/dist/game/data/scripts/ai/individual/Beleth.java @@ -27,8 +27,8 @@ import com.l2jserver.Config; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.DoorTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.DoorData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.instancemanager.GrandBossManager; import com.l2jserver.gameserver.instancemanager.ZoneManager; import com.l2jserver.gameserver.model.L2Object; @@ -109,7 +109,7 @@ public final class Beleth extends AbstractNpcAI { GrandBossManager.getInstance().setBossStatus(29118, 0); } - DoorTable.getInstance().getDoor(20240001).openMe(); + DoorData.getInstance().getDoor(20240001).openMe(); } protected static L2Npc spawn(int npcId, Location loc) @@ -143,7 +143,7 @@ public final class Beleth extends AbstractNpcAI public void run() { GrandBossManager.getInstance().setBossStatus(29118, 0); - DoorTable.getInstance().getDoor(20240001).openMe(); + DoorData.getInstance().getDoor(20240001).openMe(); } } @@ -221,7 +221,7 @@ public final class Beleth extends AbstractNpcAI ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(6), 2500); break; case 6: - L2DoorInstance door = DoorTable.getInstance().getDoor(20240001); + L2DoorInstance door = DoorData.getInstance().getDoor(20240001); door.closeMe(); ZONE.broadcastPacket(new StaticObject(door, false)); ZONE.broadcastPacket(new DoorStatusUpdate(door)); @@ -368,11 +368,11 @@ public final class Beleth extends AbstractNpcAI case 32: ZONE.broadcastPacket(new SpecialCamera(CAMERA2, 800, 180, 0, 0, 4000, 0, 10, 1, 0, 0)); ZONE.broadcastPacket(new SpecialCamera(CAMERA2, 800, 180, 0, 0, 4000, 0, 10, 1, 0, 0)); - L2DoorInstance door2 = DoorTable.getInstance().getDoor(20240002); + L2DoorInstance door2 = DoorData.getInstance().getDoor(20240002); door2.openMe(); ZONE.broadcastPacket(new StaticObject(door2, false)); ZONE.broadcastPacket(new DoorStatusUpdate(door2)); - DoorTable.getInstance().getDoor(20240003).openMe(); + DoorData.getInstance().getDoor(20240003).openMe(); ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(33), 4000); break; case 33: diff --git a/trunk/dist/game/data/scripts/ai/individual/DarkWaterDragon.java b/trunk/dist/game/data/scripts/ai/individual/DarkWaterDragon.java index 24cfb6b6b8..e2321ea920 100644 --- a/trunk/dist/game/data/scripts/ai/individual/DarkWaterDragon.java +++ b/trunk/dist/game/data/scripts/ai/individual/DarkWaterDragon.java @@ -26,7 +26,7 @@ import javolution.util.FastSet; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; @@ -153,7 +153,7 @@ public final class DarkWaterDragon extends AbstractNpcAI { MY_TRACKING_SET.add(npcObjId); // Spawn first 5 shades on first attack on Dark Water Dragon - L2Character originalAttacker = isSummon ? attacker.getSummon() : attacker; + L2Character originalAttacker = isSummon ? attacker.getServitors().values().stream().findFirst().orElse(attacker.getPet()) : attacker; spawnShade(originalAttacker, SHADE1, npc.getX() + 100, npc.getY() + 100, npc.getZ()); spawnShade(originalAttacker, SHADE2, npc.getX() + 100, npc.getY() - 100, npc.getZ()); spawnShade(originalAttacker, SHADE1, npc.getX() - 100, npc.getY() + 100, npc.getZ()); @@ -164,7 +164,7 @@ public final class DarkWaterDragon extends AbstractNpcAI { SECOND_SPAWN.add(npcObjId); // Spawn second 5 shades on half hp of on Dark Water Dragon - L2Character originalAttacker = isSummon ? attacker.getSummon() : attacker; + L2Character originalAttacker = isSummon ? attacker.getServitors().values().stream().findFirst().orElse(attacker.getPet()) : attacker; spawnShade(originalAttacker, SHADE2, npc.getX() + 100, npc.getY() + 100, npc.getZ()); spawnShade(originalAttacker, SHADE1, npc.getX() + 100, npc.getY() - 100, npc.getZ()); spawnShade(originalAttacker, SHADE2, npc.getX() - 100, npc.getY() + 100, npc.getZ()); diff --git a/trunk/dist/game/data/scripts/ai/individual/DivineBeast.java b/trunk/dist/game/data/scripts/ai/individual/DivineBeast.java index cf4921ba77..ccc97eb7cb 100644 --- a/trunk/dist/game/data/scripts/ai/individual/DivineBeast.java +++ b/trunk/dist/game/data/scripts/ai/individual/DivineBeast.java @@ -49,14 +49,14 @@ public final class DivineBeast extends AbstractNpcAI @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { - if ((player == null) || !player.hasServitor()) + if ((player == null) || !player.hasServitors()) { cancelQuestTimer(event, npc, player); } else if (player.getTransformationId() != TRANSFORMATION_ID) { cancelQuestTimer(event, npc, player); - player.getSummon().unSummon(player); + player.getServitors().values().forEach(summon -> summon.unSummon(player)); } return super.onAdvEvent(event, npc, player); diff --git a/trunk/dist/game/data/scripts/ai/individual/Orfen.java b/trunk/dist/game/data/scripts/ai/individual/Orfen.java index 47e26318de..5820b47074 100644 --- a/trunk/dist/game/data/scripts/ai/individual/Orfen.java +++ b/trunk/dist/game/data/scripts/ai/individual/Orfen.java @@ -245,7 +245,7 @@ public final class Orfen extends AbstractNpcAI { if (npc.getId() == ORFEN) { - L2Character originalCaster = isSummon ? caster.getSummon() : caster; + L2Character originalCaster = isSummon ? caster.getServitors().values().stream().findFirst().orElse(caster.getPet()) : caster; if ((skill.getEffectPoint() > 0) && (getRandom(5) == 0) && npc.isInsideRadius(originalCaster, 1000, false, false)) { NpcSay packet = new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), TEXT[getRandom(4)]); diff --git a/trunk/dist/game/data/scripts/ai/individual/QueenAnt.java b/trunk/dist/game/data/scripts/ai/individual/QueenAnt.java index a1a270f08a..fc8036dd71 100644 --- a/trunk/dist/game/data/scripts/ai/individual/QueenAnt.java +++ b/trunk/dist/game/data/scripts/ai/individual/QueenAnt.java @@ -282,7 +282,7 @@ public final class QueenAnt extends AbstractNpcAI if (isSummon) { isMage = false; - character = player.getSummon(); + character = player.getServitors().values().stream().findFirst().orElse(player.getPet()); } else { diff --git a/trunk/dist/game/data/scripts/ai/individual/SinEater.java b/trunk/dist/game/data/scripts/ai/individual/SinEater.java index 8f899cb15d..cc1121193a 100644 --- a/trunk/dist/game/data/scripts/ai/individual/SinEater.java +++ b/trunk/dist/game/data/scripts/ai/individual/SinEater.java @@ -53,12 +53,12 @@ public final class SinEater extends AbstractNpcAI @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { - if (event.equals("TALK") && (player != null) && (player.getSummon() != null)) + if (event.equals("TALK") && (player != null) && (player.getPet() != null)) { if (getRandom(100) < 30) { final int random = getRandom(100); - final L2Summon summon = player.getSummon(); + final L2Summon summon = player.getPet(); if (random < 20) { diff --git a/trunk/dist/game/data/scripts/ai/npc/Acateo/Acateo.java b/trunk/dist/game/data/scripts/ai/npc/Acateo/Acateo.java index d607e5b874..2886cc41b8 100644 --- a/trunk/dist/game/data/scripts/ai/npc/Acateo/Acateo.java +++ b/trunk/dist/game/data/scripts/ai/npc/Acateo/Acateo.java @@ -45,32 +45,22 @@ public final class Acateo extends AbstractNpcAI @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { - String htmltext = null; - switch (event) + if (event.equals("give_circlet")) { - case "give_circlet": + if (hasQuestItems(player, ACADEMY_CIRCLET)) { - if (hasQuestItems(player, ACADEMY_CIRCLET)) - { - htmltext = "33905-3.html"; - break; - } - giveItems(player, ACADEMY_CIRCLET, 1); - htmltext = "33905-2.html"; - break; + return "33905-3.html"; } + giveItems(player, ACADEMY_CIRCLET, 1); + return "33905-2.html"; } - return htmltext; + return super.onAdvEvent(event, npc, player); } @Override public String onFirstTalk(L2Npc npc, L2PcInstance player) { - if (player.isAcademyMember()) - { - return "33905-1.html"; - } - return "33905.html"; + return player.isAcademyMember() ? "33905-1.html" : "33905.html"; } public static void main(String[] args) diff --git a/trunk/dist/game/data/scripts/ai/npc/AlchemistManager/AlchemistManager.java b/trunk/dist/game/data/scripts/ai/npc/AlchemistManager/AlchemistManager.java index f3866a7b8b..f53a7641ac 100644 --- a/trunk/dist/game/data/scripts/ai/npc/AlchemistManager/AlchemistManager.java +++ b/trunk/dist/game/data/scripts/ai/npc/AlchemistManager/AlchemistManager.java @@ -22,7 +22,7 @@ import java.util.List; import ai.npc.AbstractNpcAI; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.L2Npc; diff --git a/trunk/dist/game/data/scripts/ai/npc/ArenaManager/ArenaManager.java b/trunk/dist/game/data/scripts/ai/npc/ArenaManager/ArenaManager.java index 1d099d6e4e..0a727f6df0 100644 --- a/trunk/dist/game/data/scripts/ai/npc/ArenaManager/ArenaManager.java +++ b/trunk/dist/game/data/scripts/ai/npc/ArenaManager/ArenaManager.java @@ -31,7 +31,7 @@ import com.l2jserver.gameserver.network.SystemMessageId; * Arena Manager AI. * @author St3eT */ -public class ArenaManager extends AbstractNpcAI +public final class ArenaManager extends AbstractNpcAI { // NPCs private static final int[] ARENA_MANAGER = @@ -131,11 +131,11 @@ public class ArenaManager extends AbstractNpcAI break; } } - return null; + return super.onAdvEvent(event, npc, player); } public static void main(String[] args) { new ArenaManager(); } -} +} \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/AvantGarde/AvantGarde.java b/trunk/dist/game/data/scripts/ai/npc/AvantGarde/AvantGarde.java index 8933bb01be..9a084aceb4 100644 --- a/trunk/dist/game/data/scripts/ai/npc/AvantGarde/AvantGarde.java +++ b/trunk/dist/game/data/scripts/ai/npc/AvantGarde/AvantGarde.java @@ -23,9 +23,9 @@ import java.util.List; import ai.npc.AbstractNpcAI; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SkillTreesData; import com.l2jserver.gameserver.instancemanager.QuestManager; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.L2Npc; @@ -48,7 +48,7 @@ import custom.Validators.SubClassSkills; * Transformation skill learning and transformation scroll sell. * @author Zoey76 */ -public class AvantGarde extends AbstractNpcAI +public final class AvantGarde extends AbstractNpcAI { // NPC private static final int AVANT_GARDE = 32323; diff --git a/trunk/dist/game/data/scripts/ai/npc/AwakeningMaster/AwakeningMaster.java b/trunk/dist/game/data/scripts/ai/npc/AwakeningMaster/AwakeningMaster.java index 092cbe66a1..3f599a9fe4 100644 --- a/trunk/dist/game/data/scripts/ai/npc/AwakeningMaster/AwakeningMaster.java +++ b/trunk/dist/game/data/scripts/ai/npc/AwakeningMaster/AwakeningMaster.java @@ -22,6 +22,7 @@ import quests.Q10338_SeizeYourDestiny.Q10338_SeizeYourDestiny; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.ThreadPoolManager; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.enums.CategoryType; import com.l2jserver.gameserver.enums.UserInfoType; import com.l2jserver.gameserver.model.actor.L2Npc; @@ -36,6 +37,7 @@ import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerChang import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList; import com.l2jserver.gameserver.network.serverpackets.ExChangeToAwakenedClass; import com.l2jserver.gameserver.network.serverpackets.ExShowUsm; import com.l2jserver.gameserver.network.serverpackets.SocialAction; @@ -238,45 +240,47 @@ public final class AwakeningMaster extends AbstractNpcAI int socialId = 21; // Sigel int itemId = ABELIUS_POWER; // Sigel - if (player.isInCategory(CategoryType.TYRR_CANDIDATE)) + if (player.isInCategory(CategoryType.TYRR_GROUP)) { socialId = 22; itemId = SAPYROS_POWER; } - else if (player.isInCategory(CategoryType.OTHELL_CANDIDATE)) + else if (player.isInCategory(CategoryType.OTHELL_GROUP)) { socialId = 23; itemId = ASHAGEN_POWER; } - else if (player.isInCategory(CategoryType.YUL_CANDIDATE)) + else if (player.isInCategory(CategoryType.YUL_GROUP)) { socialId = 24; itemId = CRANIGG_POWER; } - else if (player.isInCategory(CategoryType.FEOH_CANDIDATE)) + else if (player.isInCategory(CategoryType.FEOH_GROUP)) { socialId = 25; itemId = SOLTKREIG_POWER; } - else if (player.isInCategory(CategoryType.ISS_CANDIDATE)) + else if (player.isInCategory(CategoryType.ISS_GROUP)) { socialId = 26; itemId = NAVIAROPE_POWER; } - else if (player.isInCategory(CategoryType.WYNN_CANDIDATE)) + else if (player.isInCategory(CategoryType.WYNN_GROUP)) { socialId = 27; itemId = LEISTER_POWER; } - else if (player.isInCategory(CategoryType.AEORE_CANDIDATE)) + else if (player.isInCategory(CategoryType.AEORE_GROUP)) { socialId = 28; itemId = LAKCIS_POWER; } player.broadcastPacket(new SocialAction(player.getObjectId(), socialId)); - player.addItem("Awakening", itemId, 1, player, true); + giveItems(player, itemId, 1); - // TODO: Remove skill which does not level up later are removed + SkillTreesData.getInstance().cleanSkillUponAwakening(player); + player.sendPacket(new AcquireSkillList(player)); + player.sendSkillList(); } ThreadPoolManager.getInstance().scheduleGeneral(() -> diff --git a/trunk/dist/game/data/scripts/ai/npc/CastleChamberlain/CastleChamberlain.java b/trunk/dist/game/data/scripts/ai/npc/CastleChamberlain/CastleChamberlain.java index 2f67bdb7da..fd93c03412 100644 --- a/trunk/dist/game/data/scripts/ai/npc/CastleChamberlain/CastleChamberlain.java +++ b/trunk/dist/game/data/scripts/ai/npc/CastleChamberlain/CastleChamberlain.java @@ -28,8 +28,8 @@ import java.util.StringTokenizer; import ai.npc.AbstractNpcAI; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.TeleportLocationTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.TeleportLocationTable; import com.l2jserver.gameserver.enums.CastleSide; import com.l2jserver.gameserver.instancemanager.CastleManorManager; import com.l2jserver.gameserver.instancemanager.FortManager; diff --git a/trunk/dist/game/data/scripts/ai/npc/CastleCourtMagician/CastleCourtMagician.java b/trunk/dist/game/data/scripts/ai/npc/CastleCourtMagician/CastleCourtMagician.java index 4fa85e9433..a3fdb901bc 100644 --- a/trunk/dist/game/data/scripts/ai/npc/CastleCourtMagician/CastleCourtMagician.java +++ b/trunk/dist/game/data/scripts/ai/npc/CastleCourtMagician/CastleCourtMagician.java @@ -312,4 +312,4 @@ public final class CastleCourtMagician extends AbstractNpcAI { new CastleCourtMagician(); } -} \ No newline at end of file +} diff --git a/trunk/dist/game/data/scripts/ai/npc/ForgeOfTheGods/TarBeetleSpawn.java b/trunk/dist/game/data/scripts/ai/npc/ForgeOfTheGods/TarBeetleSpawn.java index e6d04596cf..c3fb73a822 100644 --- a/trunk/dist/game/data/scripts/ai/npc/ForgeOfTheGods/TarBeetleSpawn.java +++ b/trunk/dist/game/data/scripts/ai/npc/ForgeOfTheGods/TarBeetleSpawn.java @@ -30,8 +30,8 @@ import org.w3c.dom.Node; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.NpcData; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.L2Territory; import com.l2jserver.gameserver.model.Location; @@ -42,7 +42,7 @@ import com.l2jserver.util.Rnd; * Tar Beetle zone spawn * @author malyelfik */ -public class TarBeetleSpawn implements DocumentParser +public class TarBeetleSpawn implements IXmlReader { private final List zones = new ArrayList<>(); private ScheduledFuture spawnTask; diff --git a/trunk/dist/game/data/scripts/ai/npc/Mammons/31126-01.html b/trunk/dist/game/data/scripts/ai/npc/Mammons/31126-01.html index d26543e6ed..69eb005077 100644 --- a/trunk/dist/game/data/scripts/ai/npc/Mammons/31126-01.html +++ b/trunk/dist/game/data/scripts/ai/npc/Mammons/31126-01.html @@ -1,6 +1,6 @@ Blacksmith of Mammon:
- + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Mammons/Mammons.java b/trunk/dist/game/data/scripts/ai/npc/Mammons/Mammons.java index 1f3efaa54d..3d78800919 100644 --- a/trunk/dist/game/data/scripts/ai/npc/Mammons/Mammons.java +++ b/trunk/dist/game/data/scripts/ai/npc/Mammons/Mammons.java @@ -29,6 +29,8 @@ import com.l2jserver.Config; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.network.NpcStringId; +import com.l2jserver.gameserver.network.clientpackets.Say2; import com.l2jserver.gameserver.util.Broadcast; /** @@ -116,6 +118,11 @@ public final class Mammons extends AbstractNpcAI final L2Npc priest = addSpawn(MAMMONS[2], PRIEST_LOC[town]); _mammons.addAll(Arrays.asList(blacksmith, merchant, priest)); + if (blacksmith != null) + { + broadcastNpcSay(blacksmith, Say2.NPC_ALL, NpcStringId.I_HAVE_SOME_EXCELLENT_WEAPONS_TO_SHOW_YOU); + } + if (Config.ANNOUNCE_MAMMON_SPAWN) { Broadcast.toAllOnlinePlayers("Mammon's has been spawned in " + TOWN_NAME[town] + ".", false); diff --git a/trunk/dist/game/data/scripts/ai/npc/MentorGuide/MentorGuide.java b/trunk/dist/game/data/scripts/ai/npc/MentorGuide/MentorGuide.java index e536d0303d..d998e932da 100644 --- a/trunk/dist/game/data/scripts/ai/npc/MentorGuide/MentorGuide.java +++ b/trunk/dist/game/data/scripts/ai/npc/MentorGuide/MentorGuide.java @@ -29,7 +29,7 @@ import org.w3c.dom.Node; import ai.npc.AbstractNpcAI; import com.l2jserver.Config; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.enums.CategoryType; import com.l2jserver.gameserver.enums.MailType; import com.l2jserver.gameserver.instancemanager.MailManager; @@ -62,21 +62,18 @@ import com.l2jserver.gameserver.util.Util; * Mentor Guide. * @author Gnacik, UnAfraid */ -public class MentorGuide extends AbstractNpcAI implements DocumentParser +public class MentorGuide extends AbstractNpcAI implements IXmlReader { // NPCs private static final int MENTOR_GUIDE = 33587; - // ITEMs + // Items private static final int MENTEE_CERT = 33800; private static final int MENTEE_MARK = 33804; private static final int MENTEE_HEADPHONE = 34759; private static final int DIPLOMA = 33805; - // Misc - private static final int MAX_LEVEL = 85; - - // SKILLs + // Skills private final static SkillHolder[] MENTEE_BUFFS = { new SkillHolder(9227, 1), // Mentor's Poem of Horn @@ -95,19 +92,21 @@ public class MentorGuide extends AbstractNpcAI implements DocumentParser private static final SkillHolder MENTEE_MENTOR_SUMMON = new SkillHolder(9379, 1); // Mentee's Mentor Summon + // Misc + private static final int MAX_LEVEL = 85; private static final String LEVEL_UP_TITLE = "Mentee coin from Mentee leveling"; private static final String LEVEL_UP_BODY = "Your mentee %s has reached level %d, so you are receiving some Mentee Coin. After Mentee Coin has successfully been removed and placed into your inventory please be sure to delete this letter. If your mailbox is full when any future letters are sent to you cannot be delivered and you will not receive these items."; - private static final String MENTEE_ADDED_TITLE = "Congratulations on becoming a mentee."; private static final String MENTEE_ADDED_BODY = "Greetings. This is the Mentor Guide.\n\nYou will experience a world of unlimited adventures with your mentor, Exciting, isn't it?\n\nWhen you graduate from mentee status (upon awakening at level 85), you will receive a Mentee Certificate. If you bring it to me, I will give you a Diploma that you can exchange for R-grade equipment."; - + private static final String MENTEE_GRADUATE_TITLE = "Congratulations on your graduation"; + private static final String MENTEE_GRADUATE_BODY = "Greetings! This is the Mentor Guide.\nCongratulations! Did you enjoy the time with a mentor? Here is a Mentee Certificate for graduating.\n\nFind me in town, and I'll give you a Diploma if you show me your Mentee Certificatee. You'll also get a small graduation gift!\n\nNow, on to your next Adventure!"; static final Map MENTEE_COINS = new HashMap<>(); @Override public void load() { parseDatapackFile("config/MentorCoins.xml"); - LOGGER.log(Level.INFO, MentorGuide.class.getSimpleName() + ": Loaded: " + MENTEE_COINS.size() + " mentee coins"); + LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + MENTEE_COINS.size() + " mentee coins"); } @Override @@ -137,6 +136,8 @@ public class MentorGuide extends AbstractNpcAI implements DocumentParser addFirstTalkId(MENTOR_GUIDE); addStartNpc(MENTOR_GUIDE); addTalkId(MENTOR_GUIDE); + + load(); } @Override @@ -420,8 +421,7 @@ public class MentorGuide extends AbstractNpcAI implements DocumentParser player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOUR_MENTOR_MENTEE_RELATIONSHIP_WITH_YOUR_MENTOR_S1_HAS_ENDED_AS_YOU_ARE_AN_AWAKENED_CHARACTER_OF_LV_85_OR_ABOVE_YOU_CAN_NO_LONGER_BE_PAIRED_WITH_A_MENTOR).addPcName(player)); - // TODO: Find correct message! - sendMail(player, MENTEE_ADDED_TITLE, MENTEE_ADDED_BODY, MENTEE_CERT, 1); + sendMail(player, MENTEE_GRADUATE_TITLE, MENTEE_GRADUATE_BODY, MENTEE_CERT, 1); } } diff --git a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880-1.html b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880-1.html index 353c81b97c..772464a3af 100644 --- a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880-1.html +++ b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880-1.html @@ -1,12 +1,8 @@ - - - - Monk of Chaos:
- The skills that were once given to each race to balance their power have been taken back. Through the will of Chaos, you can learn the skills of other races as long as you have a Chaos Pomander.
- Chaos Pomander is a crystal of power that can combine anything. If you have one, you have been selected by my master to work for a balanced world.
- Are you ready for that world? If so, select the Revelation of Chaos, and through it a power appropriate for you.
-
-
-
- - \ No newline at end of file +Monk of Chaos:
+The skills that were once given to each race to balance their power have been taken back. Through the will of Chaos, you can learn the skills of other races as long as you have a Chaos Pomander.
+Chaos Pomander is a crystal of power that can combine anything. If you have one, you have been selected by my master to work for a balanced world.
+Are you ready for that world? If so, select the Revelation of Chaos, and through it a power appropriate for you.
+
+
+
+ \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880-2.html b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880-2.html index 721bb1cb7e..62ef8722ab 100644 --- a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880-2.html +++ b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880-2.html @@ -1,10 +1,6 @@ - - - - Monk of Chaos:
- We, the Monks of Chaos, serve the balance.
- You may think chaos is a destructive force, but nothing could be further from the truth. - Chaos seeks to balance light and darkness by reverting them to the original energies.
- We who respect his will are the only ones truly free to act on it. - - \ No newline at end of file +Monk of Chaos:
+We, the Monks of Chaos, serve the balance.
+You may think chaos is a destructive force, but nothing could be further from the truth. +Chaos seeks to balance light and darkness by reverting them to the original energies.
+We who respect his will are the only ones truly free to act on it. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880.html b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880.html index d802811e59..68179898e2 100644 --- a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880.html +++ b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/33880.html @@ -1,8 +1,6 @@ - - - Monk of Chaos:
- Nothing could be created or destroyed without chaos. It is the beginning and the end of all things.
- We, the Monks of Chaos, understand this. It is the law of the universe.
- If you wish, we will reveal our master's will to you.
- - \ No newline at end of file +Monk of Chaos:
+Nothing could be created or destroyed without chaos. It is the beginning and the end of all things.
+We, the Monks of Chaos, understand this. It is the law of the universe.
+If you wish, we will reveal our master's will to you.
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/MonkOfChaos.java b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/MonkOfChaos.java index 0d1417c854..a62a93f7c1 100644 --- a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/MonkOfChaos.java +++ b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/MonkOfChaos.java @@ -22,8 +22,8 @@ import java.util.List; import ai.npc.AbstractNpcAI; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SkillTreesData; import com.l2jserver.gameserver.enums.CategoryType; import com.l2jserver.gameserver.enums.SubclassType; import com.l2jserver.gameserver.model.L2SkillLearn; @@ -35,9 +35,10 @@ import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.ExAcquirableSkillListByClass; /** + * Monk of Chaos AI. * @author Sdw */ -public class MonkOfChaos extends AbstractNpcAI +public final class MonkOfChaos extends AbstractNpcAI { private static final int MONK_OF_CHAOS = 33880; private static final int MIN_LEVEL = 85; @@ -177,4 +178,4 @@ public class MonkOfChaos extends AbstractNpcAI { new MonkOfChaos(); } -} +} \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/canceled.html b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/canceled.html index cda19da8ff..3640e6bcb7 100644 --- a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/canceled.html +++ b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/canceled.html @@ -1,7 +1,3 @@ - - - - Monk of Chaos:
- Heh! The Revelation of Chaos has been canceled. But you can pass it again when you come back to your senses. - - \ No newline at end of file +Monk of Chaos:
+Heh! The Revelation of Chaos has been canceled. But you can pass it again when you come back to your senses. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-adena.html b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-adena.html index de9b0e2d10..e2ce65de2c 100644 --- a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-adena.html +++ b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-adena.html @@ -1,8 +1,4 @@ - - - - Monk of Chaos:
- You do not have enough Adena to cancel the Revelation of Chaos.
- Come back another time. - - \ No newline at end of file +Monk of Chaos:
+You do not have enough Adena to cancel the Revelation of Chaos.
+Come back another time. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-cancel.html b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-cancel.html index f39b2e53f8..d7bb8b688e 100644 --- a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-cancel.html +++ b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-cancel.html @@ -1,8 +1,4 @@ - - - - Monk of Chaos:
- You cannot cancel the Revelation of Chaos, because you have not passed it.
- Come back another time. - - \ No newline at end of file +Monk of Chaos:
+You cannot cancel the Revelation of Chaos, because you have not passed it.
+Come back another time. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-learn.html b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-learn.html index abfc2e138a..a1c50c50b4 100644 --- a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-learn.html +++ b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-learn.html @@ -1,9 +1,5 @@ - - - - Monk of Chaos:
- You are not strong enough to fulfill the Revelation of Chaos.
- Come back another time.
- (Available only to Awaken characters level 85 or above.) - - \ No newline at end of file +Monk of Chaos:
+You are not strong enough to fulfill the Revelation of Chaos.
+Come back another time.
+(Available only to Awaken characters level 85 or above.) + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-subclass.html b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-subclass.html index a17db1d790..4d4cd4808d 100644 --- a/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-subclass.html +++ b/trunk/dist/game/data/scripts/ai/npc/MonkOfChaos/no-subclass.html @@ -1,9 +1,5 @@ - - - - Monk of Chaos:
- The skills that weYou are not strong enough to fulfill the Revelation of Chaos.
- Come back another time.
- (Not available on subclasses.) - - \ No newline at end of file +Monk of Chaos:
+The skills that weYou are not strong enough to fulfill the Revelation of Chaos.
+Come back another time.
+(Not available on subclasses.) + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.java b/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.java index 1aba3025e8..c35a2a4480 100644 --- a/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.java +++ b/trunk/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.java @@ -28,13 +28,13 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.StatsSet; /** * @author UnAfraid */ -public class NpcBuffersData implements DocumentParser +public class NpcBuffersData implements IXmlReader { private final Map _npcBuffers = new HashMap<>(); diff --git a/trunk/dist/game/data/scripts/ai/npc/Proclaimer/Proclaimer.java b/trunk/dist/game/data/scripts/ai/npc/Proclaimer/Proclaimer.java index 66a2f6e417..f1f3bd578a 100644 --- a/trunk/dist/game/data/scripts/ai/npc/Proclaimer/Proclaimer.java +++ b/trunk/dist/game/data/scripts/ai/npc/Proclaimer/Proclaimer.java @@ -65,7 +65,7 @@ public final class Proclaimer extends AbstractNpcAI String htmltext = null; if (!player.isOnDarkSide()) { - player.sendPacket(new NpcSay(npc.getObjectId(), Say2.TELL, npc.getId(), NpcStringId.WHEN_THE_WORLD_PLUNGES_INTO_CHAOS_WE_WILL_NEED_YOUR_HELP_WE_HOPE_YOU_JOIN_US_WHEN_THE_TIME_COMES)); + player.sendPacket(new NpcSay(npc.getObjectId(), Say2.NPC_TELL, npc.getId(), NpcStringId.WHEN_THE_WORLD_PLUNGES_INTO_CHAOS_WE_WILL_NEED_YOUR_HELP_WE_HOPE_YOU_JOIN_US_WHEN_THE_TIME_COMES)); final L2Clan ownerClan = npc.getCastle().getOwner(); if (ownerClan != null) diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/33491-01.html b/trunk/dist/game/data/scripts/ai/npc/Raina/33491-01.html new file mode 100644 index 0000000000..949e7ecbc2 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/33491-01.html @@ -0,0 +1,9 @@ +Subclass/Dual Class Master Raina:
+So you need to create/reset a subclass?
+A new class subclass starts at level 40.
+

+(Change dual classes and your level will be reset to level 40.)
+

+Maintain your level while changing classes.
+
+ \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/33491-02.html b/trunk/dist/game/data/scripts/ai/npc/Raina/33491-02.html new file mode 100644 index 0000000000..3cf5b22ae4 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/33491-02.html @@ -0,0 +1,7 @@ +Subclass/Dual Class Master Raina:
+I heard that Ertheia are curious people. But a gem that absorbs power... I still can't help thinking that it's really dangerous. You could have died.
+But thanks to your efforts, even Ertheia can use the power of the giants now.
+But because you're different than the race from the Material Realm, your power will not merge with the giants'. Because they do not mingle, you will not be able to use your power while using the giants' power. Of course, you can use your original power instead of the giants' power anytime you wish.
+Now! Would you like to use the power of the giants?
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/33491-03.html b/trunk/dist/game/data/scripts/ai/npc/Raina/33491-03.html new file mode 100644 index 0000000000..d059d2a471 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/33491-03.html @@ -0,0 +1,7 @@ +Subclass/Dual Class Master Raina:
+Hello! +I will be assisting you with reawakening an Awakened dual class. +To reawaken a dual class, you need to have an Awakened dual class. After reawakening, your level will be reduced to level 85, and all the skills you've learned will be forgotten.
+(Change dual classes and your level will be reset to level 85).
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/33491-04.html b/trunk/dist/game/data/scripts/ai/npc/Raina/33491-04.html new file mode 100644 index 0000000000..52a8dc130b --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/33491-04.html @@ -0,0 +1,6 @@ +Subclass/Dual Class Master Raina:
+So you want to know about items designated for a dual class? +They're for those who grow their dual class powers beyond imaginable limits. +You can purchase as many as you want, but you have to be at certain level with your main and dual classes in order to use them.
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/33491-05.html b/trunk/dist/game/data/scripts/ai/npc/Raina/33491-05.html new file mode 100644 index 0000000000..6400845fe4 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/33491-05.html @@ -0,0 +1,6 @@ + Subclass/Dual Class Master Raina:

+Hello!
+I'm collecting XP Bottles.
+I'll give you items if you bring me XP Bottles, how's that?
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/33491.html b/trunk/dist/game/data/scripts/ai/npc/Raina/33491.html new file mode 100644 index 0000000000..8790c1f294 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/33491.html @@ -0,0 +1,10 @@ +Subclass/Dual Class Master Raina:
+Hello! +You have a question about subclass or dual class?
+ + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/Raina.java b/trunk/dist/game/data/scripts/ai/npc/Raina/Raina.java new file mode 100644 index 0000000000..3e8b117c39 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/Raina.java @@ -0,0 +1,866 @@ +/* + * Copyright (C) 2004-2015 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package ai.npc.Raina; + +import static com.l2jserver.gameserver.model.base.ClassLevel.THIRD; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumMap; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; + +import ai.npc.AbstractNpcAI; + +import com.l2jserver.Config; +import com.l2jserver.gameserver.cache.HtmCache; +import com.l2jserver.gameserver.data.xml.impl.CategoryData; +import com.l2jserver.gameserver.data.xml.impl.ClassListData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; +import com.l2jserver.gameserver.enums.CategoryType; +import com.l2jserver.gameserver.enums.Race; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.base.ClassId; +import com.l2jserver.gameserver.model.base.ClassLevel; +import com.l2jserver.gameserver.model.base.PlayerClass; +import com.l2jserver.gameserver.model.base.SubClass; +import com.l2jserver.gameserver.model.events.EventType; +import com.l2jserver.gameserver.model.events.ListenerRegisterType; +import com.l2jserver.gameserver.model.events.annotations.Id; +import com.l2jserver.gameserver.model.events.annotations.RegisterEvent; +import com.l2jserver.gameserver.model.events.annotations.RegisterType; +import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcMenuSelect; +import com.l2jserver.gameserver.model.quest.QuestState; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList; +import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; + +/** + * Raina AI. + * @author St3eT + */ +public final class Raina extends AbstractNpcAI +{ + // NPC + private static final int RAINA = 33491; + // Items + private static final int SUBCLASS_CERTIFICATE = 30433; + private final static int ABELIUS_POWER = 32264; + private final static int SAPYROS_POWER = 32265; + private final static int ASHAGEN_POWER = 32266; + private final static int CRANIGG_POWER = 32267; + private final static int SOLTKREIG_POWER = 32268; + private final static int NAVIAROPE_POWER = 32269; + private final static int LEISTER_POWER = 32270; + private final static int LAKCIS_POWER = 32271; + // Misc + private static final Set mainSubclassSet; + private static final Set neverSubclassed = EnumSet.of(PlayerClass.Overlord, PlayerClass.Warsmith); + private static final Set subclasseSet1 = EnumSet.of(PlayerClass.DarkAvenger, PlayerClass.Paladin, PlayerClass.TempleKnight, PlayerClass.ShillienKnight); + private static final Set subclasseSet2 = EnumSet.of(PlayerClass.TreasureHunter, PlayerClass.AbyssWalker, PlayerClass.Plainswalker); + private static final Set subclasseSet3 = EnumSet.of(PlayerClass.Hawkeye, PlayerClass.SilverRanger, PlayerClass.PhantomRanger); + private static final Set subclasseSet4 = EnumSet.of(PlayerClass.Warlock, PlayerClass.ElementalSummoner, PlayerClass.PhantomSummoner); + private static final Set subclasseSet5 = EnumSet.of(PlayerClass.Sorceror, PlayerClass.Spellsinger, PlayerClass.Spellhowler); + private static final EnumMap> subclassSetMap = new EnumMap<>(PlayerClass.class); + static + { + final Set subclasses = PlayerClass.getSet(null, THIRD); + subclasses.removeAll(neverSubclassed); + mainSubclassSet = subclasses; + subclassSetMap.put(PlayerClass.DarkAvenger, subclasseSet1); + subclassSetMap.put(PlayerClass.Paladin, subclasseSet1); + subclassSetMap.put(PlayerClass.TempleKnight, subclasseSet1); + subclassSetMap.put(PlayerClass.ShillienKnight, subclasseSet1); + subclassSetMap.put(PlayerClass.TreasureHunter, subclasseSet2); + subclassSetMap.put(PlayerClass.AbyssWalker, subclasseSet2); + subclassSetMap.put(PlayerClass.Plainswalker, subclasseSet2); + subclassSetMap.put(PlayerClass.Hawkeye, subclasseSet3); + subclassSetMap.put(PlayerClass.SilverRanger, subclasseSet3); + subclassSetMap.put(PlayerClass.PhantomRanger, subclasseSet3); + subclassSetMap.put(PlayerClass.Warlock, subclasseSet4); + subclassSetMap.put(PlayerClass.ElementalSummoner, subclasseSet4); + subclassSetMap.put(PlayerClass.PhantomSummoner, subclasseSet4); + subclassSetMap.put(PlayerClass.Sorceror, subclasseSet5); + subclassSetMap.put(PlayerClass.Spellsinger, subclasseSet5); + subclassSetMap.put(PlayerClass.Spellhowler, subclasseSet5); + } + private static final Map classCloak = new HashMap<>(); + { + classCloak.put(CategoryType.SIGEL_GROUP, 30310); // Abelius Cloak + classCloak.put(CategoryType.TYRR_GROUP, 30311); // Sapyros Cloak Grade + classCloak.put(CategoryType.OTHELL_GROUP, 30312); // Ashagen Cloak Grade + classCloak.put(CategoryType.YUL_GROUP, 30313); // Cranigg Cloak Grade + classCloak.put(CategoryType.FEOH_GROUP, 30314); // Soltkreig Cloak Grade + classCloak.put(CategoryType.ISS_GROUP, 30315); // Naviarope Cloak Grade + classCloak.put(CategoryType.WYNN_GROUP, 30316); // Leister Cloak Grade + classCloak.put(CategoryType.AEORE_GROUP, 30317); // Laksis Cloak Grade + } + private static final List dualClassList = new ArrayList<>(); + { + dualClassList.addAll(Arrays.asList(PlayerClass.sigelPhoenixKnight, PlayerClass.sigelHellKnight, PlayerClass.sigelEvasTemplar, PlayerClass.sigelShilenTemplar)); + dualClassList.addAll(Arrays.asList(PlayerClass.tyrrDuelist, PlayerClass.tyrrDreadnought, PlayerClass.tyrrTitan, PlayerClass.tyrrGrandKhavatari, PlayerClass.tyrrDoombringer)); + dualClassList.addAll(Arrays.asList(PlayerClass.othellAdventurer, PlayerClass.othellWindRider, PlayerClass.othellGhostHunter, PlayerClass.othellFortuneSeeker)); + dualClassList.addAll(Arrays.asList(PlayerClass.yulSagittarius, PlayerClass.yulMoonlightSentinel, PlayerClass.yulGhostSentinel, PlayerClass.yulTrickster)); + dualClassList.addAll(Arrays.asList(PlayerClass.feohArchmage, PlayerClass.feohSoultaker, PlayerClass.feohMysticMuse, PlayerClass.feoStormScreamer, PlayerClass.feohSoulHound)); + dualClassList.addAll(Arrays.asList(PlayerClass.issHierophant, PlayerClass.issSwordMuse, PlayerClass.issSpectralDancer, PlayerClass.issDoomcryer)); + dualClassList.addAll(Arrays.asList(PlayerClass.wynnArcanaLord, PlayerClass.wynnElementalMaster, PlayerClass.wynnSpectralMaster)); + dualClassList.addAll(Arrays.asList(PlayerClass.aeoreCardinal, PlayerClass.aeoreEvaSaint, PlayerClass.aeoreShillienSaint)); + } + // @formatter:off + private static final int[] REAWAKEN_PRICE = + { + 100_000_000, 90_000_000, 80_000_000, 70_000_000, 60_000_000, 50_000_000, 40_000_000, 30_000_000, 20_000_000, 10_000_000 + }; + // @formatter:on + + private Raina() + { + super(Raina.class.getSimpleName(), "ai/npc"); + addStartNpc(RAINA); + addFirstTalkId(RAINA); + addTalkId(RAINA); + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + String htmltext = null; + switch (event) + { + case "33491-01.html": + case "33491-02.html": + case "33491-03.html": + case "33491-04.html": + case "reawakenCancel.html": + { + htmltext = event; + break; + } + case "addSubclass": + { + if (player.isTransformed()) + { + htmltext = "noTransform.html"; + break; + } + else if (player.hasSummon()) + { + htmltext = "noSummon.html"; + break; + } + else if (player.getRace() == Race.ERTHEIA) + { + htmltext = "noErtheia.html"; + break; + } + else if (!haveDoneQuest(player) && Config.ALT_GAME_SUBCLASS_WITHOUT_QUESTS && !player.isGM()) + { + htmltext = "noQuest.html"; + break; + } + else if (!hasAllSubclassLeveled(player) || (player.getTotalSubClasses() >= Config.MAX_SUBCLASS)) + { + htmltext = "addFailed.html"; + break; + } + else if (!player.isInventoryUnder90(true) || (player.getWeightPenalty() >= 2)) + { + htmltext = "inventoryLimit.html"; + break; + } + + final Set availSubs = getAvailableSubClasses(player); + final StringBuilder sb = new StringBuilder(); + final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "subclassList.html"); + + if ((availSubs == null) || availSubs.isEmpty()) + { + break; + } + + for (PlayerClass subClass : availSubs) + { + if (subClass != null) + { + final int classId = subClass.ordinal(); + final int npcStringId = 11170000 + classId; + sb.append("" + npcStringId + ""); + } + } + html.replace("%subclassList%", sb.toString()); + player.sendPacket(html); + break; + } + case "removeSubclass": + { + if (player.isTransformed()) + { + htmltext = "noTransform.html"; + break; + } + else if (player.hasSummon()) + { + htmltext = "noSummon.html"; + break; + } + else if (player.getRace() == Race.ERTHEIA) + { + htmltext = "noErtheia.html"; + break; + } + else if (!player.isInventoryUnder90(true) || (player.getWeightPenalty() >= 2)) + { + htmltext = "inventoryLimit.html"; + break; + } + else if (player.getSubClasses().isEmpty()) + { + htmltext = "noSubChange.html"; + break; + } + + final StringBuilder sb = new StringBuilder(); + final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "subclassRemoveList.html"); + + for (SubClass subClass : player.getSubClasses().values()) + { + if (subClass != null) + { + final int classId = subClass.getClassId(); + final int npcStringId = 11170000 + classId; + sb.append("" + npcStringId + ""); + } + } + html.replace("%removeList%", sb.toString()); + player.sendPacket(html); + break; + } + case "changeSubclass": + { + if (player.isTransformed()) + { + htmltext = "noTransform.html"; + break; + } + else if (player.hasSummon()) + { + htmltext = "noSummon.html"; + break; + } + else if (player.getRace() == Race.ERTHEIA) + { + htmltext = "noErtheia.html"; + break; + } + else if (player.getSubClasses().isEmpty()) + { + htmltext = "noSubChange.html"; + break; + } + else if (!hasQuestItems(player, SUBCLASS_CERTIFICATE)) + { + htmltext = "noCertificate.html"; + break; + } + + player.sendMessage("Not done yet."); + break; + } + case "ertheiaDualClass": + { + if ((player.getRace() != Race.ERTHEIA) || (player.getLevel() < 85) || player.hasDualClass()) + { + htmltext = "addDualClassErtheiaFailed.html"; + break; + } + htmltext = "addDualClassErtheia.html"; + break; + } + case "addDualClass_SIGEL_GROUP": + case "addDualClass_TYRR_GROUP": + case "addDualClass_OTHELL_GROUP": + case "addDualClass_YUL_GROUP": + case "addDualClass_FEOH_GROUP": + case "addDualClass_ISS_GROUP": + case "addDualClass_WYNN_GROUP": + case "addDualClass_AEORE_GROUP": + { + final CategoryType cType = CategoryType.valueOf(event.replace("addDualClass_", "")); + + if (cType == null) + { + _log.log(Level.WARNING, getClass().getSimpleName() + ": Cannot parse CategoryType, event: " + event); + } + + final StringBuilder sb = new StringBuilder(); + final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addDualClassErtheiaList.html"); + + for (PlayerClass dualClasses : getDualClasses(player, cType)) + { + if (dualClasses != null) + { + sb.append(" + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheiaFailed.html b/trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheiaFailed.html new file mode 100644 index 0000000000..d607869163 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheiaFailed.html @@ -0,0 +1,5 @@ +Subclass/Dual Class Master Raina:

+You do not meet the conditions to add a dual class.
+Come back when you're ready, or ask for something else.
+(Only Ertheia characters Lv. 85 or above may add a dual class once.) + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheiaList.html b/trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheiaList.html new file mode 100644 index 0000000000..895130b368 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheiaList.html @@ -0,0 +1,9 @@ + + + +




+These are the classes available to you. +You must choose which you want to be.

+%dualclassList% +
+ \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/addFailed.html b/trunk/dist/game/data/scripts/ai/npc/Raina/addFailed.html new file mode 100644 index 0000000000..e0800dbefa --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/addFailed.html @@ -0,0 +1,8 @@ +Subclass/Dual Class Master Raina:

+Sorry, but you're not qualified to add a subclass. +To add a new subclass, you need the following qualifications:
+First, you've completed the 'Red Thread of Fate' quest. If you want to get on that, let me know.
+Second, your current class has done the 2nd class transfer, and all your subclass levels are 75 or higher. For example, if your subclasses are Temple Knight and Silver Ranger, they must both be level 75 for you to add a third subclass.
+Third, you may only have up to 3 subclasses, I'm afraid.
+Got it? + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/addSuccess.html b/trunk/dist/game/data/scripts/ai/npc/Raina/addSuccess.html new file mode 100644 index 0000000000..83e62d3924 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/addSuccess.html @@ -0,0 +1,5 @@ +Subclass/Dual Class Master Raina:

+Congratulations!
+Your new subclass has been added.
+I look forward to your future endeavors with your new subclass!
+ \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/inventoryLimit.html b/trunk/dist/game/data/scripts/ai/npc/Raina/inventoryLimit.html new file mode 100644 index 0000000000..e916672f48 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/inventoryLimit.html @@ -0,0 +1,3 @@ +Subclass/Dual Class Master Raina:

+You need inventory space and free weight to create or renew a subclass. Go free up your weight and inventory to less than 80%, and I'll see what I can do. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/noCertificate.html b/trunk/dist/game/data/scripts/ai/npc/Raina/noCertificate.html new file mode 100644 index 0000000000..6b61fbd6f4 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/noCertificate.html @@ -0,0 +1,5 @@ +Subclass/Dual Class Master Raina:

+You need a Subclass Change Certificate in order to receive the power of the gods. This was given to heroes long before Shilen's destructive rampages came about, so you can't find new ones anymore.
+But if you have the certificate, talk to me again as a subclass ready to receive the power of the gods.
+But a dual class isn't ready to receive the power of the gods, so I can't change classes for that. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/noErtheia.html b/trunk/dist/game/data/scripts/ai/npc/Raina/noErtheia.html new file mode 100644 index 0000000000..c633be7ce2 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/noErtheia.html @@ -0,0 +1,4 @@ +Subclass/Dual Class Master Raina:

+Ertheia cannot add or modify subclasses.
+Please talk to me when you're ready to add a dual class. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/noQuest.html b/trunk/dist/game/data/scripts/ai/npc/Raina/noQuest.html new file mode 100644 index 0000000000..8a7d365b9d --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/noQuest.html @@ -0,0 +1,4 @@ +Subclass/Dual Class Master Raina:

+You haven't completed the 'Red Thread of Fate' quest yet.
+To create a subclass, you have to complete the 'Red Thread of Fate' quest. If you want to work on the quest, let me know. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/noSubChange.html b/trunk/dist/game/data/scripts/ai/npc/Raina/noSubChange.html new file mode 100644 index 0000000000..ef43d3f698 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/noSubChange.html @@ -0,0 +1,4 @@ +Subclass/Dual Class Master Raina:

+You don't have a subclass to change.
+Make a subclass. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/noSummon.html b/trunk/dist/game/data/scripts/ai/npc/Raina/noSummon.html new file mode 100644 index 0000000000..77f6267099 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/noSummon.html @@ -0,0 +1,4 @@ +Subclass/Dual Class Master Raina:

+You cannot create a new subclass
+when there is a pet or servitor. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/noTransform.html b/trunk/dist/game/data/scripts/ai/npc/Raina/noTransform.html new file mode 100644 index 0000000000..94531460c1 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/noTransform.html @@ -0,0 +1,4 @@ +Subclass/Dual Class Master Raina:

+I cannot create a new subclass while you're transformed.
+Change back to your original form, then talk to me again. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/onlyErtheia.html b/trunk/dist/game/data/scripts/ai/npc/Raina/onlyErtheia.html new file mode 100644 index 0000000000..d607869163 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/onlyErtheia.html @@ -0,0 +1,5 @@ +Subclass/Dual Class Master Raina:

+You do not meet the conditions to add a dual class.
+Come back when you're ready, or ask for something else.
+(Only Ertheia characters Lv. 85 or above may add a dual class once.) + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/reawaken.html b/trunk/dist/game/data/scripts/ai/npc/Raina/reawaken.html new file mode 100644 index 0000000000..996e8ff8cb --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/reawaken.html @@ -0,0 +1,10 @@ +Subclass/Dual Class Master Raina:

+In order to reawaken your dual class,
+you need the cloak you received when you first awakened it,
+and some %price% Adena
to pay the fee.
+Upon reawakening, zou will lose zour current
+abilities, but gain new powers is exchange. You will be reducted to level 85, and all your skills will be reset. You can choose the class you want, but you cannot receive powers from the same class as your main class.
+(After reawakening, the 3rd skills provided will be based on human classes.)
+ + + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenCancel.html b/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenCancel.html new file mode 100644 index 0000000000..a2cd5749a4 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenCancel.html @@ -0,0 +1,5 @@ +Subclass/Dual Class Master Raina:

+I see.
+Make a carful decision because you will lose the power you have, to get new power.
+When you make up your mind, come back to me. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenClassList.html b/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenClassList.html new file mode 100644 index 0000000000..895130b368 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenClassList.html @@ -0,0 +1,9 @@ + + + +




+These are the classes available to you. +You must choose which you want to be.

+%dualclassList% +
+ \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenList.html b/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenList.html new file mode 100644 index 0000000000..1caf321c14 --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenList.html @@ -0,0 +1,12 @@ +Subclass/Dual Class Master Raina:

+So, into which class would you like to Reawaken?
+Remember that if you proceed, you will go back to Lv. 85, and all your skills will be reset.
+ + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenNoDual.html b/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenNoDual.html new file mode 100644 index 0000000000..3c54424a2a --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenNoDual.html @@ -0,0 +1,6 @@ +Subclass/Dual Class Master Raina:

+You don't look like a Awakened dual class.
+If you want to Reawaken, you must be an Awakened dual class.
+Please come find me when you have Awakened as a dual class.

+(You can become a specialized Awakened class through Hardin or the Giant's stone statue at the Reliquary of the Giants.) + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenNoFee.html b/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenNoFee.html new file mode 100644 index 0000000000..b479729d6a --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/reawakenNoFee.html @@ -0,0 +1,6 @@ +Subclass/Dual Class Master Raina:

+To change your dual class,
+you need the cloak you received when you awakened your dual class,
+and %price% Adena
for a fee.
+Please come back with everything you need. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/removeSubclassList.html b/trunk/dist/game/data/scripts/ai/npc/Raina/removeSubclassList.html new file mode 100644 index 0000000000..12ed66f23b --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/removeSubclassList.html @@ -0,0 +1,7 @@ +Subclass/Dual Class Master Raina:

+Which subclass would you like to change to?
+Please select a subclass from the list below.
+The new subclas will be a level 40, 2nd-transfer class with none of the skill enchants or the skills you learned through codices. Think carefully.
+Also, dual classes can't be reset.
+%subclassList% + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/subclassList.html b/trunk/dist/game/data/scripts/ai/npc/Raina/subclassList.html new file mode 100644 index 0000000000..1a5618bd9d --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/subclassList.html @@ -0,0 +1,4 @@ +Subclass/Dual Class Master Raina:

+Select a Subclass.

+%subclassList% + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/subclassRemoveList.html b/trunk/dist/game/data/scripts/ai/npc/Raina/subclassRemoveList.html new file mode 100644 index 0000000000..ea9880971e --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/npc/Raina/subclassRemoveList.html @@ -0,0 +1,7 @@ +Subclass/Dual Class Master Raina:

+Which subclass would you like to change to?
+Please select a subclass from the list below.
+The new subclas will be a level 40, 2nd-transfer class with none of the skill enchants or the skills you learned through codices. Think carefully.
+Also, dual classes can't be reset.
+%removeList% + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Rignos/Rignos.java b/trunk/dist/game/data/scripts/ai/npc/Rignos/Rignos.java index 1a6cfff8a1..b14fa4da42 100644 --- a/trunk/dist/game/data/scripts/ai/npc/Rignos/Rignos.java +++ b/trunk/dist/game/data/scripts/ai/npc/Rignos/Rignos.java @@ -21,6 +21,7 @@ package ai.npc.Rignos; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.SkillHolder; @@ -64,10 +65,15 @@ public class Rignos extends AbstractNpcAI npc.setScriptValue(1); startQuestTimer("TIME_OUT", 1800000, npc, null); TIMER.getSkill().applyEffects(player, player); - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - TIMER.getSkill().applyEffects(player.getSummon(), player.getSummon()); + TIMER.getSkill().applyEffects(pet, pet); } + player.getServitors().values().forEach(s -> + { + TIMER.getSkill().applyEffects(s, s); + }); if (hasQuestItems(player, STAMP)) { diff --git a/trunk/dist/game/data/scripts/ai/npc/Scarecrow/Scarecrow.java b/trunk/dist/game/data/scripts/ai/npc/Scarecrow/Scarecrow.java index 12c900625d..81673a8e89 100644 --- a/trunk/dist/game/data/scripts/ai/npc/Scarecrow/Scarecrow.java +++ b/trunk/dist/game/data/scripts/ai/npc/Scarecrow/Scarecrow.java @@ -26,8 +26,9 @@ import com.l2jserver.gameserver.model.actor.L2Npc; * Scarecrow AI. * @author ivantotov */ -class Scarecrow extends AbstractNpcAI +public final class Scarecrow extends AbstractNpcAI { + // NPCs private static final int SCARECROW = 27457; private static final int TRAINING_DUMMY = 19546; diff --git a/trunk/dist/game/data/scripts/ai/npc/SubclassCertification/SubclassCertification.java b/trunk/dist/game/data/scripts/ai/npc/SubclassCertification/SubclassCertification.java index b422d4527e..d2d713648d 100644 --- a/trunk/dist/game/data/scripts/ai/npc/SubclassCertification/SubclassCertification.java +++ b/trunk/dist/game/data/scripts/ai/npc/SubclassCertification/SubclassCertification.java @@ -23,7 +23,7 @@ import java.util.Map; import ai.npc.AbstractNpcAI; -import com.l2jserver.gameserver.datatables.ClassListData; +import com.l2jserver.gameserver.data.xml.impl.ClassListData; import com.l2jserver.gameserver.enums.CategoryType; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/GrandBossTeleporters.java b/trunk/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/GrandBossTeleporters.java index bd1401be04..293ec491a9 100644 --- a/trunk/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/GrandBossTeleporters.java +++ b/trunk/dist/game/data/scripts/ai/npc/Teleports/GrandBossTeleporters/GrandBossTeleporters.java @@ -22,7 +22,7 @@ import ai.individual.Valakas; import ai.npc.AbstractNpcAI; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.instancemanager.GrandBossManager; import com.l2jserver.gameserver.instancemanager.QuestManager; import com.l2jserver.gameserver.model.Location; @@ -151,17 +151,17 @@ public final class GrandBossTeleporters extends AbstractNpcAI } case 31384: { - DoorTable.getInstance().getDoor(24210004).openMe(); + DoorData.getInstance().getDoor(24210004).openMe(); break; } case 31686: { - DoorTable.getInstance().getDoor(24210006).openMe(); + DoorData.getInstance().getDoor(24210006).openMe(); break; } case 31687: { - DoorTable.getInstance().getDoor(24210005).openMe(); + DoorData.getInstance().getDoor(24210005).openMe(); break; } case 31540: diff --git a/trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/32163-no.htm b/trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/32163-no.htm deleted file mode 100644 index e7fed4407a..0000000000 --- a/trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/32163-no.htm +++ /dev/null @@ -1,10 +0,0 @@ -Gatekeeper Ragara:
-Ages ago, the Kamael were barred from using teleportation magic. Needless to say, this has put us at a distinct disadvantage. Finally, we learned how to borrow other races' power.
-The Wizards of the Ivory Tower sympathized with us, so they created the Staff of Transferring and built strongholds everywhere. Beginning adventurers may move freely to strongholds as a result.
- - - - - - - \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/32163.htm b/trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/32163.htm deleted file mode 100644 index ba3043a7b1..0000000000 --- a/trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/32163.htm +++ /dev/null @@ -1,10 +0,0 @@ -Gatekeeper Ragara:
-Ages ago, the Kamael were barred from using teleportation magic. Needless to say, this has put us at a distinct disadvantage. Finally, we learned how to borrow other races' power.
-The Wizards of the Ivory Tower sympathized with us, so they created the Staff of Transferring and built strongholds everywhere. Beginning adventurers may move freely to strongholds as a result.
- - - - - - - \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/StrongholdsTeleports.java b/trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/StrongholdsTeleports.java index ba1eaf40ed..84533fb8a9 100644 --- a/trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/StrongholdsTeleports.java +++ b/trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/StrongholdsTeleports.java @@ -33,7 +33,6 @@ public final class StrongholdsTeleports extends AbstractNpcAI // NPCs private final static int[] NPCs = { - 32163, 32181, 32184, 32186 diff --git a/trunk/dist/game/data/scripts/ai/npc/Trainers/HealerTrainer/HealerTrainer.java b/trunk/dist/game/data/scripts/ai/npc/Trainers/HealerTrainer/HealerTrainer.java index 56304cfaf6..44f1f1043c 100644 --- a/trunk/dist/game/data/scripts/ai/npc/Trainers/HealerTrainer/HealerTrainer.java +++ b/trunk/dist/game/data/scripts/ai/npc/Trainers/HealerTrainer/HealerTrainer.java @@ -24,7 +24,7 @@ import java.util.List; import ai.npc.AbstractNpcAI; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/dist/game/data/scripts/conquerablehalls/DevastatedCastle/DevastatedCastle.java b/trunk/dist/game/data/scripts/conquerablehalls/DevastatedCastle/DevastatedCastle.java index 9f69c26b14..0284674e2d 100644 --- a/trunk/dist/game/data/scripts/conquerablehalls/DevastatedCastle/DevastatedCastle.java +++ b/trunk/dist/game/data/scripts/conquerablehalls/DevastatedCastle/DevastatedCastle.java @@ -23,8 +23,8 @@ import java.util.Map; import java.util.Map.Entry; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.L2Npc; diff --git a/trunk/dist/game/data/scripts/conquerablehalls/FortressOfResistance/FortressOfResistance.java b/trunk/dist/game/data/scripts/conquerablehalls/FortressOfResistance/FortressOfResistance.java index 0c3cbc8125..cde7801d71 100644 --- a/trunk/dist/game/data/scripts/conquerablehalls/FortressOfResistance/FortressOfResistance.java +++ b/trunk/dist/game/data/scripts/conquerablehalls/FortressOfResistance/FortressOfResistance.java @@ -23,8 +23,8 @@ import java.util.Map; import java.util.Map.Entry; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.Location; diff --git a/trunk/dist/game/data/scripts/conquerablehalls/FortressOfTheDead/FortressOfTheDead.java b/trunk/dist/game/data/scripts/conquerablehalls/FortressOfTheDead/FortressOfTheDead.java index 564347f61f..0b231126fc 100644 --- a/trunk/dist/game/data/scripts/conquerablehalls/FortressOfTheDead/FortressOfTheDead.java +++ b/trunk/dist/game/data/scripts/conquerablehalls/FortressOfTheDead/FortressOfTheDead.java @@ -24,7 +24,7 @@ import java.util.Map.Entry; import com.l2jserver.gameserver.GameTimeController; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/dist/game/data/scripts/conquerablehalls/RainbowSpringsChateau/RainbowSpringsChateau.java b/trunk/dist/game/data/scripts/conquerablehalls/RainbowSpringsChateau/RainbowSpringsChateau.java index fcea516f6b..27b78c32a4 100644 --- a/trunk/dist/game/data/scripts/conquerablehalls/RainbowSpringsChateau/RainbowSpringsChateau.java +++ b/trunk/dist/game/data/scripts/conquerablehalls/RainbowSpringsChateau/RainbowSpringsChateau.java @@ -34,8 +34,8 @@ import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SpawnTable; import com.l2jserver.gameserver.instancemanager.CHSiegeManager; import com.l2jserver.gameserver.instancemanager.ZoneManager; @@ -47,6 +47,7 @@ import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.TeleportWhereType; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.clanhall.ClanHallSiegeEngine; import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall; @@ -692,10 +693,15 @@ public final class RainbowSpringsChateau extends ClanHallSiegeEngine if (pc != null) { pc.stopAllEffects(); - if (pc.hasSummon()) + final L2Summon pet = pc.getPet(); + if (pet != null) { - pc.getSummon().unSummon(pc); + pet.unSummon(pc); } + pc.getServitors().values().forEach(s -> + { + s.unSummon(pc); + }); pc.teleToLocation(ARENAS[arena]); } } diff --git a/trunk/dist/game/data/scripts/conquerablehalls/flagwar/FlagWar.java b/trunk/dist/game/data/scripts/conquerablehalls/flagwar/FlagWar.java index a26e0b0c76..d1d247bd24 100644 --- a/trunk/dist/game/data/scripts/conquerablehalls/flagwar/FlagWar.java +++ b/trunk/dist/game/data/scripts/conquerablehalls/flagwar/FlagWar.java @@ -31,8 +31,8 @@ import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.ai.L2SpecialSiegeGuardAI; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.enums.SiegeClanType; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2ClanMember; diff --git a/trunk/dist/game/data/scripts/conquerablehalls/flagwar/WildBeastReserve/messenger_initial.htm b/trunk/dist/game/data/scripts/conquerablehalls/flagwar/WildBeastReserve/messenger_initial.htm index acc7577336..f355a29e93 100644 --- a/trunk/dist/game/data/scripts/conquerablehalls/flagwar/WildBeastReserve/messenger_initial.htm +++ b/trunk/dist/game/data/scripts/conquerablehalls/flagwar/WildBeastReserve/messenger_initial.htm @@ -1,8 +1,8 @@ Are you ready? Remember, these are wild animals! Don't let them bite you! It won't be easy!
- - - -
- +Clan Register (Leader)
+Choose Clan NPC (Leader)
+See Clan NPC (Member)
+Clan Member Register (Member)

+Quest \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/conquerablehalls/flagwar/WildBeastReserve/messenger_nonsiegeinitial.htm b/trunk/dist/game/data/scripts/conquerablehalls/flagwar/WildBeastReserve/messenger_nonsiegeinitial.htm index f599d5151a..363f5ecf9b 100644 --- a/trunk/dist/game/data/scripts/conquerablehalls/flagwar/WildBeastReserve/messenger_nonsiegeinitial.htm +++ b/trunk/dist/game/data/scripts/conquerablehalls/flagwar/WildBeastReserve/messenger_nonsiegeinitial.htm @@ -1,7 +1,7 @@ Messenger:
What brings you to this place? I can't be responsible for your safety here!
Unless, that is, you're a member of the Clan in charge of the farm.
- - - +Qualification Test for Clan Hall Battle Registration
+Register for Clan Hall Battle
+Clans Participating in the Preliminaries \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/custom/NewbieCoupons/NewbieCoupons.java b/trunk/dist/game/data/scripts/custom/NewbieCoupons/NewbieCoupons.java index ffac19f44f..acb3aa1790 100644 --- a/trunk/dist/game/data/scripts/custom/NewbieCoupons/NewbieCoupons.java +++ b/trunk/dist/game/data/scripts/custom/NewbieCoupons/NewbieCoupons.java @@ -18,7 +18,7 @@ */ package custom.NewbieCoupons; -import com.l2jserver.gameserver.datatables.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.quest.Quest; diff --git a/trunk/dist/game/data/scripts/custom/RaidbossInfo/RaidbossInfo.java b/trunk/dist/game/data/scripts/custom/RaidbossInfo/RaidbossInfo.java index c5b89d4597..4da19a2b19 100644 --- a/trunk/dist/game/data/scripts/custom/RaidbossInfo/RaidbossInfo.java +++ b/trunk/dist/game/data/scripts/custom/RaidbossInfo/RaidbossInfo.java @@ -21,7 +21,7 @@ package custom.RaidbossInfo; import java.util.ArrayList; import java.util.List; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SpawnTable; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.Location; diff --git a/trunk/dist/game/data/scripts/custom/Validators/SubClassSkills.java b/trunk/dist/game/data/scripts/custom/Validators/SubClassSkills.java index 2848925370..1888eae16e 100644 --- a/trunk/dist/game/data/scripts/custom/Validators/SubClassSkills.java +++ b/trunk/dist/game/data/scripts/custom/Validators/SubClassSkills.java @@ -23,7 +23,7 @@ import java.util.Arrays; import javolution.util.FastList; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClassListData; +import com.l2jserver.gameserver.data.xml.impl.ClassListData; import com.l2jserver.gameserver.enums.IllegalActionPunishmentType; import com.l2jserver.gameserver.model.PcCondOverride; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/dist/game/data/scripts/events/GiftOfVitality/GiftOfVitality.java b/trunk/dist/game/data/scripts/events/GiftOfVitality/GiftOfVitality.java index cb221c020e..74f5d1c35e 100644 --- a/trunk/dist/game/data/scripts/events/GiftOfVitality/GiftOfVitality.java +++ b/trunk/dist/game/data/scripts/events/GiftOfVitality/GiftOfVitality.java @@ -150,17 +150,20 @@ public final class GiftOfVitality extends LongTimeEvent { htmltext = "4306-nolevel.htm"; } - else if (!player.hasServitor()) + else if (!player.hasServitors()) { htmltext = "4306-nosummon.htm"; } else { - npc.setTarget(player.getSummon()); - for (SkillHolder sk : SERVITOR_SKILLS) + player.getServitors().values().forEach(s -> { - npc.doCast(sk.getSkill()); - } + npc.setTarget(s); + for (SkillHolder sk : SERVITOR_SKILLS) + { + npc.doCast(sk.getSkill()); + } + }); htmltext = "4306-okbuff.htm"; } break; diff --git a/trunk/dist/game/data/scripts/features/SkillTransfer/SkillTransfer.java b/trunk/dist/game/data/scripts/features/SkillTransfer/SkillTransfer.java index e84b180ebd..f68bed7081 100644 --- a/trunk/dist/game/data/scripts/features/SkillTransfer/SkillTransfer.java +++ b/trunk/dist/game/data/scripts/features/SkillTransfer/SkillTransfer.java @@ -21,8 +21,8 @@ package features.SkillTransfer; import ai.npc.AbstractNpcAI; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClassListData; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.ClassListData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.enums.IllegalActionPunishmentType; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.PcCondOverride; @@ -42,11 +42,11 @@ public final class SkillTransfer extends AbstractNpcAI private static final ItemHolder[] PORMANDERS = { // Cardinal (97) - new ItemHolder(15307, 1), + new ItemHolder(15307, 7), // Eva's Saint (105) - new ItemHolder(15308, 1), + new ItemHolder(15308, 7), // Shillen Saint (112) - new ItemHolder(15309, 4) + new ItemHolder(15309, 7) }; private SkillTransfer() diff --git a/trunk/dist/game/data/scripts/gracia/AI/EnergySeeds.java b/trunk/dist/game/data/scripts/gracia/AI/EnergySeeds.java index 77fb16d1b4..da8baca989 100644 --- a/trunk/dist/game/data/scripts/gracia/AI/EnergySeeds.java +++ b/trunk/dist/game/data/scripts/gracia/AI/EnergySeeds.java @@ -27,8 +27,8 @@ import ai.npc.AbstractNpcAI; import com.l2jserver.Config; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.DoorTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.DoorData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.enums.QuestSound; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.instancemanager.GraciaSeedsManager; @@ -189,7 +189,7 @@ public class EnergySeeds extends AbstractNpcAI { for (int doorId : SEED_OF_DESTRUCTION_DOORS) { - L2DoorInstance doorInstance = DoorTable.getInstance().getDoor(doorId); + L2DoorInstance doorInstance = DoorData.getInstance().getDoor(doorId); if (doorInstance != null) { doorInstance.openMe(); @@ -201,7 +201,7 @@ public class EnergySeeds extends AbstractNpcAI { for (int doorId : SEED_OF_DESTRUCTION_DOORS) { - L2DoorInstance doorInstance = DoorTable.getInstance().getDoor(doorId); + L2DoorInstance doorInstance = DoorData.getInstance().getDoor(doorId); if (doorInstance != null) { doorInstance.closeMe(); diff --git a/trunk/dist/game/data/scripts/gracia/AI/NPC/Nemo/Nemo.java b/trunk/dist/game/data/scripts/gracia/AI/NPC/Nemo/Nemo.java index d4baf4de7a..b35199ad9f 100644 --- a/trunk/dist/game/data/scripts/gracia/AI/NPC/Nemo/Nemo.java +++ b/trunk/dist/game/data/scripts/gracia/AI/NPC/Nemo/Nemo.java @@ -18,6 +18,7 @@ */ package gracia.AI.NPC.Nemo; +import gracia.AI.Maguen; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.ai.CtrlIntention; @@ -27,8 +28,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.quest.Quest; import com.l2jserver.gameserver.network.NpcStringId; -import gracia.AI.Maguen; - /** * Nemo AI. * @author St3eT diff --git a/trunk/dist/game/data/scripts/gracia/GraciaLoader.java b/trunk/dist/game/data/scripts/gracia/GraciaLoader.java index baa9603c29..1dd75104d8 100644 --- a/trunk/dist/game/data/scripts/gracia/GraciaLoader.java +++ b/trunk/dist/game/data/scripts/gracia/GraciaLoader.java @@ -18,9 +18,6 @@ */ package gracia; -import java.util.logging.Level; -import java.util.logging.Logger; - import gracia.AI.EnergySeeds; import gracia.AI.Lindvior; import gracia.AI.Maguen; @@ -35,13 +32,16 @@ import gracia.AI.NPC.ZealotOfShilen.ZealotOfShilen; import gracia.AI.SeedOfAnnihilation.SeedOfAnnihilation; import gracia.instances.SecretArea.SecretArea; import gracia.instances.SeedOfDestruction.Stage1; -import gracia.instances.SeedOfInfinity.HallOfSuffering; +import gracia.instances.SeedOfInfinity.HallOfSuffering.HallOfSuffering; import gracia.vehicles.AirShipGludioGracia.AirShipGludioGracia; import gracia.vehicles.KeucereusNorthController.KeucereusNorthController; import gracia.vehicles.KeucereusSouthController.KeucereusSouthController; import gracia.vehicles.SoDController.SoDController; import gracia.vehicles.SoIController.SoIController; +import java.util.logging.Level; +import java.util.logging.Logger; + /** * Gracia class-loader. * @author Pandragon diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-00.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-00.htm similarity index 76% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-00.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-00.htm index 88e5127d08..0202fb4f98 100644 --- a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-00.htm +++ b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-00.htm @@ -3,5 +3,5 @@ I'm very impressed.
No one has ever broken through this fast to the Hall of Suffering. Extraordinary! In recognition of your achievement, I will give you a Jeweled Battle Supply.
It is granted only to those who achieve an especially impressive feat in battle.
Your leader may receive it on your behalf.
- +Receive the supply. \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-01.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-01.htm similarity index 64% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-01.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-01.htm index 0ac2ab2084..194693207b 100644 --- a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-01.htm +++ b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-01.htm @@ -2,5 +2,5 @@ Unknown Text!
The reward is Mother-of-Pearl Ornamented Duel Supplies.
I'll grant this reward to the leader who represents all of you.
- +Receive the supply. \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-02.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-02.htm similarity index 63% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-02.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-02.htm index 16eb146614..cb372f0c46 100644 --- a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-02.htm +++ b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-02.htm @@ -2,5 +2,5 @@ Unknown Text!
The reward is Gold-Ornamented Duel Supplies.
I'll grant this reward to the leader who represents all of you.
- +Receive the supply. \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-03.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-03.htm similarity index 63% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-03.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-03.htm index 562570b495..5b71f5e6b9 100644 --- a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-03.htm +++ b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-03.htm @@ -2,5 +2,5 @@ Unknown Text!
The reward is Silver-Ornamented Duel Supplies.
I'll grant this reward to the leader who represents all of you.
- +Receive the supply. \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-04.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-04.htm similarity index 63% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-04.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-04.htm index 7254925b8c..5382488f28 100644 --- a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-04.htm +++ b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-04.htm @@ -2,5 +2,5 @@ Unknown Text!
The reward is Bronze-Ornamented Duel Supplies.
I'll grant this reward to the leader who represents all of you.
- +Receive the supply. \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-05.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-05.htm similarity index 62% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-05.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-05.htm index 6bfb495504..a1fc93eb10 100644 --- a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-05.htm +++ b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-05.htm @@ -2,5 +2,5 @@ Unknown Text!
The reward is Non-Ornamented Duel Supplies.
I'll grant this reward to the leader who represents all of you.
- +Receive the supply. \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-06.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-06.htm similarity index 62% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-06.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-06.htm index 4969c1e6dd..df1d72b6a6 100644 --- a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-06.htm +++ b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-06.htm @@ -2,5 +2,5 @@ Unknown Text!
The reward is Weak-Looking Duel Supplies.
I'll grant this reward to the leader who represents all of you.
- +Receive the supply. \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-07.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-07.htm similarity index 62% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-07.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-07.htm index 86555b2d1c..cbd0f32fa6 100644 --- a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-07.htm +++ b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-07.htm @@ -2,5 +2,5 @@ Unknown Text!
The reward is Sad-Looking Duel Supplies.
I'll grant this reward to the leader who represents all of you.
- +Receive the supply. \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-08.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-08.htm similarity index 62% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-08.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-08.htm index 0709927e4a..0cdfac369c 100644 --- a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-08.htm +++ b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-08.htm @@ -2,5 +2,5 @@ Unknown Text!
The reward is Poor-Looking Duel Supplies.
I'll grant this reward to the leader who represents all of you.
- +Receive the supply. \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-09.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-09.htm similarity index 75% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-09.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-09.htm index 3dc45ca5e5..bbd83941be 100644 --- a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-09.htm +++ b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-09.htm @@ -2,5 +2,5 @@ I'm very disappointed.
If I had known your skills were this embarrasingly poor, I would not have assigned you this mission. You're lucky to still be alive! Still, a promise is a promise, so I will give you this Worthless Battle Supply.
I'll grant this reward to the leader who represents all of you.
- +Receive the supply. \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-10.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-10.htm similarity index 100% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-10.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-10.htm diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-11.htm b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-11.htm similarity index 100% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/32530-11.htm rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-11.htm diff --git a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering.java b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/HallOfSuffering.java similarity index 72% rename from trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering.java rename to trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/HallOfSuffering.java index d6a7b4d9c2..ead79dc1ce 100644 --- a/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering.java +++ b/trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/HallOfSuffering.java @@ -16,12 +16,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package gracia.instances.SeedOfInfinity; +package gracia.instances.SeedOfInfinity.HallOfSuffering; import java.util.Calendar; import java.util.HashMap; import java.util.Map; +import ai.npc.AbstractNpcAI; + import com.l2jserver.gameserver.ai.CtrlEvent; import com.l2jserver.gameserver.cache.HtmCache; import com.l2jserver.gameserver.datatables.SkillData; @@ -29,6 +31,7 @@ import com.l2jserver.gameserver.instancemanager.InstanceManager; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.L2Party; import com.l2jserver.gameserver.model.L2World; +import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; @@ -36,7 +39,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.effects.L2EffectType; import com.l2jserver.gameserver.model.instancezone.InstanceWorld; -import com.l2jserver.gameserver.model.quest.Quest; import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.network.SystemMessageId; @@ -50,7 +52,7 @@ import com.l2jserver.gameserver.util.Util; * - bound instance to quests
* @author Gigiikun, ZakaX, Didldak */ -public final class HallOfSuffering extends Quest +public final class HallOfSuffering extends AbstractNpcAI { protected class HSWorld extends InstanceWorld { @@ -65,20 +67,12 @@ public final class HallOfSuffering extends Quest public boolean isRewarded = false; } - private static final int TEMPLATE_ID = 115; - private static final boolean debug = false; - // NPCs private static final int MOUTHOFEKIMUS = 32537; private static final int TEPIOS = 32530; - // teleports - private static final int[] ENTER_TELEPORT = - { - -187567, - 205570, - -9538 - }; - // mobs + // Location + private static final Location ENTER_TELEPORT = new Location(-187567, 205570, -9538); + // Monsters private static final int KLODEKUS = 25665; private static final int KLANIKUS = 25666; private static final int TUMOR_ALIVE = 18704; @@ -102,276 +96,68 @@ public final class HallOfSuffering extends Quest 22513 }; // Doors/Walls/Zones + // @formatter:off private static final int[][] ROOM_1_MOBS = { - { - 22509, - -186296, - 208200, - -9544 - }, - { - 22509, - -186161, - 208345, - -9544 - }, - { - 22509, - -186296, - 208403, - -9544 - }, - { - 22510, - -186107, - 208113, - -9528 - }, - { - 22510, - -186350, - 208200, - -9544 - } + { 22509, -186296, 208200, -9544 }, + { 22509, -186161, 208345, -9544 }, + { 22509, -186296, 208403, -9544 }, + { 22510, -186107, 208113, -9528 }, + { 22510, -186350, 208200, -9544 } }; private static final int[][] ROOM_2_MOBS = { - { - 22511, - -184433, - 210953, - -9536 - }, - { - 22511, - -184406, - 211301, - -9536 - }, - { - 22509, - -184541, - 211272, - -9544 - }, - { - 22510, - -184244, - 211098, - -9536 - }, - { - 22510, - -184352, - 211243, - -9536 - }, - { - 22510, - -184298, - 211330, - -9528 - } + { 22511, -184433, 210953, -9536 }, + { 22511, -184406, 211301, -9536 }, + { 22509, -184541, 211272, -9544 }, + { 22510, -184244, 211098, -9536 }, + { 22510, -184352, 211243, -9536 }, + { 22510, -184298, 211330, -9528 } }; private static final int[][] ROOM_3_MOBS = { - { - 22512, - -182611, - 213984, - -9520 - }, - { - 22512, - -182908, - 214071, - -9520 - }, - { - 22512, - -182962, - 213868, - -9512 - }, - { - 22509, - -182881, - 213955, - -9512 - }, - { - 22511, - -182827, - 213781, - -9504 - }, - { - 22511, - -182530, - 213984, - -9528 - }, - { - 22510, - -182935, - 213723, - -9512 - }, - { - 22510, - -182557, - 213868, - -9520 - } + { 22512, -182611, 213984, -9520 }, + { 22512, -182908, 214071, -9520 }, + { 22512, -182962, 213868, -9512 }, + { 22509, -182881, 213955, -9512 }, + { 22511, -182827, 213781, -9504 }, + { 22511, -182530, 213984, -9528 }, + { 22510, -182935, 213723, -9512 }, + { 22510, -182557, 213868, -9520 } }; private static final int[][] ROOM_4_MOBS = { - { - 22514, - -180958, - 216860, - -9544 - }, - { - 22514, - -181012, - 216628, - -9536 - }, - { - 22514, - -181120, - 216715, - -9536 - }, - { - 22513, - -180661, - 216599, - -9536 - }, - { - 22513, - -181039, - 216599, - -9536 - }, - { - 22511, - -180715, - 216599, - -9536 - }, - { - 22511, - -181012, - 216889, - -9536 - }, - { - 22512, - -180931, - 216918, - -9536 - }, - { - 22512, - -180742, - 216628, - -9536 - } + { 22514, -180958, 216860, -9544 }, + { 22514, -181012, 216628, -9536 }, + { 22514, -181120, 216715, -9536 }, + { 22513, -180661, 216599, -9536 }, + { 22513, -181039, 216599, -9536 }, + { 22511, -180715, 216599, -9536 }, + { 22511, -181012, 216889, -9536 }, + { 22512, -180931, 216918, -9536 }, + { 22512, -180742, 216628, -9536 } }; private static final int[][] ROOM_5_MOBS = { - { - 22512, - -177372, - 217854, - -9536 - }, - { - 22512, - -177237, - 218140, - -9536 - }, - { - 22512, - -177021, - 217647, - -9528 - }, - { - 22513, - -177372, - 217792, - -9544 - }, - { - 22513, - -177372, - 218053, - -9536 - }, - { - 22514, - -177291, - 217734, - -9544 - }, - { - 22514, - -177264, - 217792, - -9544 - }, - { - 22514, - -177264, - 218053, - -9536 - }, - { - 22515, - -177156, - 217792, - -9536 - }, - { - 22515, - -177075, - 217647, - -9528 - } + { 22512, -177372, 217854, -9536 }, + { 22512, -177237, 218140, -9536 }, + { 22512, -177021, 217647, -9528 }, + { 22513, -177372, 217792, -9544 }, + { 22513, -177372, 218053, -9536 }, + { 22514, -177291, 217734, -9544 }, + { 22514, -177264, 217792, -9544 }, + { 22514, -177264, 218053, -9536 }, + { 22515, -177156, 217792, -9536 }, + { 22515, -177075, 217647, -9528 } }; - private static final int[][] TUMOR_SPAWNS = + // @formatter:on + private static final Location[] TUMOR_SPAWNS = { - { - -186327, - 208286, - -9544 - }, - { - -184429, - 211155, - -9544 - }, - { - -182811, - 213871, - -9496 - }, - { - -181039, - 216633, - -9528 - }, - { - -177264, - 217760, - -9544 - } + new Location(-186327, 208286, -9544), + new Location(-184429, 211155, -9544), + new Location(-182811, 213871, -9496), + new Location(-181039, 216633, -9528), + new Location(-177264, 217760, -9544) }; private static final int[][] TWIN_SPAWNS = { @@ -388,25 +174,21 @@ public final class HallOfSuffering extends Quest -9536 } }; - private static final int[] TEPIOS_SPAWN = - { - -173727, - 218109, - -9536 - }; - - // etc - private static final int BOSS_INVUL_TIME = 30000; // in milisex - private static final int BOSS_MINION_SPAWN_TIME = 60000; // in milisex - private static final int BOSS_RESSURECT_TIME = 20000; // in milisex + private static final Location TEPIOS_SPAWN = new Location(-173727, 218109, -9536); + // Boss + private static final int BOSS_INVUL_TIME = 30000; // In Milliseconds. + private static final int BOSS_MINION_SPAWN_TIME = 60000; // In Milliseconds. + private static final int BOSS_RESSURECT_TIME = 20000; // In Milliseconds. // Instance reenter time - // default: 24h - private static final int INSTANCEPENALTY = 24; + private static final int INSTANCE_PENALTY = 24; // Default: 24h + // Misc + private static final int TEMPLATE_ID = 115; + private static final int MIN_LEVEL = 75; + private static final boolean debug = false; public HallOfSuffering() { - // TODO change name to use actual class name - super(-1, "SeedOfInfinity", "gracia/instances"); + super(HallOfSuffering.class.getSimpleName(), "gracia/instances/SeedOfInfinity/HallOfSuffering"); addStartNpc(MOUTHOFEKIMUS, TEPIOS); addTalkId(MOUTHOFEKIMUS, TEPIOS); addFirstTalkId(TEPIOS); @@ -416,43 +198,46 @@ public final class HallOfSuffering extends Quest addKillId(TUMOR_MOBIDS); } - private boolean checkConditions(L2PcInstance player) + private static boolean checkConditions(L2PcInstance player) { if (debug) { return true; } - L2Party party = player.getParty(); + + final L2Party party = player.getParty(); if (party == null) { player.sendPacket(SystemMessageId.YOU_ARE_NOT_CURRENTLY_IN_A_PARTY_SO_YOU_CANNOT_ENTER); return false; } + if (party.getLeader() != player) { player.sendPacket(SystemMessageId.ONLY_A_PARTY_LEADER_CAN_MAKE_THE_REQUEST_TO_ENTER); return false; } + for (L2PcInstance partyMember : party.getMembers()) { - if (partyMember.getLevel() < 75) + if (partyMember.getLevel() < MIN_LEVEL) { - SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_S_LEVEL_DOES_NOT_CORRESPOND_TO_THE_REQUIREMENTS_FOR_ENTRY); + final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_S_LEVEL_DOES_NOT_CORRESPOND_TO_THE_REQUIREMENTS_FOR_ENTRY); sm.addPcName(partyMember); party.broadcastPacket(sm); return false; } if (!Util.checkIfInRange(1000, player, partyMember, true)) { - SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_IN_A_LOCATION_WHICH_CANNOT_BE_ENTERED_THEREFORE_IT_CANNOT_BE_PROCESSED); + final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_IN_A_LOCATION_WHICH_CANNOT_BE_ENTERED_THEREFORE_IT_CANNOT_BE_PROCESSED); sm.addPcName(partyMember); party.broadcastPacket(sm); return false; } - Long reentertime = InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), TEMPLATE_ID); + final long reentertime = InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), TEMPLATE_ID); if (System.currentTimeMillis() < reentertime) { - SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_MAY_NOT_RE_ENTER_YET); + final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_MAY_NOT_RE_ENTER_YET); sm.addPcName(partyMember); party.broadcastPacket(sm); return false; @@ -461,13 +246,7 @@ public final class HallOfSuffering extends Quest return true; } - private void teleportPlayer(L2PcInstance player, int[] coords, int instanceId) - { - player.setInstanceId(instanceId); - player.teleToLocation(coords[0], coords[1], coords[2]); - } - - protected int enterInstance(L2PcInstance player, String template, int[] coords) + private void enterInstance(L2PcInstance player, String template, Location loc) { // check for existing instances for this player InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player); @@ -477,15 +256,15 @@ public final class HallOfSuffering extends Quest if (!(world instanceof HSWorld)) { player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_ANOTHER_INSTANT_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON); - return 0; + return; } - teleportPlayer(player, coords, world.getInstanceId()); - return world.getInstanceId(); + teleportPlayer(player, loc, world.getInstanceId()); + return; } // New instance if (!checkConditions(player)) { - return 0; + return; } L2Party party = player.getParty(); final int instanceId = InstanceManager.getInstance().createDynamicInstance(template); @@ -502,22 +281,21 @@ public final class HallOfSuffering extends Quest // teleport players if (player.getParty() == null) { - teleportPlayer(player, coords, instanceId); + teleportPlayer(player, loc, instanceId); world.addAllowed(player.getObjectId()); } else { for (L2PcInstance partyMember : party.getMembers()) { - teleportPlayer(partyMember, coords, instanceId); + teleportPlayer(partyMember, loc, instanceId); world.addAllowed(partyMember.getObjectId()); getQuestState(partyMember, true); } } - return instanceId; } - protected boolean checkKillProgress(L2Npc mob, HSWorld world) + private boolean checkKillProgress(L2Npc mob, HSWorld world) { if (world.npcList.containsKey(mob)) { @@ -533,7 +311,7 @@ public final class HallOfSuffering extends Quest return true; } - protected int[][] getRoomSpawns(int room) + private int[][] getRoomSpawns(int room) { switch (room) { @@ -552,14 +330,15 @@ public final class HallOfSuffering extends Quest return new int[][] {}; } - protected void runTumors(HSWorld world) + private void runTumors(HSWorld world) { for (int[] mob : getRoomSpawns(world.getStatus())) { - L2Npc npc = addSpawn(mob[0], mob[1], mob[2], mob[3], 0, false, 0, false, world.getInstanceId()); + final L2Npc npc = addSpawn(mob[0], mob[1], mob[2], mob[3], 0, false, 0, false, world.getInstanceId()); world.npcList.put(npc, false); } - L2Npc mob = addSpawn(TUMOR_ALIVE, TUMOR_SPAWNS[world.getStatus()][0], TUMOR_SPAWNS[world.getStatus()][1], TUMOR_SPAWNS[world.getStatus()][2], 0, false, 0, false, world.getInstanceId()); + + final L2Npc mob = addSpawn(TUMOR_ALIVE, TUMOR_SPAWNS[world.getStatus()], false, 0, false, world.getInstanceId()); mob.disableCoreAI(true); mob.setIsImmobilized(true); mob.setCurrentHp(mob.getMaxHp() * 0.5); @@ -567,7 +346,7 @@ public final class HallOfSuffering extends Quest world.incStatus(); } - protected void runTwins(HSWorld world) + private void runTwins(HSWorld world) { world.incStatus(); world.klodekus = addSpawn(TWIN_SPAWNS[0][0], TWIN_SPAWNS[0][1], TWIN_SPAWNS[0][2], TWIN_SPAWNS[0][3], 0, false, 0, false, world.getInstanceId()); @@ -576,7 +355,7 @@ public final class HallOfSuffering extends Quest world.klodekus.setIsMortal(false); } - protected void bossSimpleDie(L2Npc boss) + private void bossSimpleDie(L2Npc boss) { // killing is only possible one time synchronized (this) @@ -670,7 +449,7 @@ public final class HallOfSuffering extends Quest private String getPtLeaderText(L2PcInstance player, HSWorld world) { - String htmltext = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "/data/scripts/instances/SeedOfInfinity/32530-10.htm"); + String htmltext = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "/data/scripts/instances/SeedOfInfinity/HallOfSuffering/32530-10.htm"); htmltext = htmltext.replaceAll("%ptLeader%", String.valueOf(world.ptLeaderName)); return htmltext; } @@ -764,7 +543,7 @@ public final class HallOfSuffering extends Quest { world.isBossesAttacked = true; Calendar reenter = Calendar.getInstance(); - reenter.add(Calendar.HOUR, INSTANCEPENALTY); + reenter.add(Calendar.HOUR, INSTANCE_PENALTY); SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.INSTANT_ZONE_S1_S_ENTRY_HAS_BEEN_RESTRICTED_YOU_CAN_CHECK_THE_NEXT_POSSIBLE_ENTRY_TIME_BY_USING_THE_COMMAND_INSTANCEZONE); sm.addInstanceName(tmpworld.getTemplateId()); @@ -844,7 +623,7 @@ public final class HallOfSuffering extends Quest cancelQuestTimers("ressurectTwin"); cancelQuestTimers("spawnBossGuards"); cancelQuestTimers("isTwinSeparated"); - addSpawn(TEPIOS, TEPIOS_SPAWN[0], TEPIOS_SPAWN[1], TEPIOS_SPAWN[2], 0, false, 0, false, world.getInstanceId()); + addSpawn(TEPIOS, TEPIOS_SPAWN, false, 0, false, world.getInstanceId()); } } } @@ -879,18 +658,12 @@ public final class HallOfSuffering extends Quest @Override public String onTalk(L2Npc npc, L2PcInstance player) { - int npcId = npc.getId(); - QuestState st = getQuestState(player, false); - if (st == null) - { - st = newQuestState(player); - } - if (npcId == MOUTHOFEKIMUS) + getQuestState(player, true); + if (npc.getId() == MOUTHOFEKIMUS) { enterInstance(player, "HallOfSuffering.xml", ENTER_TELEPORT); - return ""; } - else if (npcId == TEPIOS) + else if (npc.getId() == TEPIOS) { InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player); if (((HSWorld) world).rewardItemId == -1) @@ -905,13 +678,13 @@ public final class HallOfSuffering extends Quest else if ((player.getParty() != null) && (player.getParty().getLeaderObjectId() == player.getObjectId())) { ((HSWorld) world).isRewarded = true; - for (L2PcInstance pl : player.getParty().getMembers()) + for (L2PcInstance member : player.getParty().getMembers()) { - st = pl.getQuestState(getName()); - if (st != null) + final QuestState qsMember = getQuestState(member, false); + if (qsMember != null) { - st.giveItems(736, 1); - st.giveItems(((HSWorld) world).rewardItemId, 1); + qsMember.giveItems(736, 1); + qsMember.giveItems(((HSWorld) world).rewardItemId, 1); } } return ""; @@ -921,4 +694,4 @@ public final class HallOfSuffering extends Quest } return ""; } -} +} \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/gracia/vehicles/KeucereusNorthController/KeucereusNorthController.java b/trunk/dist/game/data/scripts/gracia/vehicles/KeucereusNorthController/KeucereusNorthController.java index a54dffd219..7434260e4f 100644 --- a/trunk/dist/game/data/scripts/gracia/vehicles/KeucereusNorthController/KeucereusNorthController.java +++ b/trunk/dist/game/data/scripts/gracia/vehicles/KeucereusNorthController/KeucereusNorthController.java @@ -18,11 +18,11 @@ */ package gracia.vehicles.KeucereusNorthController; +import gracia.vehicles.AirShipController; + import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.VehiclePathPoint; -import gracia.vehicles.AirShipController; - public final class KeucereusNorthController extends AirShipController { private static final int DOCK_ZONE = 50602; diff --git a/trunk/dist/game/data/scripts/gracia/vehicles/KeucereusSouthController/KeucereusSouthController.java b/trunk/dist/game/data/scripts/gracia/vehicles/KeucereusSouthController/KeucereusSouthController.java index 7df7e3e6bc..c855a614c2 100644 --- a/trunk/dist/game/data/scripts/gracia/vehicles/KeucereusSouthController/KeucereusSouthController.java +++ b/trunk/dist/game/data/scripts/gracia/vehicles/KeucereusSouthController/KeucereusSouthController.java @@ -18,11 +18,11 @@ */ package gracia.vehicles.KeucereusSouthController; +import gracia.vehicles.AirShipController; + import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.VehiclePathPoint; -import gracia.vehicles.AirShipController; - public final class KeucereusSouthController extends AirShipController { private static final int DOCK_ZONE = 50603; diff --git a/trunk/dist/game/data/scripts/gracia/vehicles/SoDController/SoDController.java b/trunk/dist/game/data/scripts/gracia/vehicles/SoDController/SoDController.java index 8a8b213ac4..da785d51e0 100644 --- a/trunk/dist/game/data/scripts/gracia/vehicles/SoDController/SoDController.java +++ b/trunk/dist/game/data/scripts/gracia/vehicles/SoDController/SoDController.java @@ -18,11 +18,11 @@ */ package gracia.vehicles.SoDController; +import gracia.vehicles.AirShipController; + import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.VehiclePathPoint; -import gracia.vehicles.AirShipController; - public final class SoDController extends AirShipController { private static final int DOCK_ZONE = 50601; diff --git a/trunk/dist/game/data/scripts/gracia/vehicles/SoIController/SoIController.java b/trunk/dist/game/data/scripts/gracia/vehicles/SoIController/SoIController.java index ab89c47aed..00b7dc4928 100644 --- a/trunk/dist/game/data/scripts/gracia/vehicles/SoIController/SoIController.java +++ b/trunk/dist/game/data/scripts/gracia/vehicles/SoIController/SoIController.java @@ -18,11 +18,11 @@ */ package gracia.vehicles.SoIController; +import gracia.vehicles.AirShipController; + import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.VehiclePathPoint; -import gracia.vehicles.AirShipController; - public final class SoIController extends AirShipController { private static final int DOCK_ZONE = 50600; diff --git a/trunk/dist/game/data/scripts/handlers/MasterHandler.java b/trunk/dist/game/data/scripts/handlers/MasterHandler.java index a10462d833..c50e37b82b 100644 --- a/trunk/dist/game/data/scripts/handlers/MasterHandler.java +++ b/trunk/dist/game/data/scripts/handlers/MasterHandler.java @@ -59,7 +59,6 @@ import handlers.admincommandhandlers.AdminEvents; import handlers.admincommandhandlers.AdminExpSp; import handlers.admincommandhandlers.AdminFightCalculator; import handlers.admincommandhandlers.AdminFortSiege; -import handlers.admincommandhandlers.AdminGeoEditor; import handlers.admincommandhandlers.AdminGeodata; import handlers.admincommandhandlers.AdminGm; import handlers.admincommandhandlers.AdminGmChat; @@ -210,6 +209,7 @@ import handlers.targethandlers.FrontAura; import handlers.targethandlers.Ground; import handlers.targethandlers.Holy; import handlers.targethandlers.One; +import handlers.targethandlers.OneFriendly; import handlers.targethandlers.OwnerPet; import handlers.targethandlers.Party; import handlers.targethandlers.PartyClan; @@ -353,7 +353,6 @@ public class MasterHandler AdminFightCalculator.class, AdminFortSiege.class, AdminGeodata.class, - AdminGeoEditor.class, AdminGm.class, AdminGmChat.class, AdminGraciaSeeds.class, @@ -553,6 +552,7 @@ public class MasterHandler Ground.class, Holy.class, One.class, + OneFriendly.class, OwnerPet.class, Party.class, PartyClan.class, diff --git a/trunk/dist/game/data/scripts/handlers/actionhandlers/L2PcInstanceAction.java b/trunk/dist/game/data/scripts/handlers/actionhandlers/L2PcInstanceAction.java index d2ee66cdab..b3d0e53f04 100644 --- a/trunk/dist/game/data/scripts/handlers/actionhandlers/L2PcInstanceAction.java +++ b/trunk/dist/game/data/scripts/handlers/actionhandlers/L2PcInstanceAction.java @@ -18,7 +18,6 @@ */ package handlers.actionhandlers; -import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.enums.InstanceType; @@ -101,15 +100,7 @@ public class L2PcInstanceAction implements IActionHandler } else { - if (Config.GEODATA > 0) - { - if (GeoData.getInstance().canSeeTarget(activeChar, target)) - { - activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); - activeChar.onActionRequest(); - } - } - else + if (GeoData.getInstance().canSeeTarget(activeChar, target)) { activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); activeChar.onActionRequest(); @@ -120,14 +111,7 @@ public class L2PcInstanceAction implements IActionHandler { // This Action Failed packet avoids activeChar getting stuck when clicking three or more times activeChar.sendPacket(ActionFailed.STATIC_PACKET); - if (Config.GEODATA > 0) - { - if (GeoData.getInstance().canSeeTarget(activeChar, target)) - { - activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, target); - } - } - else + if (GeoData.getInstance().canSeeTarget(activeChar, target)) { activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, target); } diff --git a/trunk/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java b/trunk/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java index d19934e8eb..c39171f395 100644 --- a/trunk/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java +++ b/trunk/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java @@ -18,7 +18,6 @@ */ package handlers.actionhandlers; -import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.enums.InstanceType; @@ -61,32 +60,16 @@ public class L2PetInstanceAction implements IActionHandler // Check if the pet is attackable (without a forced attack) and isn't dead if (target.isAutoAttackable(activeChar) && !isOwner) { - if (Config.GEODATA > 0) - { - if (GeoData.getInstance().canSeeTarget(activeChar, target)) - { - // Set the L2PcInstance Intention to AI_INTENTION_ATTACK - activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); - activeChar.onActionRequest(); - } - } - else + if (GeoData.getInstance().canSeeTarget(activeChar, target)) { + // Set the L2PcInstance Intention to AI_INTENTION_ATTACK activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); activeChar.onActionRequest(); } } else if (!((L2Character) target).isInsideRadius(activeChar, 150, false, false)) { - if (Config.GEODATA > 0) - { - if (GeoData.getInstance().canSeeTarget(activeChar, target)) - { - activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, target); - activeChar.onActionRequest(); - } - } - else + if (GeoData.getInstance().canSeeTarget(activeChar, target)) { activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, target); activeChar.onActionRequest(); diff --git a/trunk/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java b/trunk/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java index bfc1a6417f..a0776693fb 100644 --- a/trunk/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java +++ b/trunk/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java @@ -18,7 +18,6 @@ */ package handlers.actionhandlers; -import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.enums.InstanceType; @@ -61,15 +60,7 @@ public class L2SummonAction implements IActionHandler { if (target.isAutoAttackable(activeChar)) { - if (Config.GEODATA > 0) - { - if (GeoData.getInstance().canSeeTarget(activeChar, target)) - { - activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); - activeChar.onActionRequest(); - } - } - else + if (GeoData.getInstance().canSeeTarget(activeChar, target)) { activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); activeChar.onActionRequest(); @@ -83,17 +74,13 @@ public class L2SummonAction implements IActionHandler { activeChar.updateNotMoveUntil(); } - else if (Config.GEODATA > 0) + else { if (GeoData.getInstance().canSeeTarget(activeChar, target)) { activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, target); } } - else - { - activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, target); - } } } return true; diff --git a/trunk/dist/game/data/scripts/handlers/actionshifthandlers/L2NpcActionShift.java b/trunk/dist/game/data/scripts/handlers/actionshifthandlers/L2NpcActionShift.java index a1445bbf6d..5ffe05e725 100644 --- a/trunk/dist/game/data/scripts/handlers/actionshifthandlers/L2NpcActionShift.java +++ b/trunk/dist/game/data/scripts/handlers/actionshifthandlers/L2NpcActionShift.java @@ -18,6 +18,8 @@ */ package handlers.actionshifthandlers; +import handlers.bypasshandlers.NpcViewMod; + import java.util.Set; import com.l2jserver.Config; @@ -34,8 +36,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; import com.l2jserver.gameserver.util.Util; -import handlers.bypasshandlers.NpcViewMod; - public class L2NpcActionShift implements IActionShiftHandler { /** diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminAdmin.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminAdmin.java index f0a2d0ca10..df7528e894 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminAdmin.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminAdmin.java @@ -24,7 +24,7 @@ import java.util.logging.Logger; import javolution.text.TextBuilder; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.L2World; @@ -87,13 +87,13 @@ public class AdminAdmin implements IAdminCommandHandler } else if (command.startsWith("admin_gmliston")) { - AdminTable.getInstance().showGm(activeChar); + AdminData.getInstance().showGm(activeChar); activeChar.sendMessage("Registered into gm list"); AdminHtml.showAdminHtml(activeChar, "gm_menu.htm"); } else if (command.startsWith("admin_gmlistoff")) { - AdminTable.getInstance().hideGm(activeChar); + AdminData.getInstance().hideGm(activeChar); activeChar.sendMessage("Removed from gm list"); AdminHtml.showAdminHtml(activeChar, "gm_menu.htm"); } diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminAnnouncements.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminAnnouncements.java index a9dc5754f9..e43b1caa85 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminAnnouncements.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminAnnouncements.java @@ -22,7 +22,7 @@ import java.util.StringTokenizer; import com.l2jserver.Config; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.AnnouncementsTable; +import com.l2jserver.gameserver.data.sql.impl.AnnouncementsTable; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.PageResult; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminBuffs.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminBuffs.java index 6fb828313c..03c49f7d28 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminBuffs.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminBuffs.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.StringTokenizer; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.L2Character; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminCHSiege.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminCHSiege.java index 523bcb6a89..884c11058c 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminCHSiege.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminCHSiege.java @@ -21,7 +21,7 @@ package handlers.admincommandhandlers; import java.util.Calendar; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.instancemanager.CHSiegeManager; import com.l2jserver.gameserver.model.L2Clan; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminCastle.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminCastle.java index 96bc937ed9..e8b9010f4b 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminCastle.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminCastle.java @@ -21,7 +21,7 @@ package handlers.admincommandhandlers; import java.util.StringTokenizer; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.enums.CastleSide; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.instancemanager.CastleManager; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminChangeAccessLevel.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminChangeAccessLevel.java index 2bae1d0e98..1c5a447fc8 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminChangeAccessLevel.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminChangeAccessLevel.java @@ -24,7 +24,7 @@ import java.sql.SQLException; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2AccessLevel; import com.l2jserver.gameserver.model.L2World; @@ -120,9 +120,9 @@ public final class AdminChangeAccessLevel implements IAdminCommandHandler { if (lvl >= 0) { - if (AdminTable.getInstance().hasAccessLevel(lvl)) + if (AdminData.getInstance().hasAccessLevel(lvl)) { - final L2AccessLevel acccessLevel = AdminTable.getInstance().getAccessLevel(lvl); + final L2AccessLevel acccessLevel = AdminData.getInstance().getAccessLevel(lvl); player.setAccessLevel(lvl, true); player.sendMessage("Your access level has been changed to " + acccessLevel.getName() + " (" + acccessLevel.getLevel() + ")."); activeChar.sendMessage(player.getName() + "'s access level has been changed to " + acccessLevel.getName() + " (" + acccessLevel.getLevel() + ")."); diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminClan.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminClan.java index 859088c52d..6412ecbc2d 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminClan.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminClan.java @@ -21,7 +21,7 @@ package handlers.admincommandhandlers; import java.util.StringTokenizer; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.instancemanager.ClanHallManager; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminClanHall.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminClanHall.java index 3bc359c349..38e5396f17 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminClanHall.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminClanHall.java @@ -20,7 +20,7 @@ package handlers.admincommandhandlers; import java.util.StringTokenizer; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.instancemanager.AuctionManager; import com.l2jserver.gameserver.instancemanager.CHSiegeManager; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminDoorControl.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminDoorControl.java index 802d4fceb2..a8c5a69644 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminDoorControl.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminDoorControl.java @@ -18,7 +18,7 @@ */ package handlers.admincommandhandlers; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.model.L2Object; @@ -33,7 +33,7 @@ import com.l2jserver.gameserver.model.entity.Castle; */ public class AdminDoorControl implements IAdminCommandHandler { - private static DoorTable _doorTable = DoorTable.getInstance(); + private static DoorData _doorTable = DoorData.getInstance(); private static final String[] ADMIN_COMMANDS = { "admin_open", diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminEditChar.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminEditChar.java index 4c05e43d2e..1723cc7bab 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminEditChar.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminEditChar.java @@ -31,8 +31,8 @@ import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.CharNameTable; -import com.l2jserver.gameserver.datatables.ClassListData; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.data.xml.impl.ClassListData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.L2World; @@ -353,12 +353,17 @@ public class AdminEditChar implements IAdminCommandHandler if ((ClassId.getClassId(classidval) != null) && (player.getClassId().getId() != classidval)) { player.setClassId(classidval); - if (!player.isSubClassActive()) + + if (player.isSubClassActive()) { - player.setBaseClass(classidval); + player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass()); + } + else + { + player.setBaseClass(player.getActiveClass()); } - String newclass = ClassListData.getInstance().getClass(player.getClassId()).getClassName(); + final String newclass = ClassListData.getInstance().getClass(player.getClassId()).getClassName(); player.storeMe(); player.sendMessage("A GM changed your class to " + newclass + "."); player.broadcastUserInfo(); diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminEventEngine.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminEventEngine.java index 1352bd1f11..31cccf6c0f 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminEventEngine.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminEventEngine.java @@ -29,8 +29,8 @@ import java.io.PrintStream; import java.util.StringTokenizer; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; -import com.l2jserver.gameserver.datatables.TransformData; +import com.l2jserver.gameserver.data.xml.impl.AdminData; +import com.l2jserver.gameserver.data.xml.impl.TransformData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -365,7 +365,7 @@ public class AdminEventEngine implements IAdminCommandHandler int transId = transIds[Rnd.get(transIds.length)]; if (!TransformData.getInstance().transformPlayer(transId, player)) { - AdminTable.getInstance().broadcastMessageToGMs("EventEngine: Unknow transformation id: " + transId); + AdminData.getInstance().broadcastMessageToGMs("EventEngine: Unknow transformation id: " + transId); } } showEventControl(activeChar); @@ -425,7 +425,7 @@ public class AdminEventEngine implements IAdminCommandHandler catch (Exception e) { e.printStackTrace(); - AdminTable.getInstance().broadcastMessageToGMs("EventEngine: Error! Possible blank boxes while executing a command which requires a value in the box?"); + AdminData.getInstance().broadcastMessageToGMs("EventEngine: Error! Possible blank boxes while executing a command which requires a value in the box?"); } return true; } diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminExpSp.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminExpSp.java index 60649d882c..55cbc260db 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminExpSp.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminExpSp.java @@ -22,7 +22,7 @@ import java.util.StringTokenizer; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClassListData; +import com.l2jserver.gameserver.data.xml.impl.ClassListData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminFightCalculator.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminFightCalculator.java index e65200ea35..505319a37f 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminFightCalculator.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminFightCalculator.java @@ -21,7 +21,7 @@ package handlers.admincommandhandlers; import java.util.List; import java.util.StringTokenizer; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.actor.L2Character; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGeoEditor.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGeoEditor.java deleted file mode 100644 index 076a6f175e..0000000000 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGeoEditor.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2004-2015 L2J DataPack - * - * This file is part of L2J DataPack. - * - * L2J DataPack is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * L2J DataPack is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package handlers.admincommandhandlers; - -import java.util.StringTokenizer; - -import com.l2jserver.Config; -import com.l2jserver.gameserver.geoeditorcon.GeoEditorListener; -import com.l2jserver.gameserver.handler.IAdminCommandHandler; -import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; - -/** - * @author Luno, Dezmond - */ -public class AdminGeoEditor implements IAdminCommandHandler -{ - private static final String[] ADMIN_COMMANDS = - { - "admin_ge_status", - "admin_ge_mode", - "admin_ge_join", - "admin_ge_leave" - }; - - @Override - public boolean useAdminCommand(String command, L2PcInstance activeChar) - { - if (!Config.ACCEPT_GEOEDITOR_CONN) - { - activeChar.sendMessage("Server do not accepts geoeditor connections now."); - return true; - } - if (command.startsWith("admin_ge_status")) - { - activeChar.sendMessage(GeoEditorListener.getInstance().getStatus()); - } - else if (command.startsWith("admin_ge_mode")) - { - if (GeoEditorListener.getInstance().getThread() == null) - { - activeChar.sendMessage("Geoeditor not connected."); - return true; - } - try - { - String val = command.substring("admin_ge_mode".length()); - StringTokenizer st = new StringTokenizer(val); - - if (st.countTokens() < 1) - { - activeChar.sendMessage("Usage: //ge_mode X"); - activeChar.sendMessage("Mode 0: Don't send coordinates to geoeditor."); - activeChar.sendMessage("Mode 1: Send coordinates at ValidatePosition from clients."); - activeChar.sendMessage("Mode 2: Send coordinates each second."); - return true; - } - int m; - m = Integer.parseInt(st.nextToken()); - GeoEditorListener.getInstance().getThread().setMode(m); - activeChar.sendMessage("Geoeditor connection mode set to " + m + "."); - } - catch (Exception e) - { - activeChar.sendMessage("Usage: //ge_mode X"); - activeChar.sendMessage("Mode 0: Don't send coordinates to geoeditor."); - activeChar.sendMessage("Mode 1: Send coordinates at ValidatePosition from clients."); - activeChar.sendMessage("Mode 2: Send coordinates each second."); - e.printStackTrace(); - } - return true; - } - else if (command.equals("admin_ge_join")) - { - if (GeoEditorListener.getInstance().getThread() == null) - { - activeChar.sendMessage("Geoeditor not connected."); - return true; - } - GeoEditorListener.getInstance().getThread().addGM(activeChar); - activeChar.sendMessage("You added to list for geoeditor."); - } - else if (command.equals("admin_ge_leave")) - { - if (GeoEditorListener.getInstance().getThread() == null) - { - activeChar.sendMessage("Geoeditor not connected."); - return true; - } - GeoEditorListener.getInstance().getThread().removeGM(activeChar); - activeChar.sendMessage("You removed from list for geoeditor."); - } - return true; - } - - @Override - public String[] getAdminCommandList() - { - return ADMIN_COMMANDS; - } -} diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGm.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGm.java index 4aa5fe0245..617250e003 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGm.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGm.java @@ -20,7 +20,7 @@ package handlers.admincommandhandlers; import java.util.logging.Logger; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -41,7 +41,7 @@ public class AdminGm implements IAdminCommandHandler { if (command.equals("admin_gm") && activeChar.isGM()) { - AdminTable.getInstance().deleteGm(activeChar); + AdminData.getInstance().deleteGm(activeChar); activeChar.setAccessLevel(0, true); activeChar.sendMessage("You no longer have GM status."); _log.info("GM: " + activeChar.getName() + "(" + activeChar.getObjectId() + ") turned his GM status off"); diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGmChat.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGmChat.java index 110d71b882..f47e64ed3b 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGmChat.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGmChat.java @@ -18,7 +18,7 @@ */ package handlers.admincommandhandlers; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.L2World; @@ -116,7 +116,7 @@ public class AdminGmChat implements IAdminCommandHandler } text = command.substring(offset); CreatureSay cs = new CreatureSay(0, Say2.ALLIANCE, activeChar.getName(), text); - AdminTable.getInstance().broadcastToGMs(cs); + AdminData.getInstance().broadcastToGMs(cs); } catch (StringIndexOutOfBoundsException e) { diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminHellbound.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminHellbound.java index b6a860fd9d..bd2d5b46e1 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminHellbound.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminHellbound.java @@ -18,14 +18,14 @@ */ package handlers.admincommandhandlers; +import hellbound.HellboundEngine; + import java.util.StringTokenizer; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; -import hellbound.HellboundEngine; - /** * Hellbound admin command. * @author DS, Gladicek diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminLevel.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminLevel.java index 0947455ec8..7f01ac9d03 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminLevel.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminLevel.java @@ -20,7 +20,7 @@ package handlers.admincommandhandlers; import java.util.StringTokenizer; -import com.l2jserver.gameserver.datatables.ExperienceTable; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Playable; @@ -74,10 +74,10 @@ public class AdminLevel implements IAdminCommandHandler L2PcInstance targetPlayer = (L2PcInstance) targetChar; byte lvl = Byte.parseByte(val); - if ((lvl >= 1) && (lvl <= ExperienceTable.getInstance().getMaxLevel())) + if ((lvl >= 1) && (lvl <= ExperienceData.getInstance().getMaxLevel())) { long pXp = targetPlayer.getExp(); - long tXp = ExperienceTable.getInstance().getExpForLevel(lvl); + long tXp = ExperienceData.getInstance().getExpForLevel(lvl); if (pXp > tXp) { @@ -90,13 +90,13 @@ public class AdminLevel implements IAdminCommandHandler } else { - activeChar.sendMessage("You must specify level between 1 and " + ExperienceTable.getInstance().getMaxLevel() + "."); + activeChar.sendMessage("You must specify level between 1 and " + ExperienceData.getInstance().getMaxLevel() + "."); return false; } } catch (NumberFormatException e) { - activeChar.sendMessage("You must specify level between 1 and " + ExperienceTable.getInstance().getMaxLevel() + "."); + activeChar.sendMessage("You must specify level between 1 and " + ExperienceData.getInstance().getMaxLevel() + "."); return false; } } diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminMenu.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminMenu.java index b56f8ff9e4..966e8e6de4 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminMenu.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminMenu.java @@ -23,7 +23,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.handler.AdminCommandHandler; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2Clan; @@ -190,7 +190,7 @@ public class AdminMenu implements IAdminCommandHandler if (st.countTokens() > 1) { String subCommand = "admin_ban_char"; - if (!AdminTable.getInstance().hasAccess(subCommand, activeChar.getAccessLevel())) + if (!AdminData.getInstance().hasAccess(subCommand, activeChar.getAccessLevel())) { activeChar.sendMessage("You don't have the access right to use this command!"); _log.warning("Character " + activeChar.getName() + " tryed to use admin command " + subCommand + ", but have no access to it!"); @@ -207,7 +207,7 @@ public class AdminMenu implements IAdminCommandHandler if (st.countTokens() > 1) { String subCommand = "admin_unban_char"; - if (!AdminTable.getInstance().hasAccess(subCommand, activeChar.getAccessLevel())) + if (!AdminData.getInstance().hasAccess(subCommand, activeChar.getAccessLevel())) { activeChar.sendMessage("You don't have the access right to use this command!"); _log.warning("Character " + activeChar.getName() + " tryed to use admin command " + subCommand + ", but have no access to it!"); diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminMobGroup.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminMobGroup.java index b0a866a2a6..632ba356de 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminMobGroup.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminMobGroup.java @@ -18,7 +18,7 @@ */ package handlers.admincommandhandlers; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.MobGroup; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java index 1ba87c8505..c6c3dd2cdf 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java @@ -69,9 +69,9 @@ public class AdminPathNode implements IAdminCommandHandler } else if (command.equals("admin_find_path")) { - if (Config.GEODATA < 2) + if (Config.PATHFINDING == 0) { - activeChar.sendMessage("PathFinding has not been enabled."); + activeChar.sendMessage("PathFinding is disabled."); return true; } if (activeChar.getTarget() != null) diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPledge.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPledge.java index 743caf320c..da57c668af 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPledge.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPledge.java @@ -20,7 +20,7 @@ package handlers.admincommandhandlers; import java.util.StringTokenizer; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.enums.UserInfoType; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2Clan; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPolymorph.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPolymorph.java index add06cf202..6e6460d9be 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPolymorph.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPolymorph.java @@ -18,7 +18,7 @@ */ package handlers.admincommandhandlers; -import com.l2jserver.gameserver.datatables.TransformData; +import com.l2jserver.gameserver.data.xml.impl.TransformData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Character; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPunishment.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPunishment.java index 0cb5adbfda..3ef07f2992 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPunishment.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminPunishment.java @@ -28,7 +28,7 @@ import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.instancemanager.PunishmentManager; import com.l2jserver.gameserver.model.L2World; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminReload.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminReload.java index db8e61c2c3..5d7c8a35e2 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminReload.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminReload.java @@ -25,21 +25,21 @@ import javax.script.ScriptException; import com.l2jserver.Config; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.AbilityPointsData; -import com.l2jserver.gameserver.datatables.AdminTable; -import com.l2jserver.gameserver.datatables.BuyListData; -import com.l2jserver.gameserver.datatables.CrestTable; -import com.l2jserver.gameserver.datatables.DoorTable; -import com.l2jserver.gameserver.datatables.EnchantItemData; -import com.l2jserver.gameserver.datatables.EnchantItemGroupsData; -import com.l2jserver.gameserver.datatables.ItemCrystalizationData; +import com.l2jserver.gameserver.data.sql.impl.CrestTable; +import com.l2jserver.gameserver.data.sql.impl.TeleportLocationTable; +import com.l2jserver.gameserver.data.xml.impl.AbilityPointsData; +import com.l2jserver.gameserver.data.xml.impl.AdminData; +import com.l2jserver.gameserver.data.xml.impl.BuyListData; +import com.l2jserver.gameserver.data.xml.impl.DoorData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemGroupsData; +import com.l2jserver.gameserver.data.xml.impl.ItemCrystalizationData; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; +import com.l2jserver.gameserver.data.xml.impl.TeleportersData; +import com.l2jserver.gameserver.data.xml.impl.TransformData; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.MultisellData; -import com.l2jserver.gameserver.datatables.NpcData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.TeleportLocationTable; -import com.l2jserver.gameserver.datatables.TeleportersData; -import com.l2jserver.gameserver.datatables.TransformData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager; import com.l2jserver.gameserver.instancemanager.QuestManager; @@ -81,19 +81,19 @@ public class AdminReload implements IAdminCommandHandler case "config": { Config.load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Configs."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Configs."); break; } case "access": { - AdminTable.getInstance().load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Access."); + AdminData.getInstance().load(); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Access."); break; } case "npc": { NpcData.getInstance().load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Npcs."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Npcs."); break; } case "quest": @@ -104,20 +104,20 @@ public class AdminReload implements IAdminCommandHandler if (!Util.isDigit(value)) { QuestManager.getInstance().reload(value); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Quest Name:" + value + "."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Quest Name:" + value + "."); } else { final int questId = Integer.parseInt(value); QuestManager.getInstance().reload(questId); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Quest ID:" + questId + "."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Quest ID:" + questId + "."); } } else { QuestManager.getInstance().reloadAllScripts(); activeChar.sendMessage("All scripts have been reloaded."); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Quests."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Quests."); } break; } @@ -125,7 +125,7 @@ public class AdminReload implements IAdminCommandHandler { WalkingManager.getInstance().load(); activeChar.sendMessage("All walkers have been reloaded"); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Walkers."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Walkers."); break; } case "htm": @@ -138,7 +138,7 @@ public class AdminReload implements IAdminCommandHandler if (file.exists()) { HtmCache.getInstance().reload(file); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Htm File:" + file.getName() + "."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Htm File:" + file.getName() + "."); } else { @@ -149,63 +149,63 @@ public class AdminReload implements IAdminCommandHandler { HtmCache.getInstance().reload(); activeChar.sendMessage("Cache[HTML]: " + HtmCache.getInstance().getMemoryUsage() + " megabytes on " + HtmCache.getInstance().getLoadedFiles() + " files loaded"); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Htms."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Htms."); } break; } case "multisell": { MultisellData.getInstance().load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Multisells."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Multisells."); break; } case "buylist": { BuyListData.getInstance().load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Buylists."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Buylists."); break; } case "teleport": { TeleportLocationTable.getInstance().reloadAll(); TeleportersData.getInstance().load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Teleports."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Teleports."); break; } case "skill": { SkillData.getInstance().reload(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Skills."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Skills."); break; } case "item": { ItemTable.getInstance().reload(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Items."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Items."); break; } case "door": { - DoorTable.getInstance().load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Doors."); + DoorData.getInstance().load(); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Doors."); break; } case "zone": { ZoneManager.getInstance().reload(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Zones."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Zones."); break; } case "cw": { CursedWeaponsManager.getInstance().reload(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Cursed Weapons."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Cursed Weapons."); break; } case "crest": { CrestTable.getInstance().load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Crests."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Crests."); break; } case "effect": @@ -214,7 +214,7 @@ public class AdminReload implements IAdminCommandHandler try { L2ScriptEngineManager.getInstance().executeScript(file); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Effects."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Effects."); } catch (ScriptException e) { @@ -229,7 +229,7 @@ public class AdminReload implements IAdminCommandHandler try { L2ScriptEngineManager.getInstance().executeScript(file); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Handlers."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Handlers."); } catch (ScriptException e) { @@ -242,25 +242,25 @@ public class AdminReload implements IAdminCommandHandler { EnchantItemGroupsData.getInstance().load(); EnchantItemData.getInstance().load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded item enchanting data."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded item enchanting data."); break; } case "transform": { TransformData.getInstance().load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded transform data."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded transform data."); break; } case "crystalizable": { ItemCrystalizationData.getInstance().load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded item crystalization data."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded item crystalization data."); break; } case "ability": { AbilityPointsData.getInstance().load(); - AdminTable.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded ability points data."); + AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded ability points data."); break; } default: diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminRide.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminRide.java index 9720db7989..594ce9dddb 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminRide.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminRide.java @@ -18,7 +18,7 @@ */ package handlers.admincommandhandlers; -import com.l2jserver.gameserver.datatables.TransformData; +import com.l2jserver.gameserver.data.xml.impl.TransformData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminServerInfo.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminServerInfo.java index 0ec08e3a70..9de13a62f8 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminServerInfo.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminServerInfo.java @@ -65,7 +65,7 @@ public class AdminServerInfo implements IAdminCommandHandler html.replace("%slots%", getPlayersCount("ALL") + "/" + Config.MAXIMUM_ONLINE_USERS); html.replace("%gameTime%", GameTimeController.getInstance().getGameHour() + ":" + GameTimeController.getInstance().getGameMinute()); html.replace("%dayNight%", GameTimeController.getInstance().isNight() ? "Night" : "Day"); - html.replace("%geodata%", Config.GEODATA > 0 ? "Enabled" : "Disabled"); + html.replace("%geodata%", Config.PATHFINDING > 0 ? "Enabled" : "Disabled"); html.replace("%serverTime%", fmt.format(new Date(System.currentTimeMillis()))); html.replace("%serverUpTime%", getServerUpTime()); html.replace("%onlineAll%", getPlayersCount("ALL")); diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminShop.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminShop.java index 263613ee08..5d6e66d32f 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminShop.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminShop.java @@ -20,7 +20,7 @@ package handlers.admincommandhandlers; import java.util.logging.Logger; -import com.l2jserver.gameserver.datatables.BuyListData; +import com.l2jserver.gameserver.data.xml.impl.BuyListData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.buylist.L2BuyList; diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSkill.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSkill.java index 94bd20af40..30fd28e390 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSkill.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSkill.java @@ -24,9 +24,9 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClassListData; +import com.l2jserver.gameserver.data.xml.impl.ClassListData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SkillTreesData; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2Object; @@ -34,6 +34,7 @@ import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList; import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; import com.l2jserver.gameserver.network.serverpackets.PledgeSkillList; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; @@ -183,6 +184,7 @@ public class AdminSkill implements IAdminCommandHandler player.sendMessage("Admin removed all skills from you."); player.sendSkillList(); player.broadcastUserInfo(); + player.sendPacket(new AcquireSkillList(player)); } else if (command.startsWith("admin_add_clan_skill")) { @@ -205,6 +207,7 @@ public class AdminSkill implements IAdminCommandHandler activeChar.addSkill(skill); activeChar.sendSkillList(); activeChar.sendMessage("You added yourself skill " + skill.getName() + "(" + id + ") level " + lvl); + activeChar.sendPacket(new AcquireSkillList(activeChar)); } return true; } @@ -226,6 +229,7 @@ public class AdminSkill implements IAdminCommandHandler // Notify player and admin activeChar.sendMessage("You gave " + player.giveAvailableSkills(includedByFs, true) + " skills to " + player.getName()); player.sendSkillList(); + player.sendPacket(new AcquireSkillList(player)); } /** diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSpawn.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSpawn.java index f231d781e9..31682d6aea 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSpawn.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSpawn.java @@ -26,8 +26,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.AdminData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SpawnTable; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.instancemanager.DayNightSpawnManager; @@ -219,7 +219,7 @@ public class AdminSpawn implements IAdminCommandHandler RaidBossSpawnManager.getInstance().cleanUp(); DayNightSpawnManager.getInstance().cleanUp(); L2World.getInstance().deleteVisibleNpcSpawns(); - AdminTable.getInstance().broadcastMessageToGMs("NPC Unspawn completed!"); + AdminData.getInstance().broadcastMessageToGMs("NPC Unspawn completed!"); } else if (command.startsWith("admin_spawnday")) { @@ -241,7 +241,7 @@ public class AdminSpawn implements IAdminCommandHandler RaidBossSpawnManager.getInstance().load(); AutoSpawnHandler.getInstance().reload(); QuestManager.getInstance().reloadAllScripts(); - AdminTable.getInstance().broadcastMessageToGMs("NPC Respawn completed!"); + AdminData.getInstance().broadcastMessageToGMs("NPC Respawn completed!"); } else if (command.startsWith("admin_spawn_monster") || command.startsWith("admin_spawn")) { diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSummon.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSummon.java index f95b2919b3..44c4891edf 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSummon.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminSummon.java @@ -20,7 +20,7 @@ package handlers.admincommandhandlers; import java.util.logging.Logger; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.handler.AdminCommandHandler; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -68,7 +68,7 @@ public class AdminSummon implements IAdminCommandHandler if (id < 1000000) { subCommand = "admin_create_item"; - if (!AdminTable.getInstance().hasAccess(subCommand, activeChar.getAccessLevel())) + if (!AdminData.getInstance().hasAccess(subCommand, activeChar.getAccessLevel())) { activeChar.sendMessage("You don't have the access right to use this command!"); _log.warning("Character " + activeChar.getName() + " tryed to use admin command " + subCommand + ", but have no access to it!"); @@ -80,7 +80,7 @@ public class AdminSummon implements IAdminCommandHandler else { subCommand = "admin_spawn_once"; - if (!AdminTable.getInstance().hasAccess(subCommand, activeChar.getAccessLevel())) + if (!AdminData.getInstance().hasAccess(subCommand, activeChar.getAccessLevel())) { activeChar.sendMessage("You don't have the access right to use this command!"); _log.warning("Character " + activeChar.getName() + " tryed to use admin command " + subCommand + ", but have no access to it!"); diff --git a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminTeleport.java b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminTeleport.java index d971b96b6a..d531a71369 100644 --- a/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminTeleport.java +++ b/trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminTeleport.java @@ -28,7 +28,7 @@ import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SpawnTable; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.instancemanager.MapRegionManager; diff --git a/trunk/dist/game/data/scripts/handlers/bypasshandlers/Multisell.java b/trunk/dist/game/data/scripts/handlers/bypasshandlers/Multisell.java index 43bc7889ef..04bd5e67de 100644 --- a/trunk/dist/game/data/scripts/handlers/bypasshandlers/Multisell.java +++ b/trunk/dist/game/data/scripts/handlers/bypasshandlers/Multisell.java @@ -20,7 +20,7 @@ package handlers.bypasshandlers; import java.util.logging.Level; -import com.l2jserver.gameserver.datatables.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; import com.l2jserver.gameserver.handler.IBypassHandler; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; diff --git a/trunk/dist/game/data/scripts/handlers/bypasshandlers/OlympiadManagerLink.java b/trunk/dist/game/data/scripts/handlers/bypasshandlers/OlympiadManagerLink.java index c4ec3b3963..d10505f745 100644 --- a/trunk/dist/game/data/scripts/handlers/bypasshandlers/OlympiadManagerLink.java +++ b/trunk/dist/game/data/scripts/handlers/bypasshandlers/OlympiadManagerLink.java @@ -23,9 +23,9 @@ import java.util.List; import java.util.logging.Level; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.MultisellData; -import com.l2jserver.gameserver.datatables.NpcBufferTable; -import com.l2jserver.gameserver.datatables.NpcBufferTable.NpcBufferData; +import com.l2jserver.gameserver.data.sql.impl.NpcBufferTable; +import com.l2jserver.gameserver.data.sql.impl.NpcBufferTable.NpcBufferData; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; import com.l2jserver.gameserver.handler.IBypassHandler; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; @@ -279,12 +279,17 @@ public class OlympiadManagerLink implements IBypassHandler target.broadcastPacket(new MagicSkillUse(target, activeChar, skill.getId(), skill.getLevel(), 0, 0)); skill.applyEffects(activeChar, activeChar); - final L2Summon summon = activeChar.getSummon(); - if (summon != null) + final L2Summon pet = activeChar.getPet(); + if (pet != null) { - target.broadcastPacket(new MagicSkillUse(target, summon, skill.getId(), skill.getLevel(), 0, 0)); - skill.applyEffects(summon, summon); + target.broadcastPacket(new MagicSkillUse(target, pet, skill.getId(), skill.getLevel(), 0, 0)); + skill.applyEffects(pet, pet); } + activeChar.getServitors().values().forEach(s -> + { + target.broadcastPacket(new MagicSkillUse(target, s, skill.getId(), skill.getLevel(), 0, 0)); + skill.applyEffects(s, s); + }); } } diff --git a/trunk/dist/game/data/scripts/handlers/bypasshandlers/QuestLink.java b/trunk/dist/game/data/scripts/handlers/bypasshandlers/QuestLink.java index 36a1f161bf..9661d16c8e 100644 --- a/trunk/dist/game/data/scripts/handlers/bypasshandlers/QuestLink.java +++ b/trunk/dist/game/data/scripts/handlers/bypasshandlers/QuestLink.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.Set; import java.util.logging.Level; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.handler.IBypassHandler; import com.l2jserver.gameserver.instancemanager.QuestManager; import com.l2jserver.gameserver.model.actor.L2Character; diff --git a/trunk/dist/game/data/scripts/handlers/bypasshandlers/SkillList.java b/trunk/dist/game/data/scripts/handlers/bypasshandlers/SkillList.java index 03f82081b9..321446fea6 100644 --- a/trunk/dist/game/data/scripts/handlers/bypasshandlers/SkillList.java +++ b/trunk/dist/game/data/scripts/handlers/bypasshandlers/SkillList.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.logging.Level; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.handler.IBypassHandler; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; diff --git a/trunk/dist/game/data/scripts/handlers/bypasshandlers/SupportMagic.java b/trunk/dist/game/data/scripts/handlers/bypasshandlers/SupportMagic.java index d01fcc300d..c7c3c46a79 100644 --- a/trunk/dist/game/data/scripts/handlers/bypasshandlers/SupportMagic.java +++ b/trunk/dist/game/data/scripts/handlers/bypasshandlers/SupportMagic.java @@ -99,7 +99,7 @@ public class SupportMagic implements IBypassHandler private static void makeSupportMagic(L2PcInstance player, L2Npc npc, boolean isSummon) { final int level = player.getLevel(); - if (isSummon && !player.hasServitor()) + if (isSummon && !player.hasServitors()) { npc.showChatWindow(player, "data/html/default/SupportMagicNoSummon.htm"); return; @@ -122,20 +122,23 @@ public class SupportMagic implements IBypassHandler if (isSummon) { - npc.setTarget(player.getSummon()); - for (SkillHolder skill : SUMMON_BUFFS) + player.getServitors().values().forEach(s -> { - npc.doCast(skill.getSkill()); - } - - if (level >= HASTE_LEVEL_2) - { - npc.doCast(HASTE_2.getSkill()); - } - else - { - npc.doCast(HASTE_1.getSkill()); - } + npc.setTarget(s); + for (SkillHolder skill : SUMMON_BUFFS) + { + npc.doCast(skill.getSkill()); + } + + if (level >= HASTE_LEVEL_2) + { + npc.doCast(HASTE_2.getSkill()); + } + else + { + npc.doCast(HASTE_1.getSkill()); + } + }); } else { diff --git a/trunk/dist/game/data/scripts/handlers/bypasshandlers/TerritoryStatus.java b/trunk/dist/game/data/scripts/handlers/bypasshandlers/TerritoryStatus.java index 0c39bc4b43..d5dfdaa55d 100644 --- a/trunk/dist/game/data/scripts/handlers/bypasshandlers/TerritoryStatus.java +++ b/trunk/dist/game/data/scripts/handlers/bypasshandlers/TerritoryStatus.java @@ -18,7 +18,7 @@ */ package handlers.bypasshandlers; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.handler.IBypassHandler; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.L2Character; diff --git a/trunk/dist/game/data/scripts/handlers/bypasshandlers/Wear.java b/trunk/dist/game/data/scripts/handlers/bypasshandlers/Wear.java index 1138a4f6ad..024bb511a6 100644 --- a/trunk/dist/game/data/scripts/handlers/bypasshandlers/Wear.java +++ b/trunk/dist/game/data/scripts/handlers/bypasshandlers/Wear.java @@ -22,7 +22,7 @@ import java.util.StringTokenizer; import java.util.logging.Level; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.BuyListData; +import com.l2jserver.gameserver.data.xml.impl.BuyListData; import com.l2jserver.gameserver.handler.IBypassHandler; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/dist/game/data/scripts/handlers/communityboard/ClanBoard.java b/trunk/dist/game/data/scripts/handlers/communityboard/ClanBoard.java index 6cb5e9a285..6239c76477 100644 --- a/trunk/dist/game/data/scripts/handlers/communityboard/ClanBoard.java +++ b/trunk/dist/game/data/scripts/handlers/communityboard/ClanBoard.java @@ -18,7 +18,7 @@ */ package handlers.communityboard; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.handler.CommunityBoardHandler; import com.l2jserver.gameserver.handler.IWriteBoardHandler; import com.l2jserver.gameserver.model.L2Clan; diff --git a/trunk/dist/game/data/scripts/handlers/communityboard/HomeBoard.java b/trunk/dist/game/data/scripts/handlers/communityboard/HomeBoard.java index b8168adf6d..fa190b4696 100644 --- a/trunk/dist/game/data/scripts/handlers/communityboard/HomeBoard.java +++ b/trunk/dist/game/data/scripts/handlers/communityboard/HomeBoard.java @@ -25,8 +25,8 @@ import java.sql.ResultSet; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.MultisellData; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.handler.CommunityBoardHandler; import com.l2jserver.gameserver.handler.IParseBoardHandler; diff --git a/trunk/dist/game/data/scripts/handlers/communityboard/RegionBoard.java b/trunk/dist/game/data/scripts/handlers/communityboard/RegionBoard.java index 89b3659a1e..2096d464be 100644 --- a/trunk/dist/game/data/scripts/handlers/communityboard/RegionBoard.java +++ b/trunk/dist/game/data/scripts/handlers/communityboard/RegionBoard.java @@ -21,7 +21,7 @@ package handlers.communityboard; import java.util.List; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.handler.CommunityBoardHandler; import com.l2jserver.gameserver.handler.IWriteBoardHandler; import com.l2jserver.gameserver.instancemanager.CastleManager; diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/Blink.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/Blink.java index f1dd6b7434..40c32a246c 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/Blink.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/Blink.java @@ -18,7 +18,6 @@ */ package handlers.effecthandlers; -import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.model.Location; @@ -72,17 +71,14 @@ public final class Blink extends AbstractEffect int x = effected.getX() + x1; int y = effected.getY() + y1; int z = effected.getZ(); - Location loc = new Location(x, y, z); - if (Config.GEODATA > 0) - { - loc = GeoData.getInstance().moveCheck(effected.getX(), effected.getY(), effected.getZ(), x, y, z, effected.getInstanceId()); - } + + final Location destination = GeoData.getInstance().moveCheck(effected.getX(), effected.getY(), effected.getZ(), x, y, z, effected.getInstanceId()); effected.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); - effected.broadcastPacket(new FlyToLocation(effected, loc.getX(), loc.getY(), loc.getZ(), FlyType.DUMMY)); + effected.broadcastPacket(new FlyToLocation(effected, destination, FlyType.DUMMY)); effected.abortAttack(); effected.abortCast(); - effected.setXYZ(loc); + effected.setXYZ(destination); effected.broadcastPacket(new ValidateLocation(effected)); } } diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/EnemyCharge.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/EnemyCharge.java index e8b849b503..f73665d50c 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/EnemyCharge.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/EnemyCharge.java @@ -18,7 +18,6 @@ */ package handlers.effecthandlers; -import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.StatsSet; @@ -94,16 +93,12 @@ public final class EnemyCharge extends AbstractEffect int y = curY + (int) ((distance - offset) * sin); int z = info.getEffected().getZ(); - if (Config.GEODATA > 0) - { - Location destiny = GeoData.getInstance().moveCheck(info.getEffector().getX(), info.getEffector().getY(), info.getEffector().getZ(), x, y, z, info.getEffector().getInstanceId()); - x = destiny.getX(); - y = destiny.getY(); - } - info.getEffector().broadcastPacket(new FlyToLocation(info.getEffector(), x, y, z, FlyType.CHARGE)); + final Location destination = GeoData.getInstance().moveCheck(info.getEffector().getX(), info.getEffector().getY(), info.getEffector().getZ(), x, y, z, info.getEffector().getInstanceId()); + + info.getEffector().broadcastPacket(new FlyToLocation(info.getEffector(), destination, FlyType.CHARGE)); // maybe is need force set X,Y,Z - info.getEffector().setXYZ(x, y, z); + info.getEffector().setXYZ(destination); info.getEffector().broadcastPacket(new ValidateLocation(info.getEffector())); } } diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/Fear.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/Fear.java index dd5fe65f9e..1c07b35c01 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/Fear.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/Fear.java @@ -18,7 +18,6 @@ */ package handlers.effecthandlers; -import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ai.CtrlEvent; import com.l2jserver.gameserver.ai.CtrlIntention; @@ -101,18 +100,12 @@ public final class Fear extends AbstractEffect int posY = (int) (info.getEffected().getY() + (FEAR_RANGE * Math.sin(radians))); int posZ = info.getEffected().getZ(); - if (Config.GEODATA > 0) - { - Location destiny = GeoData.getInstance().moveCheck(info.getEffected().getX(), info.getEffected().getY(), info.getEffected().getZ(), posX, posY, posZ, info.getEffected().getInstanceId()); - posX = destiny.getX(); - posY = destiny.getY(); - } - if (!info.getEffected().isPet()) { info.getEffected().setRunning(); } - info.getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(posX, posY, posZ)); + final Location destination = GeoData.getInstance().moveCheck(info.getEffected().getX(), info.getEffected().getY(), info.getEffected().getZ(), posX, posY, posZ, info.getEffected().getInstanceId()); + info.getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, destination); } } diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/HeadquarterCreate.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/HeadquarterCreate.java index d45d47d3ec..ff614d606b 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/HeadquarterCreate.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/HeadquarterCreate.java @@ -18,7 +18,7 @@ */ package handlers.effecthandlers; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.instancemanager.CHSiegeManager; import com.l2jserver.gameserver.instancemanager.CastleManager; diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/Pumping.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/Pumping.java index 5a893d50a3..0a95e76696 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/Pumping.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/Pumping.java @@ -18,7 +18,7 @@ */ package handlers.effecthandlers; -import com.l2jserver.gameserver.datatables.FishingRodsData; +import com.l2jserver.gameserver.data.xml.impl.FishingRodsData; import com.l2jserver.gameserver.enums.ShotType; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.L2Character; diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java index 412b9fa30f..6304fb4016 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/RebalanceHP.java @@ -74,12 +74,18 @@ public final class RebalanceHP extends AbstractEffect currentHPs += member.getCurrentHp(); } - final L2Summon summon = member.getSummon(); + final L2Summon summon = member.getPet(); if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) { fullHP += summon.getMaxHp(); currentHPs += summon.getCurrentHp(); } + + for (L2Summon servitors : member.getServitors().values()) + { + fullHP += servitors.getMaxHp(); + currentHPs += servitors.getCurrentHp(); + } } double percentHP = currentHPs / fullHP; @@ -104,7 +110,7 @@ public final class RebalanceHP extends AbstractEffect member.setCurrentHp(newHP); } - final L2Summon summon = member.getSummon(); + final L2Summon summon = member.getPet(); if ((summon != null) && (!summon.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true))) { double newHP = summon.getMaxHp() * percentHP; @@ -122,6 +128,27 @@ public final class RebalanceHP extends AbstractEffect } summon.setCurrentHp(newHP); } + + for (L2Summon servitors : member.getServitors().values()) + { + if (!servitors.isDead() && Util.checkIfInRange(skill.getAffectRange(), effector, summon, true)) + { + double newHP = servitors.getMaxHp() * percentHP; + if (newHP > servitors.getCurrentHp()) // The target gets healed + { + // The heal will be blocked if the current hp passes the limit + if (servitors.getCurrentHp() > servitors.getMaxRecoverableHp()) + { + newHP = servitors.getCurrentHp(); + } + else if (newHP > servitors.getMaxRecoverableHp()) + { + newHP = servitors.getMaxRecoverableHp(); + } + } + servitors.setCurrentHp(newHP); + } + } } } } diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/Reeling.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/Reeling.java index 70c3f07535..fa0a9c8fc1 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/Reeling.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/Reeling.java @@ -18,7 +18,7 @@ */ package handlers.effecthandlers; -import com.l2jserver.gameserver.datatables.FishingRodsData; +import com.l2jserver.gameserver.data.xml.impl.FishingRodsData; import com.l2jserver.gameserver.enums.ShotType; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.L2Character; diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/ServitorShare.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/ServitorShare.java index d618a8af95..9f385fc726 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/ServitorShare.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/ServitorShare.java @@ -21,6 +21,7 @@ package handlers.effecthandlers; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.conditions.Condition; import com.l2jserver.gameserver.model.effects.AbstractEffect; import com.l2jserver.gameserver.model.effects.EffectFlag; @@ -73,7 +74,8 @@ public final class ServitorShare extends AbstractEffect @Override public void onExit(BuffInfo info) { - final L2Character effected = info.getEffected().isPlayer() ? info.getEffected().getSummon() : info.getEffected().getActingPlayer(); + final L2Character effected = info.getEffected().isSummon() ? ((L2Summon) info.getEffected()).getOwner() : info.getEffected(); + if (effected != null) { ThreadPoolManager.getInstance().scheduleEffect(new ScheduledEffectExitTask(effected, info.getSkill().getId()), 100); diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/Spoil.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/Spoil.java index fb8c526b58..2e6460ed68 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/Spoil.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/Spoil.java @@ -60,14 +60,13 @@ public final class Spoil extends AbstractEffect } final L2MonsterInstance target = (L2MonsterInstance) info.getEffected(); - if (target.isSpoil()) + if (target.isSpoiled()) { info.getEffector().sendPacket(SystemMessageId.IT_HAS_ALREADY_BEEN_SPOILED); return; } - target.setSpoil(true); - target.setIsSpoiledBy(info.getEffector().getObjectId()); + target.setSpoilerObjectId(info.getEffector().getObjectId()); info.getEffector().sendPacket(SystemMessageId.THE_SPOIL_CONDITION_HAS_BEEN_ACTIVATED); target.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, info.getEffector()); } diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/Summon.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/Summon.java index 11d8c202c4..4553d257f3 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/Summon.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/Summon.java @@ -18,8 +18,8 @@ */ package handlers.effecthandlers; -import com.l2jserver.gameserver.datatables.ExperienceTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.StatsSet; @@ -42,6 +42,7 @@ public final class Summon extends AbstractEffect private final ItemHolder _consumeItem; private final int _lifeTime; private final int _consumeItemInterval; + private final int _summonPoints; public Summon(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) { @@ -57,6 +58,7 @@ public final class Summon extends AbstractEffect _consumeItem = new ItemHolder(params.getInt("consumeItemId", 0), params.getInt("consumeItemCount", 1)); _consumeItemInterval = params.getInt("consumeItemInterval", 0); _lifeTime = params.getInt("lifeTime", 3600) * 1000; + _summonPoints = params.getInt("summonPoints", 0); } @Override @@ -68,7 +70,7 @@ public final class Summon extends AbstractEffect @Override public void onStart(BuffInfo info) { - if (!info.getEffected().isPlayer() || info.getEffected().hasSummon()) + if (!info.getEffected().isPlayer()) { return; } @@ -86,22 +88,30 @@ public final class Summon extends AbstractEffect summon.setItemConsume(_consumeItem); summon.setItemConsumeInterval(consumeItemInterval); - if (summon.getLevel() >= ExperienceTable.getInstance().getMaxPetLevel()) + if (summon.getLevel() >= ExperienceData.getInstance().getMaxPetLevel()) { - summon.getStat().setExp(ExperienceTable.getInstance().getExpForLevel(ExperienceTable.getInstance().getMaxPetLevel() - 1)); - _log.warning(Summon.class.getSimpleName() + ": (" + summon.getName() + ") NpcID: " + summon.getId() + " has a level above " + ExperienceTable.getInstance().getMaxPetLevel() + ". Please rectify."); + summon.getStat().setExp(ExperienceData.getInstance().getExpForLevel(ExperienceData.getInstance().getMaxPetLevel() - 1)); + _log.warning(Summon.class.getSimpleName() + ": (" + summon.getName() + ") NpcID: " + summon.getId() + " has a level above " + ExperienceData.getInstance().getMaxPetLevel() + ". Please rectify."); } else { - summon.getStat().setExp(ExperienceTable.getInstance().getExpForLevel(summon.getLevel() % ExperienceTable.getInstance().getMaxPetLevel())); + summon.getStat().setExp(ExperienceData.getInstance().getExpForLevel(summon.getLevel() % ExperienceData.getInstance().getMaxPetLevel())); } summon.setCurrentHp(summon.getMaxHp()); summon.setCurrentMp(summon.getMaxMp()); summon.setHeading(player.getHeading()); + summon.setSummonPoints(_summonPoints); - player.setPet(summon); - + if (summon.isPet()) + { + player.setPet(summon); + } + else + { + player.addServitor(summon); + } + summon.setShowSummonAnimation(true); summon.setRunning(); summon.spawnMe(); } diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java index e4ecf062d3..0597e6db95 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java @@ -18,7 +18,7 @@ */ package handlers.effecthandlers; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.Location; diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonPet.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonPet.java index 9a36e6fec8..dba19b71d2 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonPet.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonPet.java @@ -20,8 +20,8 @@ package handlers.effecthandlers; import java.util.logging.Level; -import com.l2jserver.gameserver.datatables.NpcData; -import com.l2jserver.gameserver.datatables.PetDataTable; +import com.l2jserver.gameserver.data.xml.impl.NpcData; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; import com.l2jserver.gameserver.model.L2PetData; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -69,7 +69,7 @@ public final class SummonPet extends AbstractEffect final L2PcInstance player = info.getEffector().getActingPlayer(); - if ((player.hasSummon() || player.isMounted())) + if (player.hasPet() || player.isMounted()) { player.sendPacket(SystemMessageId.YOU_ALREADY_HAVE_A_PET); return; diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonTrap.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonTrap.java index 87cad01bed..41e44a87a4 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonTrap.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/SummonTrap.java @@ -18,7 +18,7 @@ */ package handlers.effecthandlers; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/TeleportToTarget.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/TeleportToTarget.java index 284a5255fa..c5c5799fc7 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/TeleportToTarget.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/TeleportToTarget.java @@ -18,7 +18,6 @@ */ package handlers.effecthandlers; -import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.model.Location; @@ -80,11 +79,8 @@ public final class TeleportToTarget extends AbstractEffect int x = (int) (px + (25 * Math.cos(ph))); int y = (int) (py + (25 * Math.sin(ph))); int z = target.getZ(); - Location loc = new Location(x, y, z); - if (Config.GEODATA > 0) - { - loc = GeoData.getInstance().moveCheck(activeChar.getX(), activeChar.getY(), activeChar.getZ(), x, y, z, activeChar.getInstanceId()); - } + + final Location loc = GeoData.getInstance().moveCheck(activeChar.getX(), activeChar.getY(), activeChar.getZ(), x, y, z, activeChar.getInstanceId()); activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); activeChar.broadcastPacket(new FlyToLocation(activeChar, loc.getX(), loc.getY(), loc.getZ(), FlyType.DUMMY)); diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/ThrowUp.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/ThrowUp.java index e71f399d27..0552d4f331 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/ThrowUp.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/ThrowUp.java @@ -18,7 +18,6 @@ */ package handlers.effecthandlers; -import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.StatsSet; @@ -98,16 +97,11 @@ public final class ThrowUp extends AbstractEffect int y = info.getEffector().getY() - (int) (offset * sin); int z = info.getEffected().getZ(); - if (Config.GEODATA > 0) - { - Location destiny = GeoData.getInstance().moveCheck(info.getEffected().getX(), info.getEffected().getY(), info.getEffected().getZ(), x, y, z, info.getEffected().getInstanceId()); - x = destiny.getX(); - y = destiny.getY(); - } + final Location destination = GeoData.getInstance().moveCheck(info.getEffected().getX(), info.getEffected().getY(), info.getEffected().getZ(), x, y, z, info.getEffected().getInstanceId()); - info.getEffected().broadcastPacket(new FlyToLocation(info.getEffected(), x, y, z, FlyType.THROW_UP)); + info.getEffected().broadcastPacket(new FlyToLocation(info.getEffected(), destination, FlyType.THROW_UP)); // TODO: Review. - info.getEffected().setXYZ(x, y, z); + info.getEffected().setXYZ(destination); info.getEffected().broadcastPacket(new ValidateLocation(info.getEffected())); } } diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/Transformation.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/Transformation.java index 7177276703..e4a3539349 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/Transformation.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/Transformation.java @@ -18,7 +18,7 @@ */ package handlers.effecthandlers; -import com.l2jserver.gameserver.datatables.TransformData; +import com.l2jserver.gameserver.data.xml.impl.TransformData; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.conditions.Condition; import com.l2jserver.gameserver.model.effects.AbstractEffect; diff --git a/trunk/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java b/trunk/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java index 7ec122a247..2f2025c9ca 100644 --- a/trunk/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java +++ b/trunk/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java @@ -74,17 +74,16 @@ public final class Unsummon extends AbstractEffect @Override public void onStart(BuffInfo info) { - final L2Summon summon = info.getEffected().getSummon(); - - if (summon != null) + if (info.getEffected().isServitor()) { - final L2PcInstance summonOwner = summon.getOwner(); + final L2Summon servitor = (L2Summon) info.getEffected(); + final L2PcInstance summonOwner = servitor.getOwner(); - summon.abortAttack(); - summon.abortCast(); - summon.stopAllEffects(); + servitor.abortAttack(); + servitor.abortCast(); + servitor.stopAllEffects(); - summon.unSummon(summonOwner); + servitor.unSummon(summonOwner); summonOwner.sendPacket(SystemMessageId.YOUR_SERVITOR_HAS_VANISHED_YOU_LL_NEED_TO_SUMMON_A_NEW_ONE); } } diff --git a/trunk/dist/game/data/scripts/handlers/itemhandlers/BeastSoulShot.java b/trunk/dist/game/data/scripts/handlers/itemhandlers/BeastSoulShot.java index 06380383c9..df23688242 100644 --- a/trunk/dist/game/data/scripts/handlers/itemhandlers/BeastSoulShot.java +++ b/trunk/dist/game/data/scripts/handlers/itemhandlers/BeastSoulShot.java @@ -18,11 +18,14 @@ */ package handlers.itemhandlers; +import java.util.List; import java.util.logging.Level; +import java.util.stream.Collectors; import com.l2jserver.gameserver.enums.ShotType; import com.l2jserver.gameserver.handler.IItemHandler; import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; @@ -52,16 +55,40 @@ public class BeastSoulShot implements IItemHandler return false; } - if (activeOwner.getSummon().isDead()) + final L2Summon pet = playable.getPet(); + if ((pet != null) && pet.isDead()) + { + activeOwner.sendPacket(SystemMessageId.SOULSHOTS_AND_SPIRITSHOTS_ARE_NOT_AVAILABLE_FOR_A_DEAD_PET_OR_SERVITOR_SAD_ISN_T_IT); + return false; + } + + final List aliveServitor = playable.getServitors().values().stream().filter(s -> !s.isDead()).collect(Collectors.toList()); + if (aliveServitor.isEmpty()) { activeOwner.sendPacket(SystemMessageId.SOULSHOTS_AND_SPIRITSHOTS_ARE_NOT_AVAILABLE_FOR_A_DEAD_PET_OR_SERVITOR_SAD_ISN_T_IT); return false; } final int itemId = item.getId(); - final short shotConsumption = activeOwner.getSummon().getSoulShotsPerHit(); final long shotCount = item.getCount(); final SkillHolder[] skills = item.getItem().getSkills(); + short shotConsumption = 0; + + if (pet != null) + { + if (!pet.isChargedShot(ShotType.SOULSHOTS)) + { + shotConsumption += pet.getSoulShotsPerHit(); + } + } + + for (L2Summon servitors : aliveServitor) + { + if (!servitors.isChargedShot(ShotType.SOULSHOTS)) + { + shotConsumption += servitors.getSoulShotsPerHit(); + } + } if (skills == null) { @@ -79,12 +106,6 @@ public class BeastSoulShot implements IItemHandler return false; } - if (activeOwner.getSummon().isChargedShot(ShotType.SOULSHOTS)) - { - // SoulShots are already active. - return false; - } - // If the player doesn't have enough beast soulshot remaining, remove any auto soulshot task. if (!activeOwner.destroyItemWithoutTrace("Consume", item.getObjectId(), shotConsumption, null, false)) { @@ -97,9 +118,23 @@ public class BeastSoulShot implements IItemHandler // Pet uses the power of spirit. activeOwner.sendPacket(SystemMessageId.YOUR_PET_USES_SPIRITSHOT); - activeOwner.getSummon().setChargedShot(ShotType.SOULSHOTS, true); + if (pet != null) + { + if (!pet.isChargedShot(ShotType.SOULSHOTS)) + { + pet.setChargedShot(ShotType.SOULSHOTS, true); + Broadcast.toSelfAndKnownPlayersInRadius(activeOwner, new MagicSkillUse(pet, pet, skills[0].getSkillId(), skills[0].getSkillLvl(), 0, 0), 600); + } + } - Broadcast.toSelfAndKnownPlayersInRadius(activeOwner, new MagicSkillUse(activeOwner.getSummon(), activeOwner.getSummon(), skills[0].getSkillId(), skills[0].getSkillLvl(), 0, 0), 600); + aliveServitor.forEach(s -> + { + if (!s.isChargedShot(ShotType.SOULSHOTS)) + { + s.setChargedShot(ShotType.SOULSHOTS, true); + Broadcast.toSelfAndKnownPlayersInRadius(activeOwner, new MagicSkillUse(s, s, skills[0].getSkillId(), skills[0].getSkillLvl(), 0, 0), 600); + } + }); return true; } } diff --git a/trunk/dist/game/data/scripts/handlers/itemhandlers/BeastSpiritShot.java b/trunk/dist/game/data/scripts/handlers/itemhandlers/BeastSpiritShot.java index 31b6b055fb..339b7355df 100644 --- a/trunk/dist/game/data/scripts/handlers/itemhandlers/BeastSpiritShot.java +++ b/trunk/dist/game/data/scripts/handlers/itemhandlers/BeastSpiritShot.java @@ -18,11 +18,14 @@ */ package handlers.itemhandlers; +import java.util.List; import java.util.logging.Level; +import java.util.stream.Collectors; import com.l2jserver.gameserver.enums.ShotType; import com.l2jserver.gameserver.handler.IItemHandler; import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; @@ -52,7 +55,15 @@ public class BeastSpiritShot implements IItemHandler return false; } - if (activeOwner.getSummon().isDead()) + final L2Summon pet = playable.getPet(); + if ((pet != null) && pet.isDead()) + { + activeOwner.sendPacket(SystemMessageId.SOULSHOTS_AND_SPIRITSHOTS_ARE_NOT_AVAILABLE_FOR_A_DEAD_PET_OR_SERVITOR_SAD_ISN_T_IT); + return false; + } + + final List aliveServitor = playable.getServitors().values().stream().filter(s -> !s.isDead()).collect(Collectors.toList()); + if (aliveServitor.isEmpty()) { activeOwner.sendPacket(SystemMessageId.SOULSHOTS_AND_SPIRITSHOTS_ARE_NOT_AVAILABLE_FOR_A_DEAD_PET_OR_SERVITOR_SAD_ISN_T_IT); return false; @@ -60,9 +71,27 @@ public class BeastSpiritShot implements IItemHandler final int itemId = item.getId(); final boolean isBlessed = ((itemId == 6647) || (itemId == 20334)); // TODO: Unhardcode these! - final short shotConsumption = activeOwner.getSummon().getSpiritShotsPerHit(); final SkillHolder[] skills = item.getItem().getSkills(); + final ShotType shotType = isBlessed ? ShotType.BLESSED_SPIRITSHOTS : ShotType.SPIRITSHOTS; + + short shotConsumption = 0; + if (pet != null) + { + if (!pet.isChargedShot(shotType)) + { + shotConsumption += pet.getSpiritShotsPerHit(); + } + } + + for (L2Summon servitors : aliveServitor) + { + if (!servitors.isChargedShot(shotType)) + { + shotConsumption += servitors.getSpiritShotsPerHit(); + } + } + if (skills == null) { _log.log(Level.WARNING, getClass().getSimpleName() + ": is missing skills!"); @@ -80,12 +109,6 @@ public class BeastSpiritShot implements IItemHandler return false; } - if (activeOwner.getSummon().isChargedShot(isBlessed ? ShotType.BLESSED_SPIRITSHOTS : ShotType.SPIRITSHOTS)) - { - // shots are already active. - return false; - } - if (!activeOwner.destroyItemWithoutTrace("Consume", item.getObjectId(), shotConsumption, null, false)) { if (!activeOwner.disableAutoShot(itemId)) @@ -97,9 +120,23 @@ public class BeastSpiritShot implements IItemHandler // Pet uses the power of spirit. activeOwner.sendPacket(SystemMessageId.YOUR_PET_USES_SPIRITSHOT); - activeOwner.getSummon().setChargedShot(isBlessed ? ShotType.BLESSED_SPIRITSHOTS : ShotType.SPIRITSHOTS, true); + if (pet != null) + { + if (!pet.isChargedShot(shotType)) + { + pet.setChargedShot(shotType, true); + Broadcast.toSelfAndKnownPlayersInRadius(activeOwner, new MagicSkillUse(pet, pet, skills[0].getSkillId(), skills[0].getSkillLvl(), 0, 0), 600); + } + } - Broadcast.toSelfAndKnownPlayersInRadius(activeOwner, new MagicSkillUse(activeOwner.getSummon(), activeOwner.getSummon(), skills[0].getSkillId(), skills[0].getSkillLvl(), 0, 0), 600); + aliveServitor.forEach(s -> + { + if (!s.isChargedShot(shotType)) + { + s.setChargedShot(shotType, true); + Broadcast.toSelfAndKnownPlayersInRadius(activeOwner, new MagicSkillUse(s, s, skills[0].getSkillId(), skills[0].getSkillLvl(), 0, 0), 600); + } + }); return true; } } diff --git a/trunk/dist/game/data/scripts/handlers/itemhandlers/PetFood.java b/trunk/dist/game/data/scripts/handlers/itemhandlers/PetFood.java index e7765aa3f9..6a0b79b961 100644 --- a/trunk/dist/game/data/scripts/handlers/itemhandlers/PetFood.java +++ b/trunk/dist/game/data/scripts/handlers/itemhandlers/PetFood.java @@ -21,7 +21,7 @@ package handlers.itemhandlers; import java.util.List; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.PetDataTable; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.handler.IItemHandler; import com.l2jserver.gameserver.model.actor.L2Playable; diff --git a/trunk/dist/game/data/scripts/handlers/itemhandlers/Recipes.java b/trunk/dist/game/data/scripts/handlers/itemhandlers/Recipes.java index a23e522e8e..213c16086a 100644 --- a/trunk/dist/game/data/scripts/handlers/itemhandlers/Recipes.java +++ b/trunk/dist/game/data/scripts/handlers/itemhandlers/Recipes.java @@ -18,7 +18,7 @@ */ package handlers.itemhandlers; -import com.l2jserver.gameserver.datatables.RecipeData; +import com.l2jserver.gameserver.data.xml.impl.RecipeData; import com.l2jserver.gameserver.handler.IItemHandler; import com.l2jserver.gameserver.model.L2RecipeList; import com.l2jserver.gameserver.model.actor.L2Playable; diff --git a/trunk/dist/game/data/scripts/handlers/itemhandlers/SummonItems.java b/trunk/dist/game/data/scripts/handlers/itemhandlers/SummonItems.java index d559b9e747..296558be71 100644 --- a/trunk/dist/game/data/scripts/handlers/itemhandlers/SummonItems.java +++ b/trunk/dist/game/data/scripts/handlers/itemhandlers/SummonItems.java @@ -18,7 +18,7 @@ */ package handlers.itemhandlers; -import com.l2jserver.gameserver.datatables.PetDataTable; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; import com.l2jserver.gameserver.model.L2PetData; import com.l2jserver.gameserver.model.actor.L2Playable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -58,7 +58,7 @@ public class SummonItems extends ItemSkillsTemplate return false; } - if (activeChar.hasSummon() || activeChar.isMounted()) + if (activeChar.hasPet() || activeChar.isMounted()) { activeChar.sendPacket(SystemMessageId.YOU_ALREADY_HAVE_A_PET); return false; diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/AreaFriendly.java b/trunk/dist/game/data/scripts/handlers/targethandlers/AreaFriendly.java index f321abb3d1..03fc0c9b76 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/AreaFriendly.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/AreaFriendly.java @@ -24,7 +24,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.handler.ITargetTypeHandler; import com.l2jserver.gameserver.model.L2Object; @@ -99,7 +98,7 @@ public class AreaFriendly implements ITargetTypeHandler private boolean checkTarget(L2Character activeChar, L2Character target) { - if ((Config.GEODATA > 0) && !GeoData.getInstance().canSeeTarget(activeChar, target)) + if (!GeoData.getInstance().canSeeTarget(activeChar, target)) { return false; } diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/AreaSummon.java b/trunk/dist/game/data/scripts/handlers/targethandlers/AreaSummon.java index 0057037362..94108a7fbe 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/AreaSummon.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/AreaSummon.java @@ -39,7 +39,6 @@ public class AreaSummon implements ITargetTypeHandler public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) { List targetList = new ArrayList<>(); - target = activeChar.getSummon(); if ((target == null) || !target.isServitor() || target.isDead()) { return EMPTY_TARGET_LIST; @@ -47,10 +46,13 @@ public class AreaSummon implements ITargetTypeHandler if (onlyFirst) { - return new L2Character[] + if (activeChar.hasSummon()) { - target - }; + return new L2Character[] + { + activeChar.getServitors().values().stream().findFirst().orElse(activeChar.getPet()) + }; + } } final boolean srcInArena = (activeChar.isInsideZone(ZoneId.PVP) && !activeChar.isInsideZone(ZoneId.SIEGE)); diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/Clan.java b/trunk/dist/game/data/scripts/handlers/targethandlers/Clan.java index 6aacc18d84..3922eacaac 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/Clan.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/Clan.java @@ -74,11 +74,19 @@ public class Clan implements ITargetTypeHandler final int radius = skill.getAffectRange(); final L2Clan clan = player.getClan(); - if (Skill.addSummon(activeChar, player, radius, false)) + if (Skill.addPet(activeChar, player, radius, false)) { - targetList.add(player.getSummon()); + targetList.add(player.getPet()); } + player.getServitors().values().forEach(s -> + { + if (Skill.addCharacter(activeChar, s, radius, false)) + { + targetList.add(s); + } + }); + if (clan != null) { L2PcInstance obj; @@ -114,11 +122,19 @@ public class Clan implements ITargetTypeHandler continue; } - if (!onlyFirst && Skill.addSummon(activeChar, obj, radius, false)) + if (Skill.addPet(activeChar, obj, radius, false)) { - targetList.add(obj.getSummon()); + targetList.add(obj.getPet()); } + obj.getServitors().values().forEach(s -> + { + if (Skill.addCharacter(activeChar, s, radius, false)) + { + targetList.add(s); + } + }); + if (!Skill.addCharacter(activeChar, obj, radius, false)) { continue; diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/CommandChannel.java b/trunk/dist/game/data/scripts/handlers/targethandlers/CommandChannel.java index 599709ae91..da465cf27a 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/CommandChannel.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/CommandChannel.java @@ -50,11 +50,19 @@ public class CommandChannel implements ITargetTypeHandler final L2Party party = player.getParty(); final boolean hasChannel = (party != null) && party.isInCommandChannel(); - if (Skill.addSummon(activeChar, player, radius, false)) + if (Skill.addPet(activeChar, player, radius, false)) { - targetList.add(player.getSummon()); + targetList.add(player.getPet()); } + player.getServitors().values().forEach(s -> + { + if (Skill.addCharacter(activeChar, s, radius, false)) + { + targetList.add(s); + } + }); + // if player in not in party if (party == null) { diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/EnemySummon.java b/trunk/dist/game/data/scripts/handlers/targethandlers/EnemySummon.java index 28e25f809a..28461b971c 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/EnemySummon.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/EnemySummon.java @@ -37,7 +37,7 @@ public class EnemySummon implements ITargetTypeHandler if (target.isSummon()) { L2Summon targetSummon = (L2Summon) target; - if ((activeChar.isPlayer() && (activeChar.getSummon() != targetSummon) && !targetSummon.isDead() && ((targetSummon.getOwner().getPvpFlag() != 0) || (targetSummon.getOwner().getKarma() > 0))) || (targetSummon.getOwner().isInsideZone(ZoneId.PVP) && activeChar.getActingPlayer().isInsideZone(ZoneId.PVP)) || (targetSummon.getOwner().isInDuel() && activeChar.getActingPlayer().isInDuel() && (targetSummon.getOwner().getDuelId() == activeChar.getActingPlayer().getDuelId()))) + if ((activeChar.isPlayer() && (activeChar.getPet() != targetSummon) && activeChar.hasServitor(targetSummon.getObjectId()) && !targetSummon.isDead() && ((targetSummon.getOwner().getPvpFlag() != 0) || (targetSummon.getOwner().getKarma() > 0))) || (targetSummon.getOwner().isInsideZone(ZoneId.PVP) && activeChar.getActingPlayer().isInsideZone(ZoneId.PVP)) || (targetSummon.getOwner().isInDuel() && activeChar.getActingPlayer().isInDuel() && (targetSummon.getOwner().getDuelId() == activeChar.getActingPlayer().getDuelId()))) { return new L2Character[] { diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/OneFriendly.java b/trunk/dist/game/data/scripts/handlers/targethandlers/OneFriendly.java new file mode 100644 index 0000000000..4adea04d5b --- /dev/null +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/OneFriendly.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2004-2015 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package handlers.targethandlers; + +import com.l2jserver.gameserver.handler.ITargetTypeHandler; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2SiegeFlagInstance; +import com.l2jserver.gameserver.model.skills.Skill; +import com.l2jserver.gameserver.model.skills.targets.L2TargetType; +import com.l2jserver.gameserver.network.SystemMessageId; + +/** + * @author St3eT + */ +public final class OneFriendly implements ITargetTypeHandler +{ + @Override + public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) + { + // Check for null target or any other invalid target + if ((target == null) || target.isDead()) + { + activeChar.sendPacket(SystemMessageId.THAT_IS_AN_INCORRECT_TARGET); + return EMPTY_TARGET_LIST; + } + + if (!checkTarget(activeChar, target)) + { + activeChar.sendPacket(SystemMessageId.THAT_IS_AN_INCORRECT_TARGET); + return EMPTY_TARGET_LIST; + } + + // If a target is found, return it in a table else send a system message TARGET_IS_INCORRECT + return new L2Character[] + { + target + }; + } + + private boolean checkTarget(L2Character activeChar, L2Character target) + { + if ((target == null) || target.isAlikeDead() || target.isDoor() || (target instanceof L2SiegeFlagInstance) || target.isMonster()) + { + return false; + } + + if ((target.getActingPlayer() != null) && (target.getActingPlayer() != activeChar) && (target.getActingPlayer().inObserverMode() || target.getActingPlayer().isInOlympiadMode())) + { + return false; + } + + if (target.isPlayable()) + { + boolean friendly = false; + + if ((activeChar.getAllyId() > 0) && (activeChar.getAllyId() == target.getActingPlayer().getAllyId())) + { + friendly = true; + } + else if ((activeChar.getClanId() > 0) && (activeChar.getClanId() == target.getActingPlayer().getClanId())) + { + friendly = true; + } + else if (activeChar.isInParty() && activeChar.getParty().containsPlayer(target.getActingPlayer())) + { + friendly = true; + } + else if ((target != activeChar) && (target.getActingPlayer().getPvpFlag() == 0)) + { + friendly = true; + } + return friendly; + } + return true; + } + + @Override + public Enum getTargetType() + { + return L2TargetType.ONE_FRIENDLY; + } +} \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/Party.java b/trunk/dist/game/data/scripts/handlers/targethandlers/Party.java index 9c14a3a7ad..ec3fb65ecd 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/Party.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/Party.java @@ -58,10 +58,18 @@ public class Party implements ITargetTypeHandler } else if (activeChar.isPlayer()) { - if (Skill.addSummon(activeChar, player, radius, false)) + if (Skill.addPet(activeChar, player, radius, false)) { - targetList.add(player.getSummon()); + targetList.add(player.getPet()); } + + player.getServitors().values().forEach(s -> + { + if (Skill.addCharacter(activeChar, s, radius, false)) + { + targetList.add(s); + } + }); } if (activeChar.isInParty()) @@ -79,10 +87,18 @@ public class Party implements ITargetTypeHandler targetList.add(partyMember); } - if (Skill.addSummon(activeChar, partyMember, radius, false)) + if (Skill.addPet(activeChar, partyMember, radius, false)) { - targetList.add(partyMember.getSummon()); + targetList.add(partyMember.getPet()); } + + partyMember.getServitors().values().forEach(s -> + { + if (Skill.addCharacter(activeChar, s, radius, false)) + { + targetList.add(s); + } + }); } } return targetList.toArray(new L2Character[targetList.size()]); diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/PartyClan.java b/trunk/dist/game/data/scripts/handlers/targethandlers/PartyClan.java index dd8a3efde0..9dfa3490cf 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/PartyClan.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/PartyClan.java @@ -60,11 +60,19 @@ public class PartyClan implements ITargetTypeHandler final boolean hasClan = player.getClan() != null; final boolean hasParty = player.isInParty(); - if (Skill.addSummon(activeChar, player, radius, false)) + if (Skill.addPet(activeChar, player, radius, false)) { - targetList.add(player.getSummon()); + targetList.add(player.getPet()); } + player.getServitors().values().forEach(s -> + { + if (Skill.addCharacter(activeChar, s, radius, false)) + { + targetList.add(s); + } + }); + // if player in clan and not in party if (!(hasClan || hasParty)) { @@ -128,24 +136,24 @@ public class PartyClan implements ITargetTypeHandler continue; } - if (!onlyFirst && Skill.addSummon(activeChar, obj, radius, false)) + if (Skill.addPet(activeChar, obj, radius, false)) { - targetList.add(obj.getSummon()); + targetList.add(obj.getPet()); } + obj.getServitors().values().forEach(s -> + { + if (Skill.addCharacter(activeChar, s, radius, false)) + { + targetList.add(s); + } + }); + if (!Skill.addCharacter(activeChar, obj, radius, false)) { continue; } - if (onlyFirst) - { - return new L2Character[] - { - obj - }; - } - if ((maxTargets > 0) && (targetList.size() >= maxTargets)) { break; diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/PartyMember.java b/trunk/dist/game/data/scripts/handlers/targethandlers/PartyMember.java index 9127b87ff3..c162c7d7b6 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/PartyMember.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/PartyMember.java @@ -40,7 +40,7 @@ public class PartyMember implements ITargetTypeHandler } if (!target.isDead()) { - if ((target == activeChar) || (activeChar.isInParty() && target.isInParty() && (activeChar.getParty().getLeaderObjectId() == target.getParty().getLeaderObjectId())) || (activeChar.isPlayer() && target.isSummon() && (activeChar.getSummon() == target)) || (activeChar.isSummon() && target.isPlayer() && (activeChar == target.getSummon()))) + if ((target == activeChar) || (activeChar.isInParty() && target.isInParty() && (activeChar.getParty().getLeaderObjectId() == target.getParty().getLeaderObjectId())) || ((activeChar.isPlayer() && target.isSummon() && ((activeChar.getPet() == target) || activeChar.hasServitor(target.getObjectId()))) || (activeChar.isSummon() && target.isPlayer() && ((activeChar == target.getPet()) || target.hasServitor(activeChar.getObjectId()))))) { return new L2Character[] { diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/PartyNotMe.java b/trunk/dist/game/data/scripts/handlers/targethandlers/PartyNotMe.java index df9d83760e..85e7f3371d 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/PartyNotMe.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/PartyNotMe.java @@ -39,16 +39,13 @@ public class PartyNotMe implements ITargetTypeHandler public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) { final List targetList = new ArrayList<>(); + final int radius = skill.getAffectRange(); if (activeChar.getParty() != null) { final List partyList = activeChar.getParty().getMembers(); for (L2PcInstance partyMember : partyList) { - if ((partyMember == null) || partyMember.isDead()) - { - continue; - } - else if (partyMember == activeChar) + if (partyMember == activeChar) { continue; } @@ -56,18 +53,28 @@ public class PartyNotMe implements ITargetTypeHandler { continue; } - else if ((skill.getAffectRange() > 0) && !Util.checkIfInRange(skill.getAffectRange(), activeChar, partyMember, true)) - { - continue; - } else { - targetList.add(partyMember); - if ((partyMember.getSummon() != null) && !partyMember.getSummon().isDead()) + if (Skill.addPet(activeChar, partyMember, radius, false)) { - targetList.add(partyMember.getSummon()); + targetList.add(partyMember.getPet()); } + + partyMember.getServitors().values().forEach(s -> + { + if (Skill.addCharacter(activeChar, s, radius, false)) + { + targetList.add(s); + } + }); + + if (Skill.addCharacter(activeChar, partyMember, radius, false)) + { + targetList.add(partyMember); + } + + targetList.add(partyMember); } } } diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/PcBody.java b/trunk/dist/game/data/scripts/handlers/targethandlers/PcBody.java index 765a8eb06e..6dcaa06733 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/PcBody.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/PcBody.java @@ -95,7 +95,7 @@ public class PcBody implements ITargetTypeHandler if (!onlyFirst) { targetList.add(target); - return targetList.toArray(new L2Object[targetList.size()]); + return targetList.toArray(new L2Character[targetList.size()]); } return new L2Character[] { diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/Pet.java b/trunk/dist/game/data/scripts/handlers/targethandlers/Pet.java index aa5ee9d6d5..79e113882f 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/Pet.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/Pet.java @@ -21,6 +21,7 @@ package handlers.targethandlers; import com.l2jserver.gameserver.handler.ITargetTypeHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.model.skills.targets.L2TargetType; @@ -33,11 +34,12 @@ public class Pet implements ITargetTypeHandler @Override public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) { - if (activeChar.hasPet()) + final L2Summon pet = activeChar.getPet(); + if (pet != null) { return new L2Character[] { - activeChar.getSummon() + pet }; } return EMPTY_TARGET_LIST; diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/Servitor.java b/trunk/dist/game/data/scripts/handlers/targethandlers/Servitor.java index e0246f0d6c..d51d37f735 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/Servitor.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/Servitor.java @@ -33,12 +33,10 @@ public class Servitor implements ITargetTypeHandler @Override public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target) { - if (activeChar.hasServitor()) + if (activeChar.hasServitors()) { - return new L2Character[] - { - activeChar.getSummon() - }; + return activeChar.getServitors().values().toArray(new L2Character[activeChar.getServitors().size()]); + } return EMPTY_TARGET_LIST; } diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/Summon.java b/trunk/dist/game/data/scripts/handlers/targethandlers/Summon.java index d663833dc7..e81f4241a5 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/Summon.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/Summon.java @@ -18,6 +18,9 @@ */ package handlers.targethandlers; +import java.util.ArrayList; +import java.util.List; + import com.l2jserver.gameserver.handler.ITargetTypeHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Character; @@ -35,10 +38,21 @@ public class Summon implements ITargetTypeHandler { if (activeChar.hasSummon()) { - return new L2Character[] + if (!activeChar.hasPet() && activeChar.hasServitors()) { - activeChar.getSummon() - }; + return activeChar.getServitors().values().toArray(new L2Character[0]); + } + else if (activeChar.hasPet() && !activeChar.hasServitors()) + { + return new L2Character[] + { + activeChar.getPet() + }; + } + final List targets = new ArrayList<>(1 + activeChar.getServitors().size()); + targets.add(activeChar.getPet()); + targets.addAll(activeChar.getServitors().values()); + return targets.toArray(new L2Character[0]); } return EMPTY_TARGET_LIST; } diff --git a/trunk/dist/game/data/scripts/handlers/targethandlers/TargetParty.java b/trunk/dist/game/data/scripts/handlers/targethandlers/TargetParty.java index 9b6c7d8083..a951a0e2ca 100644 --- a/trunk/dist/game/data/scripts/handlers/targethandlers/TargetParty.java +++ b/trunk/dist/game/data/scripts/handlers/targethandlers/TargetParty.java @@ -63,10 +63,18 @@ public class TargetParty implements ITargetTypeHandler targetList.add(partyMember); } - if (Skill.addSummon(player, partyMember, radius, false)) + if (Skill.addPet(player, partyMember, radius, false)) { - targetList.add(partyMember.getSummon()); + targetList.add(partyMember.getPet()); } + + partyMember.getServitors().values().forEach(s -> + { + if (Skill.addCharacter(activeChar, s, radius, false)) + { + targetList.add(s); + } + }); } } else diff --git a/trunk/dist/game/data/scripts/handlers/telnethandlers/ChatsHandler.java b/trunk/dist/game/data/scripts/handlers/telnethandlers/ChatsHandler.java index c80e8147d7..efbb1529d3 100644 --- a/trunk/dist/game/data/scripts/handlers/telnethandlers/ChatsHandler.java +++ b/trunk/dist/game/data/scripts/handlers/telnethandlers/ChatsHandler.java @@ -22,7 +22,7 @@ import java.io.PrintWriter; import java.net.Socket; import java.util.StringTokenizer; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.handler.ITelnetHandler; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -90,7 +90,7 @@ public class ChatsHandler implements ITelnetHandler { command = command.substring(7); CreatureSay cs = new CreatureSay(0, Say2.ALLIANCE, "Telnet GM Broadcast from " + _cSocket.getInetAddress().getHostAddress(), command); - AdminTable.getInstance().broadcastToGMs(cs); + AdminData.getInstance().broadcastToGMs(cs); _print.println("Your Message Has Been Sent To " + getOnlineGMS() + " GM(s)."); } catch (StringIndexOutOfBoundsException e) @@ -103,7 +103,7 @@ public class ChatsHandler implements ITelnetHandler private int getOnlineGMS() { - return AdminTable.getInstance().getAllGms(true).size(); + return AdminData.getInstance().getAllGms(true).size(); } @Override diff --git a/trunk/dist/game/data/scripts/handlers/telnethandlers/DebugHandler.java b/trunk/dist/game/data/scripts/handlers/telnethandlers/DebugHandler.java index 81860309f3..026d77719f 100644 --- a/trunk/dist/game/data/scripts/handlers/telnethandlers/DebugHandler.java +++ b/trunk/dist/game/data/scripts/handlers/telnethandlers/DebugHandler.java @@ -38,7 +38,7 @@ import javolution.util.FastTable; import com.l2jserver.gameserver.GameTimeController; import com.l2jserver.gameserver.LoginServerThread; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.enums.ItemLocation; import com.l2jserver.gameserver.handler.ITelnetHandler; import com.l2jserver.gameserver.model.L2Object; @@ -464,7 +464,7 @@ public class DebugHandler implements ITelnetHandler private int getOnlineGMS() { - return AdminTable.getInstance().getAllGms(true).size(); + return AdminData.getInstance().getAllGms(true).size(); } private String getUptime(int time) diff --git a/trunk/dist/game/data/scripts/handlers/telnethandlers/PlayerHandler.java b/trunk/dist/game/data/scripts/handlers/telnethandlers/PlayerHandler.java index c653e31787..daa81493e5 100644 --- a/trunk/dist/game/data/scripts/handlers/telnethandlers/PlayerHandler.java +++ b/trunk/dist/game/data/scripts/handlers/telnethandlers/PlayerHandler.java @@ -24,7 +24,7 @@ import java.util.NoSuchElementException; import java.util.StringTokenizer; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.handler.ITelnetHandler; import com.l2jserver.gameserver.instancemanager.PunishmentManager; import com.l2jserver.gameserver.model.L2World; diff --git a/trunk/dist/game/data/scripts/handlers/telnethandlers/ReloadHandler.java b/trunk/dist/game/data/scripts/handlers/telnethandlers/ReloadHandler.java index f1cf521865..c9ea3138ab 100644 --- a/trunk/dist/game/data/scripts/handlers/telnethandlers/ReloadHandler.java +++ b/trunk/dist/game/data/scripts/handlers/telnethandlers/ReloadHandler.java @@ -26,12 +26,12 @@ import java.util.StringTokenizer; import javax.script.ScriptException; import com.l2jserver.gameserver.cache.HtmCache; +import com.l2jserver.gameserver.data.sql.impl.TeleportLocationTable; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.MultisellData; -import com.l2jserver.gameserver.datatables.NpcData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.datatables.SpawnTable; -import com.l2jserver.gameserver.datatables.TeleportLocationTable; import com.l2jserver.gameserver.handler.ITelnetHandler; import com.l2jserver.gameserver.instancemanager.DayNightSpawnManager; import com.l2jserver.gameserver.instancemanager.QuestManager; diff --git a/trunk/dist/game/data/scripts/handlers/telnethandlers/StatusHandler.java b/trunk/dist/game/data/scripts/handlers/telnethandlers/StatusHandler.java index c0bb0886a9..1241c0e0a2 100644 --- a/trunk/dist/game/data/scripts/handlers/telnethandlers/StatusHandler.java +++ b/trunk/dist/game/data/scripts/handlers/telnethandlers/StatusHandler.java @@ -26,7 +26,7 @@ import java.util.Calendar; import com.l2jserver.gameserver.GameTimeController; import com.l2jserver.gameserver.LoginServerThread; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.enums.ItemLocation; import com.l2jserver.gameserver.handler.ITelnetHandler; import com.l2jserver.gameserver.model.L2Object; @@ -103,7 +103,7 @@ public class StatusHandler implements ITelnetHandler int igm = 0; String gmList = ""; - for (String player : AdminTable.getInstance().getAllGmNames(true)) + for (String player : AdminData.getInstance().getAllGmNames(true)) { gmList = gmList + ", " + player; igm++; @@ -224,7 +224,7 @@ public class StatusHandler implements ITelnetHandler private int getOnlineGMS() { - return AdminTable.getInstance().getAllGms(true).size(); + return AdminData.getInstance().getAllGms(true).size(); } private String getUptime(int time) diff --git a/trunk/dist/game/data/scripts/handlers/usercommandhandlers/Mount.java b/trunk/dist/game/data/scripts/handlers/usercommandhandlers/Mount.java index 725a954bee..961e83d843 100644 --- a/trunk/dist/game/data/scripts/handlers/usercommandhandlers/Mount.java +++ b/trunk/dist/game/data/scripts/handlers/usercommandhandlers/Mount.java @@ -39,7 +39,7 @@ public class Mount implements IUserCommandHandler { return false; } - return activeChar.mountPlayer(activeChar.getSummon()); + return activeChar.mountPlayer(activeChar.getPet()); } @Override diff --git a/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/ChatAdmin.java b/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/ChatAdmin.java index 34592d7c03..c2aaae7a5f 100644 --- a/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/ChatAdmin.java +++ b/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/ChatAdmin.java @@ -20,8 +20,8 @@ package handlers.voicedcommandhandlers; import java.util.StringTokenizer; -import com.l2jserver.gameserver.datatables.AdminTable; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.handler.IVoicedCommandHandler; import com.l2jserver.gameserver.instancemanager.PunishmentManager; import com.l2jserver.gameserver.model.L2World; @@ -42,7 +42,7 @@ public class ChatAdmin implements IVoicedCommandHandler @Override public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params) { - if (!AdminTable.getInstance().hasAccess(command, activeChar.getAccessLevel())) + if (!AdminData.getInstance().hasAccess(command, activeChar.getAccessLevel())) { return false; } @@ -92,7 +92,7 @@ public class ChatAdmin implements IVoicedCommandHandler activeChar.sendMessage("You can't ban GM !"); return false; } - if (AdminTable.getInstance().hasAccess(command, player.getAccessLevel())) + if (AdminData.getInstance().hasAccess(command, player.getAccessLevel())) { activeChar.sendMessage("You can't ban moderator !"); return false; diff --git a/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/Debug.java b/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/Debug.java index b091515a93..81af2706f5 100644 --- a/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/Debug.java +++ b/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/Debug.java @@ -18,7 +18,7 @@ */ package handlers.voicedcommandhandlers; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.handler.IVoicedCommandHandler; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -32,7 +32,7 @@ public class Debug implements IVoicedCommandHandler @Override public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params) { - if (!AdminTable.getInstance().hasAccess(command, activeChar.getAccessLevel())) + if (!AdminData.getInstance().hasAccess(command, activeChar.getAccessLevel())) { return false; } diff --git a/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/Hellbound.java b/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/Hellbound.java index d558c3c15c..c71162c653 100644 --- a/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/Hellbound.java +++ b/trunk/dist/game/data/scripts/handlers/voicedcommandhandlers/Hellbound.java @@ -18,11 +18,11 @@ */ package handlers.voicedcommandhandlers; +import hellbound.HellboundEngine; + import com.l2jserver.gameserver.handler.IVoicedCommandHandler; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; -import hellbound.HellboundEngine; - /** * Hellbound voiced command. * @author DS diff --git a/trunk/dist/game/data/scripts/hellbound/AI/Chimeras.java b/trunk/dist/game/data/scripts/hellbound/AI/Chimeras.java index c3b93dd5b9..d627c01954 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/Chimeras.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/Chimeras.java @@ -18,6 +18,7 @@ */ package hellbound.AI; +import hellbound.HellboundEngine; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.ThreadPoolManager; @@ -27,8 +28,6 @@ import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.skills.Skill; -import hellbound.HellboundEngine; - /** * Chimeras AI. * @author DS diff --git a/trunk/dist/game/data/scripts/hellbound/AI/HellboundCore.java b/trunk/dist/game/data/scripts/hellbound/AI/HellboundCore.java index 4a76272129..9e9b12c259 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/HellboundCore.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/HellboundCore.java @@ -18,6 +18,7 @@ */ package hellbound.AI; +import hellbound.HellboundEngine; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.model.actor.L2Character; @@ -25,8 +26,6 @@ import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.SkillHolder; -import hellbound.HellboundEngine; - /** * Manages Naia's cast on the Hellbound Core * @author GKR diff --git a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Bernarde/Bernarde.java b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Bernarde/Bernarde.java index 6e98dc6860..de54a352e4 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Bernarde/Bernarde.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Bernarde/Bernarde.java @@ -18,13 +18,12 @@ */ package hellbound.AI.NPC.Bernarde; +import hellbound.HellboundEngine; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; -import hellbound.HellboundEngine; - /** * Bernarde AI. * @author DS diff --git a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Buron/Buron.java b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Buron/Buron.java index 12288fa602..0d2f292604 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Buron/Buron.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Buron/Buron.java @@ -18,13 +18,12 @@ */ package hellbound.AI.NPC.Buron; +import hellbound.HellboundEngine; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; -import hellbound.HellboundEngine; - /** * Buron AI. * @author DS diff --git a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Hude/Hude.java b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Hude/Hude.java index d83e315aff..810bbfe851 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Hude/Hude.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Hude/Hude.java @@ -18,14 +18,13 @@ */ package hellbound.AI.NPC.Hude; +import hellbound.HellboundEngine; import ai.npc.AbstractNpcAI; -import com.l2jserver.gameserver.datatables.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; -import hellbound.HellboundEngine; - /** * Hude AI. * @author DS diff --git a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Jude/Jude.java b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Jude/Jude.java index 11594776a1..16eabab786 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Jude/Jude.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Jude/Jude.java @@ -18,13 +18,12 @@ */ package hellbound.AI.NPC.Jude; +import hellbound.HellboundEngine; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; -import hellbound.HellboundEngine; - /** * Jude AI. * @author DS diff --git a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Kief/Kief.java b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Kief/Kief.java index b63517d50b..a91fd89c0d 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Kief/Kief.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Kief/Kief.java @@ -18,13 +18,12 @@ */ package hellbound.AI.NPC.Kief; +import hellbound.HellboundEngine; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; -import hellbound.HellboundEngine; - /** * Kief AI. * @author DS diff --git a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Natives/Natives.java b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Natives/Natives.java index 9cbeefb9d7..aad81a8f12 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Natives/Natives.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Natives/Natives.java @@ -18,17 +18,16 @@ */ package hellbound.AI.NPC.Natives; +import hellbound.HellboundEngine; import ai.npc.AbstractNpcAI; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.NpcStringId; import com.l2jserver.gameserver.network.clientpackets.Say2; -import hellbound.HellboundEngine; - /** * Natives AI. * @author DS, GKR @@ -116,7 +115,7 @@ public final class Natives extends AbstractNpcAI for (int doorId : DOORS) { - L2DoorInstance door = DoorTable.getInstance().getDoor(doorId); + L2DoorInstance door = DoorData.getInstance().getDoor(doorId); if (door != null) { door.openMe(); @@ -139,7 +138,7 @@ public final class Natives extends AbstractNpcAI { for (int doorId : DOORS) { - L2DoorInstance door = DoorTable.getInstance().getDoor(doorId); + L2DoorInstance door = DoorData.getInstance().getDoor(doorId); if (door != null) { door.closeMe(); diff --git a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Quarry/Quarry.java b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Quarry/Quarry.java index 27a94318cb..f4453f33d0 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Quarry/Quarry.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Quarry/Quarry.java @@ -18,6 +18,7 @@ */ package hellbound.AI.NPC.Quarry; +import hellbound.HellboundEngine; import ai.npc.AbstractNpcAI; import com.l2jserver.Config; @@ -33,8 +34,6 @@ import com.l2jserver.gameserver.model.zone.L2ZoneType; import com.l2jserver.gameserver.network.NpcStringId; import com.l2jserver.gameserver.network.clientpackets.Say2; -import hellbound.HellboundEngine; - /** * Quarry AI. * @author DS, GKR diff --git a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Solomon/Solomon.java b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Solomon/Solomon.java index 5dfb47f758..ff2cd8db84 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Solomon/Solomon.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Solomon/Solomon.java @@ -18,13 +18,12 @@ */ package hellbound.AI.NPC.Solomon; +import hellbound.HellboundEngine; import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; -import hellbound.HellboundEngine; - /** * Solomon AI. * @author DS diff --git a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Warpgate/Warpgate.java b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Warpgate/Warpgate.java index 444ad0858c..ff449df787 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/NPC/Warpgate/Warpgate.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/NPC/Warpgate/Warpgate.java @@ -116,4 +116,4 @@ public final class Warpgate extends AbstractNpcAI return true; } -} +} diff --git a/trunk/dist/game/data/scripts/hellbound/AI/OutpostCaptain.java b/trunk/dist/game/data/scripts/hellbound/AI/OutpostCaptain.java index 05a9c99fc6..09af1e50fa 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/OutpostCaptain.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/OutpostCaptain.java @@ -18,15 +18,14 @@ */ package hellbound.AI; +import hellbound.HellboundEngine; import ai.npc.AbstractNpcAI; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; -import hellbound.HellboundEngine; - /** * Outpost Captain's AI. * @author DS @@ -78,7 +77,7 @@ public final class OutpostCaptain extends AbstractNpcAI if (npc.getId() == CAPTAIN) { - final L2DoorInstance door = DoorTable.getInstance().getDoor(20250001); + final L2DoorInstance door = DoorData.getInstance().getDoor(20250001); if (door != null) { door.closeMe(); diff --git a/trunk/dist/game/data/scripts/hellbound/AI/Slaves.java b/trunk/dist/game/data/scripts/hellbound/AI/Slaves.java index 1d43912bc8..b3f14f4f2b 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/Slaves.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/Slaves.java @@ -94,4 +94,4 @@ public final class Slaves extends AbstractNpcAI } return super.onKill(npc, killer, isSummon); } -} \ No newline at end of file +} diff --git a/trunk/dist/game/data/scripts/hellbound/AI/Zones/AnomicFoundry/AnomicFoundry.java b/trunk/dist/game/data/scripts/hellbound/AI/Zones/AnomicFoundry/AnomicFoundry.java index 88c914f57c..a9ebca87bc 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/Zones/AnomicFoundry/AnomicFoundry.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/Zones/AnomicFoundry/AnomicFoundry.java @@ -18,6 +18,8 @@ */ package hellbound.AI.Zones.AnomicFoundry; +import hellbound.HellboundEngine; + import java.util.Map; import javolution.util.FastMap; @@ -35,8 +37,6 @@ import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.network.NpcStringId; import com.l2jserver.gameserver.network.clientpackets.Say2; -import hellbound.HellboundEngine; - /** * Anomic Foundry. * @author GKR diff --git a/trunk/dist/game/data/scripts/hellbound/AI/Zones/BaseTower/BaseTower.java b/trunk/dist/game/data/scripts/hellbound/AI/Zones/BaseTower/BaseTower.java index 46edeb9603..34ffce0ea4 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/Zones/BaseTower/BaseTower.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/Zones/BaseTower/BaseTower.java @@ -23,7 +23,7 @@ import java.util.Map; import javolution.util.FastMap; import ai.npc.AbstractNpcAI; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.base.ClassId; @@ -69,7 +69,7 @@ public final class BaseTower extends AbstractNpcAI { if (event.equalsIgnoreCase("CLOSE")) { - DoorTable.getInstance().getDoor(20260004).closeMe(); + DoorData.getInstance().getDoor(20260004).closeMe(); } return super.onAdvEvent(event, npc, player); } @@ -95,8 +95,8 @@ public final class BaseTower extends AbstractNpcAI { // Should Kendal be despawned before Guzen's spawn? Or it will be crowd of Kendal's addSpawn(KENDAL, npc.getSpawn().getLocation(), false, npc.getSpawn().getRespawnDelay(), false); - DoorTable.getInstance().getDoor(20260003).openMe(); - DoorTable.getInstance().getDoor(20260004).openMe(); + DoorData.getInstance().getDoor(20260003).openMe(); + DoorData.getInstance().getDoor(20260004).openMe(); startQuestTimer("CLOSE", 60000, npc, null, false); break; } diff --git a/trunk/dist/game/data/scripts/hellbound/AI/Zones/TowerOfInfinitum/TowerOfInfinitum.java b/trunk/dist/game/data/scripts/hellbound/AI/Zones/TowerOfInfinitum/TowerOfInfinitum.java index cfc12ee582..964ec068ff 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/Zones/TowerOfInfinitum/TowerOfInfinitum.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/Zones/TowerOfInfinitum/TowerOfInfinitum.java @@ -18,6 +18,8 @@ */ package hellbound.AI.Zones.TowerOfInfinitum; +import hellbound.HellboundEngine; + import java.util.HashMap; import java.util.Map; @@ -29,8 +31,6 @@ import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.util.Util; -import hellbound.HellboundEngine; - /** * Tower Of Infinitum. * @author GKR diff --git a/trunk/dist/game/data/scripts/hellbound/AI/Zones/TowerOfNaia/TowerOfNaia.java b/trunk/dist/game/data/scripts/hellbound/AI/Zones/TowerOfNaia/TowerOfNaia.java index 47f48d263f..de32fda4fc 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/Zones/TowerOfNaia/TowerOfNaia.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/Zones/TowerOfNaia/TowerOfNaia.java @@ -30,7 +30,7 @@ import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.instancemanager.GlobalVariablesManager; import com.l2jserver.gameserver.instancemanager.ZoneManager; @@ -657,7 +657,7 @@ public final class TowerOfNaia extends AbstractNpcAI if (spawned.isEmpty() && DOORS.containsKey(managerId)) { int[] doorList = DOORS.get(managerId); - DoorTable.getInstance().getDoor(doorList[1]).openMe(); + DoorData.getInstance().getDoor(doorList[1]).openMe(); _spawns.remove(managerId); } } @@ -666,7 +666,7 @@ public final class TowerOfNaia extends AbstractNpcAI { _challengeState = STATE_SPORE_CHALLENGE_IN_PROGRESS; markElpyRespawn(); - DoorTable.getInstance().getDoor(18250025).closeMe(); + DoorData.getInstance().getDoor(18250025).closeMe(); ZoneManager.getInstance().getZoneById(200100).setEnabled(true); for (int i = 0; i < 10; i++) @@ -762,7 +762,7 @@ public final class TowerOfNaia extends AbstractNpcAI if (npcId == MUTATED_ELPY) { - DoorTable.getInstance().getDoor(18250025).openMe(); + DoorData.getInstance().getDoor(18250025).openMe(); ZoneManager.getInstance().getZoneById(200100).setEnabled(false); ZoneManager.getInstance().getZoneById(200101).setEnabled(true); ZoneManager.getInstance().getZoneById(200101).setEnabled(false); @@ -808,8 +808,8 @@ public final class TowerOfNaia extends AbstractNpcAI if (DOORS.containsKey(managerId)) { int[] doorList = DOORS.get(managerId); - DoorTable.getInstance().getDoor(doorList[0]).openMe(); - DoorTable.getInstance().getDoor(doorList[1]).closeMe(); + DoorData.getInstance().getDoor(doorList[0]).openMe(); + DoorData.getInstance().getDoor(doorList[1]).closeMe(); } if (_spawns.containsKey(managerId) && (_spawns.get(managerId) != null)) @@ -896,7 +896,7 @@ public final class TowerOfNaia extends AbstractNpcAI if (DOORS.containsKey(managerId)) { int[] doorList = DOORS.get(managerId); - DoorTable.getInstance().getDoor(doorList[0]).closeMe(); + DoorData.getInstance().getDoor(doorList[0]).closeMe(); } if (SPAWNS.containsKey(managerId)) diff --git a/trunk/dist/game/data/scripts/hellbound/AI/Zones/TullyWorkshop/TullyWorkshop.java b/trunk/dist/game/data/scripts/hellbound/AI/Zones/TullyWorkshop/TullyWorkshop.java index 51bc93bfa9..98ea64489c 100644 --- a/trunk/dist/game/data/scripts/hellbound/AI/Zones/TullyWorkshop/TullyWorkshop.java +++ b/trunk/dist/game/data/scripts/hellbound/AI/Zones/TullyWorkshop/TullyWorkshop.java @@ -31,7 +31,7 @@ import ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager; import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager.StatusEnum; @@ -740,7 +740,7 @@ public final class TullyWorkshop extends AbstractNpcAI final int[] doors = TULLY_DOORLIST.get(npcId); for (int doorId : doors) { - DoorTable.getInstance().getDoor(doorId).closeMe(); + DoorData.getInstance().getDoor(doorId).closeMe(); } } @@ -837,7 +837,7 @@ public final class TullyWorkshop extends AbstractNpcAI final int[] doors = TULLY_DOORLIST.get(npcId); for (int doorId : doors) { - DoorTable.getInstance().getDoor(doorId).openMe(); + DoorData.getInstance().getDoor(doorId).openMe(); } startQuestTimer("close", 120000, npc, null); @@ -1205,8 +1205,8 @@ public final class TullyWorkshop extends AbstractNpcAI postMortemSpawn.add(spawnedNpc); } - DoorTable.getInstance().getDoor(19260051).openMe(); - DoorTable.getInstance().getDoor(19260052).openMe(); + DoorData.getInstance().getDoor(19260051).openMe(); + DoorData.getInstance().getDoor(19260052).openMe(); countdownTime = 600000; _countdown = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(() -> @@ -1570,8 +1570,8 @@ public final class TullyWorkshop extends AbstractNpcAI private void handleDoorsOnDeath() { - DoorTable.getInstance().getDoor(20250005).openMe(); - DoorTable.getInstance().getDoor(20250004).openMe(); + DoorData.getInstance().getDoor(20250005).openMe(); + DoorData.getInstance().getDoor(20250004).openMe(); ThreadPoolManager.getInstance().scheduleGeneral(new DoorTask(new int[] { 20250006, @@ -1594,8 +1594,8 @@ public final class TullyWorkshop extends AbstractNpcAI private void handleDoorsOnRespawn() { - DoorTable.getInstance().getDoor(20250009).closeMe(); - DoorTable.getInstance().getDoor(20250008).closeMe(); + DoorData.getInstance().getDoor(20250009).closeMe(); + DoorData.getInstance().getDoor(20250008).closeMe(); ThreadPoolManager.getInstance().scheduleGeneral(new DoorTask(new int[] { 20250777, @@ -1627,7 +1627,7 @@ public final class TullyWorkshop extends AbstractNpcAI L2DoorInstance door; for (int doorId : _doorIds) { - door = DoorTable.getInstance().getDoor(doorId); + door = DoorData.getInstance().getDoor(doorId); if (door != null) { switch (_state) diff --git a/trunk/dist/game/data/scripts/hellbound/HellboundEngine.java b/trunk/dist/game/data/scripts/hellbound/HellboundEngine.java index 81edd17d5f..44c3159e3f 100644 --- a/trunk/dist/game/data/scripts/hellbound/HellboundEngine.java +++ b/trunk/dist/game/data/scripts/hellbound/HellboundEngine.java @@ -21,7 +21,7 @@ package hellbound; import ai.npc.AbstractNpcAI; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.instancemanager.GlobalVariablesManager; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.actor.L2Npc; @@ -268,7 +268,7 @@ public final class HellboundEngine extends AbstractNpcAI { try { - L2DoorInstance door = DoorTable.getInstance().getDoor(doorData[0]); + L2DoorInstance door = DoorData.getInstance().getDoor(doorData[0]); if (door.getOpen()) { if (newLevel < doorData[1]) diff --git a/trunk/dist/game/data/scripts/hellbound/HellboundPointData.java b/trunk/dist/game/data/scripts/hellbound/HellboundPointData.java index 2378b0df85..6c84146806 100644 --- a/trunk/dist/game/data/scripts/hellbound/HellboundPointData.java +++ b/trunk/dist/game/data/scripts/hellbound/HellboundPointData.java @@ -25,13 +25,13 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; /** * Point data parser. * @author Zoey76 */ -public final class HellboundPointData implements DocumentParser +public final class HellboundPointData implements IXmlReader { private final Map _pointsInfo = new HashMap<>(); diff --git a/trunk/dist/game/data/scripts/hellbound/HellboundSpawns.java b/trunk/dist/game/data/scripts/hellbound/HellboundSpawns.java index 9163d30e2c..bfb32f787b 100644 --- a/trunk/dist/game/data/scripts/hellbound/HellboundSpawns.java +++ b/trunk/dist/game/data/scripts/hellbound/HellboundSpawns.java @@ -27,9 +27,9 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.IXmlReader; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SpawnTable; -import com.l2jserver.gameserver.engines.DocumentParser; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; @@ -38,7 +38,7 @@ import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; * Hellbound Spawns parser. * @author Zoey76 */ -public final class HellboundSpawns implements DocumentParser +public final class HellboundSpawns implements IXmlReader { private final List _spawns = new ArrayList<>(); private final Map _spawnLevels = new HashMap<>(); diff --git a/trunk/dist/game/data/scripts/hellbound/Instances/UrbanArea/UrbanArea.java b/trunk/dist/game/data/scripts/hellbound/Instances/UrbanArea/UrbanArea.java index eae23cb1d0..cc59b33c6b 100644 --- a/trunk/dist/game/data/scripts/hellbound/Instances/UrbanArea/UrbanArea.java +++ b/trunk/dist/game/data/scripts/hellbound/Instances/UrbanArea/UrbanArea.java @@ -18,6 +18,8 @@ */ package hellbound.Instances.UrbanArea; +import hellbound.HellboundEngine; + import java.util.concurrent.ScheduledFuture; import ai.npc.AbstractNpcAI; @@ -41,8 +43,6 @@ import com.l2jserver.gameserver.network.serverpackets.NpcSay; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.gameserver.util.Util; -import hellbound.HellboundEngine; - /** * Urban Area instance zone. * @author GKR diff --git a/trunk/dist/game/data/scripts/instances/CavernOfThePirateCaptain/CavernOfThePirateCaptain.java b/trunk/dist/game/data/scripts/instances/CavernOfThePirateCaptain/CavernOfThePirateCaptain.java index e4f8d03404..f78fc217cd 100644 --- a/trunk/dist/game/data/scripts/instances/CavernOfThePirateCaptain/CavernOfThePirateCaptain.java +++ b/trunk/dist/game/data/scripts/instances/CavernOfThePirateCaptain/CavernOfThePirateCaptain.java @@ -31,6 +31,7 @@ import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.PcCondOverride; import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.Instance; import com.l2jserver.gameserver.model.instancezone.InstanceWorld; @@ -227,10 +228,12 @@ public class CavernOfThePirateCaptain extends AbstractNpcAI if (!world._is83) { player.stopAllEffectsExceptThoseThatLastThroughDeath(); - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - player.getSummon().stopAllEffectsExceptThoseThatLastThroughDeath(); + pet.stopAllEffectsExceptThoseThatLastThroughDeath(); } + player.getServitors().values().forEach(L2Summon::stopAllEffectsExceptThoseThatLastThroughDeath); } world.playersInside.add(player); world.addAllowed(player.getObjectId()); diff --git a/trunk/dist/game/data/scripts/instances/CrystalCaverns/CrystalCaverns.java b/trunk/dist/game/data/scripts/instances/CrystalCaverns/CrystalCaverns.java index 5e74a47b7b..29577e838e 100644 --- a/trunk/dist/game/data/scripts/instances/CrystalCaverns/CrystalCaverns.java +++ b/trunk/dist/game/data/scripts/instances/CrystalCaverns/CrystalCaverns.java @@ -1642,16 +1642,12 @@ public final class CrystalCaverns extends Quest int _y = effector.getY() - (int) (offset * sin); int _z = effected.getZ(); - if (Config.GEODATA > 0) - { - Location destiny = GeoData.getInstance().moveCheck(effected.getX(), effected.getY(), effected.getZ(), _x, _y, _z, effected.getInstanceId()); - _x = destiny.getX(); - _y = destiny.getY(); - } - effected.broadcastPacket(new FlyToLocation(effected, _x, _y, _z, FlyType.THROW_UP)); + Location destination = GeoData.getInstance().moveCheck(effected.getX(), effected.getY(), effected.getZ(), _x, _y, _z, effected.getInstanceId()); + + effected.broadcastPacket(new FlyToLocation(effected, destination, FlyType.THROW_UP)); // maybe is need force set X,Y,Z - effected.setXYZ(_x, _y, _z); + effected.setXYZ(destination); effected.broadcastPacket(new ValidateLocation(effected)); } @@ -1714,7 +1710,7 @@ public final class CrystalCaverns extends Quest player.breakAttack(); player.breakCast(); player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); - L2Summon pet = player.getSummon(); + L2Summon pet = player.getPet(); if (pet != null) { pet.setTarget(null); @@ -1724,6 +1720,15 @@ public final class CrystalCaverns extends Quest pet.breakCast(); pet.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); } + player.getServitors().values().forEach(s -> + { + s.setTarget(null); + s.abortAttack(); + s.abortCast(); + s.breakAttack(); + s.breakCast(); + s.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + }); } protected void runOracle(CCWorld world) @@ -2256,10 +2261,14 @@ public final class CrystalCaverns extends Quest { p.setIsParalyzed(false); Throw(npc, p); - if (p.getSummon() != null) + if (p.getPet() != null) { - Throw(npc, p.getSummon()); + Throw(npc, p.getPet()); } + p.getServitors().values().forEach(s -> + { + Throw(npc, s); + }); } world._raidStatus = 0; for (L2Npc mob : world._animationMobs) @@ -2925,12 +2934,17 @@ public final class CrystalCaverns extends Quest int x = (int) (radius * Math.cos((i * 2 * Math.PI) / members)); int y = (int) (radius * Math.sin((i++ * 2 * Math.PI) / members)); p.teleToLocation(new Location(153571 + x, 142075 + y, -12737)); - L2Summon pet = p.getSummon(); + L2Summon pet = p.getPet(); if (pet != null) { pet.teleToLocation(new Location(153571 + x, 142075 + y, -12737), true); pet.broadcastPacket(new ValidateLocation(pet)); } + p.getServitors().values().forEach(s -> + { + s.teleToLocation(new Location(153571 + x, 142075 + y, -12737), true); + s.broadcastPacket(new ValidateLocation(s)); + }); p.setIsParalyzed(true); p.broadcastPacket(new ValidateLocation(p)); } diff --git a/trunk/dist/game/data/scripts/instances/DisciplesNecropolisPast/DisciplesNecropolisPast.java b/trunk/dist/game/data/scripts/instances/DisciplesNecropolisPast/DisciplesNecropolisPast.java index 91d7d670b2..223985ffce 100644 --- a/trunk/dist/game/data/scripts/instances/DisciplesNecropolisPast/DisciplesNecropolisPast.java +++ b/trunk/dist/game/data/scripts/instances/DisciplesNecropolisPast/DisciplesNecropolisPast.java @@ -28,6 +28,7 @@ import com.l2jserver.gameserver.instancemanager.InstanceManager; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.instancezone.InstanceWorld; @@ -514,7 +515,7 @@ public final class DisciplesNecropolisPast extends Quest ch.stopAllEffectsExceptThoseThatLastThroughDeath(); if (ch.hasSummon()) { - ch.getSummon().stopAllEffectsExceptThoseThatLastThroughDeath(); + ch.getServitors().values().forEach(L2Summon::stopAllEffectsExceptThoseThatLastThroughDeath); } } diff --git a/trunk/dist/game/data/scripts/instances/FinalEmperialTomb/FinalEmperialTomb.java b/trunk/dist/game/data/scripts/instances/FinalEmperialTomb/FinalEmperialTomb.java index a25d60e163..c052a84639 100644 --- a/trunk/dist/game/data/scripts/instances/FinalEmperialTomb/FinalEmperialTomb.java +++ b/trunk/dist/game/data/scripts/instances/FinalEmperialTomb/FinalEmperialTomb.java @@ -52,6 +52,7 @@ import com.l2jserver.gameserver.model.PcCondOverride; import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance; import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -941,10 +942,18 @@ public final class FinalEmperialTomb extends Quest { targetList.add(player); } - if (player.hasSummon() && !player.getSummon().isDead()) + final L2Summon pet = player.getPet(); + if ((pet != null) && !pet.isDead()) { - targetList.add(player.getSummon()); + targetList.add(pet); } + player.getServitors().values().forEach(s -> + { + if (!s.isDead()) + { + targetList.add(s); + } + }); } } } diff --git a/trunk/dist/game/data/scripts/instances/HideoutOfTheDawn/HideoutOfTheDawn.java b/trunk/dist/game/data/scripts/instances/HideoutOfTheDawn/HideoutOfTheDawn.java index f707e8ce43..41f9a77a91 100644 --- a/trunk/dist/game/data/scripts/instances/HideoutOfTheDawn/HideoutOfTheDawn.java +++ b/trunk/dist/game/data/scripts/instances/HideoutOfTheDawn/HideoutOfTheDawn.java @@ -22,6 +22,7 @@ import com.l2jserver.gameserver.instancemanager.InstanceManager; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.instancezone.InstanceWorld; import com.l2jserver.gameserver.model.quest.Quest; @@ -112,7 +113,7 @@ public final class HideoutOfTheDawn extends Quest ch.stopAllEffectsExceptThoseThatLastThroughDeath(); if (ch.hasSummon()) { - ch.getSummon().stopAllEffectsExceptThoseThatLastThroughDeath(); + ch.getServitors().values().forEach(L2Summon::stopAllEffectsExceptThoseThatLastThroughDeath); } } diff --git a/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/IceQueensCastleHardBattle.java b/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/IceQueensCastleHardBattle.java index 5a19f0ebfb..91e1a430df 100644 --- a/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/IceQueensCastleHardBattle.java +++ b/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/IceQueensCastleHardBattle.java @@ -37,6 +37,7 @@ import com.l2jserver.gameserver.model.PcCondOverride; import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance; import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -1170,11 +1171,14 @@ public final class IceQueensCastleHardBattle extends AbstractNpcAI if (world instanceof IQCNBWorld) { player.stopAllEffectsExceptThoseThatLastThroughDeath(); - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - player.getSummon().stopAllEffectsExceptThoseThatLastThroughDeath(); + pet.stopAllEffectsExceptThoseThatLastThroughDeath(); } + player.getServitors().values().forEach(L2Summon::stopAllEffectsExceptThoseThatLastThroughDeath); + if (world.isStatus(4)) { teleportPlayer(player, BATTLE_PORT, world.getInstanceId()); @@ -1222,10 +1226,12 @@ public final class IceQueensCastleHardBattle extends AbstractNpcAI private void managePlayerEnter(L2PcInstance player, IQCNBWorld world) { player.stopAllEffectsExceptThoseThatLastThroughDeath(); - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - player.getSummon().stopAllEffectsExceptThoseThatLastThroughDeath(); + pet.stopAllEffectsExceptThoseThatLastThroughDeath(); } + player.getServitors().values().forEach(L2Summon::stopAllEffectsExceptThoseThatLastThroughDeath); world.playersInside.add(player); world.addAllowed(player.getObjectId()); teleportPlayer(player, ENTER_LOC[getRandom(ENTER_LOC.length)], world.getInstanceId(), false); diff --git a/trunk/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/IceQueensCastleNormalBattle.java b/trunk/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/IceQueensCastleNormalBattle.java index fd359bb4a9..8c4d100567 100644 --- a/trunk/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/IceQueensCastleNormalBattle.java +++ b/trunk/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/IceQueensCastleNormalBattle.java @@ -37,6 +37,7 @@ import com.l2jserver.gameserver.model.PcCondOverride; import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance; import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -1170,11 +1171,14 @@ public final class IceQueensCastleNormalBattle extends AbstractNpcAI if (world instanceof IQCNBWorld) { player.stopAllEffectsExceptThoseThatLastThroughDeath(); - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - player.getSummon().stopAllEffectsExceptThoseThatLastThroughDeath(); + pet.stopAllEffectsExceptThoseThatLastThroughDeath(); } + player.getServitors().values().forEach(L2Summon::stopAllEffectsExceptThoseThatLastThroughDeath); + if (world.isStatus(4)) { teleportPlayer(player, BATTLE_PORT, world.getInstanceId()); @@ -1222,10 +1226,12 @@ public final class IceQueensCastleNormalBattle extends AbstractNpcAI private void managePlayerEnter(L2PcInstance player, IQCNBWorld world) { player.stopAllEffectsExceptThoseThatLastThroughDeath(); - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - player.getSummon().stopAllEffectsExceptThoseThatLastThroughDeath(); + pet.stopAllEffectsExceptThoseThatLastThroughDeath(); } + player.getServitors().values().forEach(L2Summon::stopAllEffectsExceptThoseThatLastThroughDeath); world.playersInside.add(player); world.addAllowed(player.getObjectId()); teleportPlayer(player, ENTER_LOC[getRandom(ENTER_LOC.length)], world.getInstanceId(), false); diff --git a/trunk/dist/game/data/scripts/instances/Kamaloka/Kamaloka.java b/trunk/dist/game/data/scripts/instances/Kamaloka/Kamaloka.java index 4d8fa2398f..ce7936f383 100644 --- a/trunk/dist/game/data/scripts/instances/Kamaloka/Kamaloka.java +++ b/trunk/dist/game/data/scripts/instances/Kamaloka/Kamaloka.java @@ -34,6 +34,7 @@ import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.Instance; import com.l2jserver.gameserver.model.instancezone.InstanceWorld; @@ -1315,11 +1316,16 @@ public final class Kamaloka extends Quest }; ch.getEffectList().forEach(removeBuffs, false); - - if (ch.hasSummon()) + final L2Summon pet = ch.getPet(); + if (pet != null) { - ch.getSummon().getEffectList().forEach(removeBuffs, false); + pet.getEffectList().forEach(removeBuffs, false); } + + ch.getServitors().values().forEach(s -> + { + s.getEffectList().forEach(removeBuffs, false); + }); } /** diff --git a/trunk/dist/game/data/scripts/instances/MonasteryOfSilence1/MonasteryOfSilence1.java b/trunk/dist/game/data/scripts/instances/MonasteryOfSilence1/MonasteryOfSilence1.java index 0c6aa7b551..34bc4ec8d8 100644 --- a/trunk/dist/game/data/scripts/instances/MonasteryOfSilence1/MonasteryOfSilence1.java +++ b/trunk/dist/game/data/scripts/instances/MonasteryOfSilence1/MonasteryOfSilence1.java @@ -24,6 +24,7 @@ import com.l2jserver.gameserver.instancemanager.InstanceManager; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.instancezone.InstanceWorld; @@ -223,10 +224,12 @@ public final class MonasteryOfSilence1 extends AbstractNpcAI private static final void removeBuffs(L2Character ch) { ch.stopAllEffectsExceptThoseThatLastThroughDeath(); - if (ch.hasSummon()) + final L2Summon pet = ch.getPet(); + if (pet != null) { - ch.getSummon().stopAllEffectsExceptThoseThatLastThroughDeath(); + pet.stopAllEffectsExceptThoseThatLastThroughDeath(); } + ch.getServitors().values().forEach(L2Summon::stopAllEffectsExceptThoseThatLastThroughDeath); } protected void spawnNPC(L2PcInstance player, MoSWorld world) diff --git a/trunk/dist/game/data/scripts/instances/NornilsGarden/NornilsGarden.java b/trunk/dist/game/data/scripts/instances/NornilsGarden/NornilsGarden.java index dd8e140441..8d8e3e8a13 100644 --- a/trunk/dist/game/data/scripts/instances/NornilsGarden/NornilsGarden.java +++ b/trunk/dist/game/data/scripts/instances/NornilsGarden/NornilsGarden.java @@ -24,6 +24,7 @@ import com.l2jserver.gameserver.model.L2Party; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.Instance; @@ -237,11 +238,17 @@ public final class NornilsGarden extends Quest { removeBuffs(player); giveBuffs(player); - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - removeBuffs(player.getSummon()); - giveBuffs(player.getSummon()); + removeBuffs(pet); + giveBuffs(pet); } + player.getServitors().values().forEach(s -> + { + removeBuffs(s); + giveBuffs(s); + }); super.teleportPlayer(player, loc, instanceId); } diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-01.htm b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-01.htm new file mode 100644 index 0000000000..3789ba360d --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-01.htm @@ -0,0 +1,4 @@ +Innocentin:
+You've been a great help to me in the past, and I'd like to thank you again for bringing me that report! There's one more thing... Could you help me out again?
+"OK, whatever." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-01a.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-01a.html new file mode 100644 index 0000000000..d4d1737ef4 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-01a.html @@ -0,0 +1,6 @@ +Innocentin:
+This is something you can get started on immediately!
+There's a vast conspiracy afoot in the Rune Township and the Forest of the Dead!
+The roots of this conspiracy lie in that forest, and you should seek the truth there.
+(This quest may only be undertaken by a character of level 64 or above who has completed the Hidden Truth and Tragedy of Hellmann Forest quests.) + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-02.htm b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-02.htm new file mode 100644 index 0000000000..cf947a5159 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-02.htm @@ -0,0 +1,4 @@ +Innocentin:
+You look tired, my friend! Why don't you take a break, improve your ability and then come back! This next mission is much more challenging than the last one...
+(This quest may only be undertaken by a character of level 64 or above who has completed the Tragedy of Hellmann Forest quest.) + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-03.htm b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-03.htm new file mode 100644 index 0000000000..56cc3f96d1 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-03.htm @@ -0,0 +1,4 @@ +Innocentin:
+Here's the Map and key he left behind. Take them and find out what he was searching for.
+"Tell me more about the Map and key." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-04.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-04.html new file mode 100644 index 0000000000..1238a8f4c1 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-04.html @@ -0,0 +1,4 @@ +Innocentin:
+He probably drew this Map while exploring the Forest of the Dead. As for the key... I'm not sure. The only clue I've found is the Silver Spear engraved upon it.
+"Tell me more about the Silver Spear." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-05.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-05.html new file mode 100644 index 0000000000..1238a8f4c1 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-05.html @@ -0,0 +1,4 @@ +Innocentin:
+He probably drew this Map while exploring the Forest of the Dead. As for the key... I'm not sure. The only clue I've found is the Silver Spear engraved upon it.
+"Tell me more about the Silver Spear." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-06.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-06.html new file mode 100644 index 0000000000..0a796a3a5d --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-06.html @@ -0,0 +1,6 @@ +Innocentin:
+According to a custom from the Elmoreden period, a Silver Spear was the symbol of the family responsible for guarding the royal family.
+An ancient proverb says, "A jeweled scepter for the mighty King of Elmore and two Silver Spears for his protectors".
+I'll wager that somewhere is a lock that matches this key...
+"Who holds the spear now?" + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-07.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-07.html new file mode 100644 index 0000000000..0dd8ac5431 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-07.html @@ -0,0 +1,5 @@ +High Priestess Innocentin:
+Today's silver spears are dedicated to the people who worked hard to suppress the rebellion. One is for the protectors of the royal family, who captured and punished the rebels, and one is for those who fought against the undead and captured the demon's followers... and it will therefore be a dedication that upholds the false accusations against our former priests.
+The one responsible for all this is staying at the temple in Rune Castle Town.
+Please don't ask any more questions. Just take the records that he left behind, and find out where that key fits. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-08.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-08.html new file mode 100644 index 0000000000..a622c83652 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-08.html @@ -0,0 +1,3 @@ +Innocentin:
+You must find the lock that matches that key! It would probably be in the possession of a family worthy of the spear! + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-09.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-09.html new file mode 100644 index 0000000000..54adb628b3 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-09.html @@ -0,0 +1,4 @@ +Innocentin:
+So, did you find anything?
+"Here is the diary and the hairpin." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-10.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-10.html new file mode 100644 index 0000000000..cee78b8d71 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-10.html @@ -0,0 +1,6 @@ +Innocentin:
+Please! Put those things away...Please!
+I'm sorry, but the power of darkness contained in them is overpowering! I can't even look at them...
+How about you? Are you okay?
+"I'm fine." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-11.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-11.html new file mode 100644 index 0000000000..26aa604bbf --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-11.html @@ -0,0 +1,5 @@ +Innocentin:
+Really? Have you read it?
+"Yes, I read it."
+"No, I haven't read it." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-12.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-12.html new file mode 100644 index 0000000000..faa84f2bf5 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-12.html @@ -0,0 +1,3 @@ +Innocentin:
+Read it and come back to me... I have many questions! + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-13.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-13.html new file mode 100644 index 0000000000..25945ad1b9 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-13.html @@ -0,0 +1,5 @@ +Innocentin:
+Then answer me... What is it?
+"Lidia's Diary."
+"Alfred's Diary." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-14.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-14.html new file mode 100644 index 0000000000..058b8c7543 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-14.html @@ -0,0 +1,5 @@ +Innocentin:
+Have you read the document?
+"Yes, I read it."
+No, I didn't read it." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-15.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-15.html new file mode 100644 index 0000000000..25945ad1b9 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-15.html @@ -0,0 +1,5 @@ +Innocentin:
+Then answer me... What is it?
+"Lidia's Diary."
+"Alfred's Diary." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-16.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-16.html new file mode 100644 index 0000000000..6a634f342e --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-16.html @@ -0,0 +1,7 @@ +Innocentin:
+Lidia's Diary?
+Lidia was dear Alfred's precious daughter... They led an idyllic life, until that tragic day...
+Does her diary cover the period after she became lord of the forest?
+"Yes, it does."
+"No, it doesn't." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-17.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-17.html new file mode 100644 index 0000000000..345da46980 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-17.html @@ -0,0 +1,5 @@ +Innocentin:
+What did you learn from the diary?
+"Lidia was bitten by a vampire."
+"Lidia signed some sort of contract." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-18.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-18.html new file mode 100644 index 0000000000..b9b9b4122d --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-18.html @@ -0,0 +1,8 @@ +Innocentin:
+A contract?!
+I'll bet that rascal Nidrah was behind this! Was he involved?
+"Yes, he forced her to sign the contract."
+"Lidia approached Nidrah."
+"Nidrah wasn't involved."
+"As I said before, Lidia was bitten by a vampire! Don't you get it?" + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-19.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-19.html new file mode 100644 index 0000000000..af5ad36d6c --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-19.html @@ -0,0 +1,5 @@ +Innocentin:
+Oh really? Then let me ask you one more question. Have you ever heard the expression "Owner of a Moon Face Flower"?
+"It's the Lord of the Forest of the Dead."
+"It's Lidia von Hellmann." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-20.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-20.html new file mode 100644 index 0000000000..1a747b689b --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-20.html @@ -0,0 +1,6 @@ +Innocentin:
+Ah ha! Then that hairpin must belong to Lidia!
+Now I remember it! She used to wear it in her hair! Sigh... She was so beautiful then...
+Thank you for your help! I suppose our business is done now, but your journey continues...
+I'll always be here for you if you have any questions. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-21.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-21.html new file mode 100644 index 0000000000..926ba2ece5 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-21.html @@ -0,0 +1,3 @@ + +The moment the words leave your lips, you feel an electric current shoot through your head, buzzing like 5000 wyverns in flight! Deep within your heart wells an emotion, small but growing more intense by the moment... It's remorse! Lidia must have been angered by your answer! + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-22.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-22.html new file mode 100644 index 0000000000..77a2ab5dfc --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-22.html @@ -0,0 +1,3 @@ +Innocentin:
+I don't think your journey's over yet. Someone close to her wants to see you. He'll show you the path that leads to your next adventure. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-01.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-01.html new file mode 100644 index 0000000000..7ff24873bc --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-01.html @@ -0,0 +1,6 @@ +Violet:
+Oh, the key? That's right! That's the key that Duke Adolph von Hellmann asked me to keep for him! That was a very long time ago! He told me that it guards the highest honor his family received from the King!
+But I can't go there. I can't leave this village.
+Go towards the northern part of the village. You'll find a box near the center of the Forest of the Dead. This key opens the padlock on the box.
+Bring me the object you find inside the box. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-02.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-02.html new file mode 100644 index 0000000000..26fffef58d --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-02.html @@ -0,0 +1,5 @@ +Violet:
+I can't go there. I can't leave this village!
+Go towards the northern part of the village, you'll find a box near the center of the Forest of the Dead. This key opens the padlock on the box.
+Bring me the object you find inside the box. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-03.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-03.html new file mode 100644 index 0000000000..954562c12e --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-03.html @@ -0,0 +1,5 @@ +Violet:
+This is the very Silver Spear that King Astaire Van Halter bestowed upon Duke Adolph! It's the treasured heirloom of the Hellmann family! The lord will be overjoyed! The long lost honor of his family name is restored, and it's all because of you!
+Thank you. Please accept this small token of our gratitude! I only wish that we could have you over to the castle and give you a more formal recognition...
+I probably have to express our gratitude to the lord through another person, not me. Please talk with the village people. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-04.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-04.html new file mode 100644 index 0000000000..630bdafdde --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-04.html @@ -0,0 +1,4 @@ +Violet:
+Find someone among the villagers to express your gratitude to the lord.
+Have you visited Doriun yet? + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-01.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-01.html new file mode 100644 index 0000000000..6863ce0e31 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-01.html @@ -0,0 +1,4 @@ +Tombstone:
+One jeweled scepter for the King and two Silver Spears for the von Hellmann family who protects him.
+Wait a while. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-02.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-02.html new file mode 100644 index 0000000000..725a6eb089 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-02.html @@ -0,0 +1,3 @@ +Tombstone:
+After a while, a white ghost appears. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-03.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-03.html new file mode 100644 index 0000000000..74910b9305 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-03.html @@ -0,0 +1,3 @@ +Tombstone:
+The ghost was beside you all along! + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-04.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-04.html new file mode 100644 index 0000000000..2b77bb9898 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-04.html @@ -0,0 +1,5 @@ +Tombstone:
+There is a tablet engraved with familiar characters.
+Dig
+Recall the ghost + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-05.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-05.html new file mode 100644 index 0000000000..75f1931a18 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-05.html @@ -0,0 +1,4 @@ +Tombstone:
+There is a tablet engraved with familiar characters.
+It appears that something else has been crudely etched into the tablet. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-06.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-06.html new file mode 100644 index 0000000000..bab35c3717 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-06.html @@ -0,0 +1,3 @@ +Tombstone:
+You find a key engraved with a silver spear. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-01.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-01.html new file mode 100644 index 0000000000..191e97c226 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-01.html @@ -0,0 +1,4 @@ +Ghost of von Hellmann:
+Who has summoned me here? Why can't I sleep?
+"Let me tell you about Lidia von Hellmann." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-02.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-02.html new file mode 100644 index 0000000000..5c29303c3d --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-02.html @@ -0,0 +1,4 @@ +Ghost of von Hellmann:
+Oh, the horror! The von Hellmann's are dead and Lidia is a demon? Her curse upon this land is depriving me of my rest!
+"It's the truth." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-03.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-03.html new file mode 100644 index 0000000000..5073d58c8f --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-03.html @@ -0,0 +1,4 @@ +Ghost of von Hellmann:
+How did she become the Lord of the Dead?
+"Here's her diary." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-04.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-04.html new file mode 100644 index 0000000000..1b50cf3007 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-04.html @@ -0,0 +1,5 @@ +Ghost of von Hellmann:
+This concerns Lidia's Diary? Is that right? Oh, I see! Dear traveler! For whatever little time I have left, I'll read this diary and go over the past again and again in my mind!
+Traveler, I shall reward you well for this diary! Dig underneath this tombstone and you will find my key!
+Take that key to the Chamberlain of the Hellmann Family! You'll find him in the village hidden in the middle of this forest! + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-05.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-05.html new file mode 100644 index 0000000000..e3f72f8ea8 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-05.html @@ -0,0 +1,4 @@ +Ghost of von Hellmann:
+Dig under this monument for the key and take it to the von Hellmann's page.
+He's in the hidden village in the center of the forest. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-06.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-06.html new file mode 100644 index 0000000000..958fa8e1e1 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-06.html @@ -0,0 +1,3 @@ +Ghost of von Hellmann:
+Take the key to von Hellmann's page, He's in the hidden village in the center of the forest. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-01.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-01.html new file mode 100644 index 0000000000..f996b8789e --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-01.html @@ -0,0 +1,4 @@ +Broken Desk:
+The chest is secured with a padlock which bears the mark of the Hellmann family.
+Use a Silver Spear key + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-02.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-02.html new file mode 100644 index 0000000000..4d71bbb831 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-02.html @@ -0,0 +1,6 @@ +Broken Desk:
+The chest opens with a creak.
+Inside, you find an old hairpin and a book tied with a leather string.
+Examine the hair pin.
+Examine the book. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-03.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-03.html new file mode 100644 index 0000000000..1dd24e7fbe --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-03.html @@ -0,0 +1,5 @@ +Broken Bookshelf:
+The chest opens with a creak. Inside, you find an old hairpin and a book tied with a leather string.
+Examine the hair pin.
+Examine the book. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-04.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-04.html new file mode 100644 index 0000000000..38a570515f --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-04.html @@ -0,0 +1,4 @@ +Broken Bookshelf:
+The hair pin is a type once used by aristocratic ladies. It's engraved with the image of a Moon Face Flower, and was probably used by a unattached young lady.
+"I wonder what that design means?" + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-05.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-05.html new file mode 100644 index 0000000000..34d7b93cc9 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-05.html @@ -0,0 +1,6 @@ +Broken Bookshelf:
+According to legend, the Moon Face Flower only blooms on moonlit nights.
+It's very shy, and shows its face only to its future husband. This legend made it quite popular among young, single, aristocratic ladies.
+I wonder who might have owned this one?
+Take the hairpin. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-06.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-06.html new file mode 100644 index 0000000000..2a5b92aca0 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-06.html @@ -0,0 +1,4 @@ +Broken Bookshelf:
+You took the hairpin.
+Check the bookshelf. You may find something else. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-07.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-07.html new file mode 100644 index 0000000000..94f8d67270 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-07.html @@ -0,0 +1,4 @@ +Broken Bookshelf:
+In the locker where you found the hairpin, you also find a book tied with a leather string.
+Examine the book. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-07a.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-07a.html new file mode 100644 index 0000000000..7a44b25299 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-07a.html @@ -0,0 +1,4 @@ +Broken Bookshelf:
+A book tied with a leather string. It's tied very tight, and doesn't seem like it could easily be cut.
+Try to cut the string. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-08.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-08.html new file mode 100644 index 0000000000..8d12eadce7 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-08.html @@ -0,0 +1,5 @@ +Broken Bookshelf:
+When you cut the string, it falls to the floor and you hear a faint sigh.
+Shall you read the book?
+Read the book. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-09.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-09.html new file mode 100644 index 0000000000..d91eecf003 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-09.html @@ -0,0 +1,6 @@ +Broken Bookshelf:
+"Month of Shilen, 15th day.
+Lately, Father spends all his days with Nidrah! He doesn't take care of the manor like he should. What makes him so angry?
+What's this?!
+"It's Lidia's Diary!" + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-10.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-10.html new file mode 100644 index 0000000000..37b4358938 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-10.html @@ -0,0 +1,4 @@ +Broken Bookshelf:
+It's a journal that belonged to Lidia von Hellmann. It probably has a lot of useful information in it!
+Pick up the journal. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-11.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-11.html new file mode 100644 index 0000000000..ad6aced3a7 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-11.html @@ -0,0 +1,4 @@ +Broken Bookshelf:
+You've found Lidia's Diary!
+Check the bookshelf again. You may find something else. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-12.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-12.html new file mode 100644 index 0000000000..6db064a55d --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-12.html @@ -0,0 +1,4 @@ +Broken Bookshelf:
+In the chest where you found the book, you also find a hairpin shaped like a Moon Face Flower.
+Examine the hairpin. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-13.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-13.html new file mode 100644 index 0000000000..ce7be3bba5 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-13.html @@ -0,0 +1,3 @@ +Broken Bookshelf:
+The locker is empty. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-01.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-01.html new file mode 100644 index 0000000000..0964ea2811 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-01.html @@ -0,0 +1,4 @@ +Box:
+It's an antique box with the von Hellmann family seal on the lock.
+Use the Silver Spear key. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-02.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-02.html new file mode 100644 index 0000000000..fcea7452be --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-02.html @@ -0,0 +1,3 @@ +Box:
+The box opens. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-03.html b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-03.html new file mode 100644 index 0000000000..1e5d9316ad --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-03.html @@ -0,0 +1,3 @@ +Box:
+It's empty. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/Q00023_LidiasHeart.java b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/Q00023_LidiasHeart.java new file mode 100644 index 0000000000..e124e4b599 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/Q00023_LidiasHeart.java @@ -0,0 +1,509 @@ +/* + * Copyright (C) 2004-2015 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package quests.Q00023_LidiasHeart; + +import quests.Q00024_InhabitantsOfTheForestOfTheDead.Q00024_InhabitantsOfTheForestOfTheDead; + +import com.l2jserver.gameserver.enums.QuestSound; +import com.l2jserver.gameserver.model.Location; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.quest.Quest; +import com.l2jserver.gameserver.model.quest.QuestState; +import com.l2jserver.gameserver.network.NpcStringId; +import com.l2jserver.gameserver.network.clientpackets.Say2; +import com.l2jserver.gameserver.network.serverpackets.NpcSay; + +/** + * Lidia's Heart (23) + * @author ivantotov + */ +public final class Q00023_LidiasHeart extends Quest +{ + // NPCs + private static final int HIGH_PRIEST_INNOCENTIN = 31328; + private static final int TRADER_VIOLET = 31386; + private static final int TOMBSTONE = 31523; + private static final int GHOST_OF_VON_HELLMANN = 31524; + private static final int BROKEN_BOOKSHELF = 31526; + private static final int BOX = 31530; + // Items + private static final int LIDIAS_DIARY = 7064; + private static final int SILVER_KEY = 7149; + private static final int SILVER_SPEAR = 7150; + // Reward + private static final int MAP_FOREST_OF_THE_DEAD = 7063; + private static final int LIDIAS_HAIRPIN = 7148; + // Misc + private static final int MIN_LEVEL = 64; + // Locations + private static final Location GHOST_SPAWN = new Location(51432, -54570, -3136); + + public Q00023_LidiasHeart() + { + super(23, Q00023_LidiasHeart.class.getSimpleName(), "Lidia's Heart"); + addStartNpc(HIGH_PRIEST_INNOCENTIN); + addTalkId(HIGH_PRIEST_INNOCENTIN, TRADER_VIOLET, TOMBSTONE, GHOST_OF_VON_HELLMANN, BROKEN_BOOKSHELF, BOX); + addSpawnId(GHOST_OF_VON_HELLMANN); + registerQuestItems(LIDIAS_DIARY, SILVER_KEY, SILVER_SPEAR); + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + if ("DESPAWN".equals(event)) + { + final L2Npc npc0 = npc.getVariables().getObject("npc0", L2Npc.class); + if (npc0 != null) + { + npc0.getVariables().set("SPAWNED", false); + } + npc.deleteMe(); + return super.onAdvEvent(event, npc, player); + } + + final QuestState qs = getQuestState(player, false); + if (qs == null) + { + return null; + } + + String htmltext = null; + switch (event) + { + case "ACCEPT": + { + if (player.getLevel() < MIN_LEVEL) + { + htmltext = "31328-02.htm"; + } + else + { + if (!hasQuestItems(player, MAP_FOREST_OF_THE_DEAD)) + { + giveItems(player, MAP_FOREST_OF_THE_DEAD, 1); + } + giveItems(player, SILVER_KEY, 1); + qs.startQuest(); + qs.setMemoState(1); + htmltext = "31328-03.htm"; + } + break; + } + case "31328-05.html": + case "31328-06.html": + case "31328-10.html": + case "31328-11.html": + case "31328-16.html": + case "31328-17.html": + case "31328-18.html": + case "31524-03.html": + case "31526-04.html": + case "31526-05.html": + case "31526-07a.html": + case "31526-09.html": + { + htmltext = event; + break; + } + case "31328-07.html": + { + if (qs.isMemoState(1)) + { + qs.setMemoState(2); + qs.setCond(2, true); + htmltext = event; + } + break; + } + case "31328-12.html": + { + if (qs.isMemoState(5) || qs.isMemoState(6)) + { + qs.setMemoState(6); + qs.setCond(5); + htmltext = event; + } + break; + } + case "31328-13.html": + { + if (qs.isMemoState(5) || qs.isMemoState(6)) + { + qs.setMemoState(7); + htmltext = event; + } + break; + } + case "31328-19.html": + { + playSound(player, QuestSound.AMBSOUND_MT_CREAK); + htmltext = event; + break; + } + case "31328-20.html": + { + if (qs.isMemoState(7)) + { + qs.setMemoState(8); + qs.setCond(6); + htmltext = event; + } + break; + } + case "31328-21.html": + { + qs.setCond(5); + htmltext = event; + break; + } + case "31523-02.html": + { + if (qs.isMemoState(8) || qs.isMemoState(9)) + { + playSound(player, QuestSound.SKILLSOUND_HORROR_02); + if (!npc.getVariables().getBoolean("SPAWNED", false)) + { + npc.getVariables().set("SPAWNED", true); + final L2Npc ghost = addSpawn(npc, GHOST_OF_VON_HELLMANN, GHOST_SPAWN, false, 0); + ghost.getVariables().set("npc0", npc); + htmltext = event; + } + else + { + htmltext = "31523-03.html"; + } + } + break; + } + case "31523-06.html": + { + if (qs.isMemoState(9)) + { + giveItems(player, SILVER_KEY, 1); + qs.setMemoState(10); + qs.setCond(8); + htmltext = event; + } + break; + } + case "31524-02.html": + { + playSound(player, QuestSound.CHRSOUND_MHFIGHTER_CRY); + htmltext = event; + break; + } + case "31524-04.html": + { + if (qs.isMemoState(8)) + { + takeItems(player, LIDIAS_DIARY, 1); + qs.setMemoState(9); + qs.setCond(7); + htmltext = event; + } + break; + } + case "31526-02.html": + { + if (qs.isMemoState(2) && hasQuestItems(player, SILVER_KEY)) + { + takeItems(player, SILVER_KEY, -1); + qs.setMemoState(3); + htmltext = event; + } + break; + } + case "31526-06.html": + { + if (!hasQuestItems(player, LIDIAS_HAIRPIN)) + { + giveItems(player, LIDIAS_HAIRPIN, 1); + } + qs.setMemoState(qs.getMemoState() + 1); + if (hasQuestItems(player, LIDIAS_DIARY)) + { + qs.setCond(4); + } + htmltext = event; + break; + } + case "31526-08.html": + { + playSound(player, QuestSound.ITEMSOUND_ARMOR_LEATHER); + htmltext = event; + break; + } + case "31526-10.html": + { + playSound(player, QuestSound.AMBSOUND_EG_DRON); + htmltext = event; + break; + } + case "31526-11.html": + { + giveItems(player, LIDIAS_DIARY, 1); + qs.setMemoState(qs.getMemoState() + 1); + if (hasQuestItems(player, LIDIAS_HAIRPIN)) + { + qs.setCond(4); + } + htmltext = event; + break; + } + case "31530-02.html": + { + if (qs.isMemoState(11) && hasQuestItems(player, SILVER_KEY)) + { + giveItems(player, SILVER_SPEAR, 1); + takeItems(player, SILVER_KEY, -1); + playSound(player, QuestSound.ITEMSOUND_WEAPON_SPEAR); + qs.setCond(10); + htmltext = event; + } + break; + } + } + return htmltext; + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance player) + { + final QuestState qs = getQuestState(player, true); + String htmltext = getNoQuestMsg(player); + if (qs.isCreated()) + { + if (npc.getId() == HIGH_PRIEST_INNOCENTIN) + { + final QuestState q22 = player.getQuestState("22_TragedyInVonHellmannForest"); + if ((q22 != null) && q22.isCompleted()) + { + htmltext = "31328-01.htm"; + } + else + { + htmltext = "31328-01a.html"; + } + } + } + else if (qs.isStarted()) + { + switch (npc.getId()) + { + case HIGH_PRIEST_INNOCENTIN: + { + switch (qs.getMemoState()) + { + case 1: + { + htmltext = "31328-04.html"; + break; + } + case 2: + { + htmltext = "31328-08.html"; + break; + } + case 5: + { + htmltext = "31328-09.html"; + break; + } + case 6: + { + htmltext = "31328-14.html"; + break; + } + case 7: + { + htmltext = "31328-15.html"; + break; + } + case 8: + { + qs.setCond(6, true); + htmltext = "31328-22.html"; + break; + } + } + break; + } + case TRADER_VIOLET: + { + switch (qs.getMemoState()) + { + case 10: + { + if (hasQuestItems(player, SILVER_KEY)) + { + qs.setMemoState(11); + qs.setCond(9, true); + htmltext = "31386-01.html"; + } + break; + } + case 11: + { + if (!hasQuestItems(player, SILVER_SPEAR)) + { + htmltext = "31386-02.html"; + } + else + { + giveAdena(player, 350000, true); + addExpAndSp(player, 456893, 42112); + qs.exitQuest(false, true); + htmltext = "31386-03.html"; + } + break; + } + } + break; + } + case TOMBSTONE: + { + switch (qs.getMemoState()) + { + case 8: + { + htmltext = "31523-01.html"; + break; + } + case 9: + { + htmltext = "31523-04.html"; + break; + } + case 10: + { + htmltext = "31523-05.html"; + break; + } + } + break; + } + case GHOST_OF_VON_HELLMANN: + { + final int memoState = qs.getMemoState(); + if (memoState == 8) + { + htmltext = "31524-01.html"; + } + else if (memoState == 9) + { + if (!hasQuestItems(player, SILVER_KEY)) + { + htmltext = "31524-05.html"; + } + } + else if ((memoState == 9) || (memoState == 10)) + { + if (hasQuestItems(player, SILVER_KEY)) + { + qs.setMemoState(10); + htmltext = "31524-06.html"; + } + } + break; + } + case BROKEN_BOOKSHELF: + { + switch (qs.getMemoState()) + { + case 2: + { + if (hasQuestItems(player, SILVER_KEY)) + { + qs.setCond(3, true); + htmltext = "31526-01.html"; + } + break; + } + case 3: + { + htmltext = "31526-03.html"; + break; + } + case 4: + { + if (hasQuestItems(player, LIDIAS_HAIRPIN)) + { + htmltext = "31526-07.html"; + } + else if (hasQuestItems(player, LIDIAS_DIARY)) + { + htmltext = "31526-12.html"; + } + break; + } + case 5: + { + if (hasQuestItems(player, LIDIAS_HAIRPIN, LIDIAS_DIARY)) + { + htmltext = "31526-13.html"; + } + break; + } + } + break; + } + case BOX: + { + if (qs.getMemoState() == 11) + { + if (hasQuestItems(player, SILVER_KEY)) + { + htmltext = "31530-01.html"; + } + else if (hasQuestItems(player, SILVER_SPEAR)) + { + htmltext = "31530-03.html"; + } + } + break; + } + } + } + else if (qs.isCompleted()) + { + if (npc.getId() == HIGH_PRIEST_INNOCENTIN) + { + htmltext = getAlreadyCompletedMsg(player); + } + else if (npc.getId() == TRADER_VIOLET) + { + final QuestState q24 = player.getQuestState(Q00024_InhabitantsOfTheForestOfTheDead.class.getSimpleName()); + if ((q24 == null)) + { + htmltext = "31386-04.html"; + } + } + } + return htmltext; + } + + @Override + public String onSpawn(L2Npc npc) + { + startQuestTimer("DESPAWN", 300000, npc, null); + npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.WHO_AWOKE_ME)); + return super.onSpawn(npc); + } +} \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00024_InhabitantsOfTheForestOfTheDead/Q00024_InhabitantsOfTheForestOfTheDead.java b/trunk/dist/game/data/scripts/quests/Q00024_InhabitantsOfTheForestOfTheDead/Q00024_InhabitantsOfTheForestOfTheDead.java index 58175ea86c..b812075cb2 100644 --- a/trunk/dist/game/data/scripts/quests/Q00024_InhabitantsOfTheForestOfTheDead/Q00024_InhabitantsOfTheForestOfTheDead.java +++ b/trunk/dist/game/data/scripts/quests/Q00024_InhabitantsOfTheForestOfTheDead/Q00024_InhabitantsOfTheForestOfTheDead.java @@ -18,6 +18,8 @@ */ package quests.Q00024_InhabitantsOfTheForestOfTheDead; +import quests.Q00023_LidiasHeart.Q00023_LidiasHeart; + import com.l2jserver.gameserver.enums.QuestSound; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -72,7 +74,7 @@ public class Q00024_InhabitantsOfTheForestOfTheDead extends Quest { // Dorian case "31389-02.htm": - final QuestState qs = player.getQuestState("23_LidiasHeart"); + final QuestState qs = player.getQuestState(Q00023_LidiasHeart.class.getSimpleName()); if ((player.getLevel() >= 65) && (qs != null) && qs.isCompleted()) { st.startQuest(); diff --git a/trunk/dist/game/data/scripts/quests/Q00144_PailakaInjuredDragon/Q00144_PailakaInjuredDragon.java b/trunk/dist/game/data/scripts/quests/Q00144_PailakaInjuredDragon/Q00144_PailakaInjuredDragon.java index 6e7d5aee4e..54beec49f0 100644 --- a/trunk/dist/game/data/scripts/quests/Q00144_PailakaInjuredDragon/Q00144_PailakaInjuredDragon.java +++ b/trunk/dist/game/data/scripts/quests/Q00144_PailakaInjuredDragon/Q00144_PailakaInjuredDragon.java @@ -400,11 +400,11 @@ public class Q00144_PailakaInjuredDragon extends Quest player.abortAttack(); player.abortCast(); player.stopMove(null); - if (player.hasSummon()) + if (player.hasPet()) { - player.getSummon().abortAttack(); - player.getSummon().abortCast(); - player.getSummon().stopMove(null); + player.getPet().abortAttack(); + player.getPet().abortCast(); + player.getPet().stopMove(null); } return null; } @@ -963,7 +963,7 @@ public class Q00144_PailakaInjuredDragon extends Quest // Checks if the summon or pet that the player has can be used. private final void checkMaxSummonLevel(L2PcInstance player) { - final L2Summon pet = player.getSummon(); + final L2Summon pet = player.getPet(); if (pet instanceof L2PetInstance) { if (pet.getLevel() > MAX_SUMMON_LEVEL) diff --git a/trunk/dist/game/data/scripts/quests/Q00177_SplitDestiny/32615-02.htm b/trunk/dist/game/data/scripts/quests/Q00177_SplitDestiny/32615-02.htm index d6f5dd8387..cd5a029a05 100644 --- a/trunk/dist/game/data/scripts/quests/Q00177_SplitDestiny/32615-02.htm +++ b/trunk/dist/game/data/scripts/quests/Q00177_SplitDestiny/32615-02.htm @@ -2,5 +2,5 @@ What do you want me to do with a bunch of rocks? Giant’s fragments you say and you want me to restore them? Hmm… that isn’t exactly in the description of my profession… but you know what I’ll give it a try.
Now let’s discuss my fee...
If you don't mind...
- + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00177_SplitDestiny/Q00177_SplitDestiny.java b/trunk/dist/game/data/scripts/quests/Q00177_SplitDestiny/Q00177_SplitDestiny.java index 8c9dc1b001..783b8e68a9 100644 --- a/trunk/dist/game/data/scripts/quests/Q00177_SplitDestiny/Q00177_SplitDestiny.java +++ b/trunk/dist/game/data/scripts/quests/Q00177_SplitDestiny/Q00177_SplitDestiny.java @@ -18,7 +18,7 @@ */ package quests.Q00177_SplitDestiny; -import com.l2jserver.gameserver.datatables.CategoryData; +import com.l2jserver.gameserver.data.xml.impl.CategoryData; import com.l2jserver.gameserver.enums.CategoryType; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/dist/game/data/scripts/quests/Q00357_WarehouseKeepersAmbition/Q00357_WarehouseKeepersAmbition.java b/trunk/dist/game/data/scripts/quests/Q00357_WarehouseKeepersAmbition/Q00357_WarehouseKeepersAmbition.java index 0f80feba43..383a0d6cb9 100644 --- a/trunk/dist/game/data/scripts/quests/Q00357_WarehouseKeepersAmbition/Q00357_WarehouseKeepersAmbition.java +++ b/trunk/dist/game/data/scripts/quests/Q00357_WarehouseKeepersAmbition/Q00357_WarehouseKeepersAmbition.java @@ -46,7 +46,7 @@ public final class Q00357_WarehouseKeepersAmbition extends Quest } // Misc private static final int MIN_LVL = 47; - + public Q00357_WarehouseKeepersAmbition() { super(357, Q00357_WarehouseKeepersAmbition.class.getSimpleName(), "Warehouse Keeper's Ambition"); @@ -55,7 +55,7 @@ public final class Q00357_WarehouseKeepersAmbition extends Quest addKillId(DROP_DATA.keySet()); registerQuestItems(JADE_CRYSTAL); } - + @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { @@ -119,7 +119,7 @@ public final class Q00357_WarehouseKeepersAmbition extends Quest } return htmltext; } - + @Override public String onTalk(L2Npc npc, L2PcInstance talker) { @@ -135,7 +135,7 @@ public final class Q00357_WarehouseKeepersAmbition extends Quest } return htmltext; } - + @Override public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { diff --git a/trunk/dist/game/data/scripts/quests/Q00421_LittleWingsBigAdventure/Q00421_LittleWingsBigAdventure.java b/trunk/dist/game/data/scripts/quests/Q00421_LittleWingsBigAdventure/Q00421_LittleWingsBigAdventure.java index 69102faec1..fc2e8e74dd 100644 --- a/trunk/dist/game/data/scripts/quests/Q00421_LittleWingsBigAdventure/Q00421_LittleWingsBigAdventure.java +++ b/trunk/dist/game/data/scripts/quests/Q00421_LittleWingsBigAdventure/Q00421_LittleWingsBigAdventure.java @@ -127,7 +127,7 @@ public final class Q00421_LittleWingsBigAdventure extends Quest } case "30747-04.html": { - final L2Summon summon = player.getSummon(); + final L2Summon summon = player.getPet(); if (summon == null) { @@ -145,7 +145,7 @@ public final class Q00421_LittleWingsBigAdventure extends Quest } case "30747-05.html": { - final L2Summon summon = player.getSummon(); + final L2Summon summon = player.getPet(); if (summon == null) { @@ -247,7 +247,7 @@ public final class Q00421_LittleWingsBigAdventure extends Quest } case 200: { - final L2Summon summon = talker.getSummon(); + final L2Summon summon = talker.getPet(); if (summon == null) { @@ -293,7 +293,7 @@ public final class Q00421_LittleWingsBigAdventure extends Quest { if (!hasQuestItems(talker, FAIRY_LEAF)) { - final L2Summon summon = talker.getSummon(); + final L2Summon summon = talker.getPet(); if (summon == null) { @@ -383,7 +383,8 @@ public final class Q00421_LittleWingsBigAdventure extends Quest final NpcData data = NPC_DATA.get(npc.getId()); if ((qs.getMemoState() % data.memoStateMod) < data.memoStateValue) { - if (attacker.getSummon().getControlObjectId() == qs.getInt("fluteObjectId")) + final L2Summon pet = attacker.getPet(); + if ((pet != null) && (pet.getControlObjectId() == qs.getInt("fluteObjectId"))) { final int hits = qs.getInt("hits") + 1; qs.set("hits", hits); diff --git a/trunk/dist/game/data/scripts/quests/Q00511_AwlUnderFoot/Q00511_AwlUnderFoot.java b/trunk/dist/game/data/scripts/quests/Q00511_AwlUnderFoot/Q00511_AwlUnderFoot.java index c1e3acda47..9519443c6d 100644 --- a/trunk/dist/game/data/scripts/quests/Q00511_AwlUnderFoot/Q00511_AwlUnderFoot.java +++ b/trunk/dist/game/data/scripts/quests/Q00511_AwlUnderFoot/Q00511_AwlUnderFoot.java @@ -349,7 +349,7 @@ public final class Q00511_AwlUnderFoot extends Quest @Override public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isSummon) { - L2Playable attacker = (isSummon ? player.getSummon() : player); + L2Playable attacker = (isSummon ? player.getServitors().values().stream().findFirst().orElse(player.getPet()) : player); if ((attacker.getLevel() - npc.getLevel()) >= 9) { if ((attacker.getBuffCount() > 0) || (attacker.getDanceCount() > 0)) diff --git a/trunk/dist/game/data/scripts/quests/Q00619_RelicsOfTheOldEmpire/Q00619_RelicsOfTheOldEmpire.java b/trunk/dist/game/data/scripts/quests/Q00619_RelicsOfTheOldEmpire/Q00619_RelicsOfTheOldEmpire.java index e0d128ff86..35f07887a0 100644 --- a/trunk/dist/game/data/scripts/quests/Q00619_RelicsOfTheOldEmpire/Q00619_RelicsOfTheOldEmpire.java +++ b/trunk/dist/game/data/scripts/quests/Q00619_RelicsOfTheOldEmpire/Q00619_RelicsOfTheOldEmpire.java @@ -68,7 +68,7 @@ public final class Q00619_RelicsOfTheOldEmpire extends Quest private static final int ENTRANCE_PASS_TO_THE_SEPULCHER = 7075; private static final int BROKEN_RELIC_PART = 7254; // Misc - private static final int MIN_LEVEL = 75; + private static final int MIN_LEVEL = 74; private static final int REQUIRED_RELIC_COUNT = 1000; // Reward private static final int[] RECIPES = diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-01.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-01.html new file mode 100644 index 0000000000..f59c27369c --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-01.html @@ -0,0 +1,5 @@ +Messenger:
+Are you after this Clan Hall? Do you have any idea where you are? You must be able to tame beasts if you expect to win this Clan Hall.
+Don't bite off more than you can chew, my friend!
+"I want to demonstrate my ability." + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-02.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-02.html new file mode 100644 index 0000000000..7dae89a584 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-02.html @@ -0,0 +1,4 @@ +Messenger:
+Registration begins an hour before the Clan Hall War.
+As far as I know, the next Clan Hall War is around %next_siege%. Check back then. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-03.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-03.html new file mode 100644 index 0000000000..b34aa104cc --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-03.html @@ -0,0 +1,4 @@ +Messenger:
+Ha! You think you stand a chance of winning with that ability?
+(Only Leaders of Clans of level 4 or above can do this.) + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-04.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-04.html new file mode 100644 index 0000000000..47416e11fa --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-04.html @@ -0,0 +1,3 @@ +Messenger:
+Hey, what are you doing? You already have a Clan Hall! Don't be greedy! Take off! + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-05.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-05.html new file mode 100644 index 0000000000..d2061869b8 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-05.html @@ -0,0 +1,4 @@ +Messenger:
+You're not the leader of your Clan.
+(Only Leaders of level 4 or above Clans can do this.) + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-06.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-06.html new file mode 100644 index 0000000000..a763ee0786 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-06.html @@ -0,0 +1,7 @@ +Messenger:
+Measuring your abilities is actually very simple.
+Just raise some beasts and bring me the proof.
+Raise them well, so they have a good heart, and they'll produce a Crystal of Purity. Bring me 10 Crystals of Purity and your ability will be proven.
+Remember to raise them along with your Clan, making sure to watch them closely.
+"How do I raise the beasts?" + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-06a.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-06a.html new file mode 100644 index 0000000000..77335cd9b1 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-06a.html @@ -0,0 +1,3 @@ +Herald:
+You can tame a beast using Golden Spice or Crystal Spice. You must've known that already, huh? + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-07.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-07.html new file mode 100644 index 0000000000..00baa37e39 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-07.html @@ -0,0 +1,3 @@ +Messenger:
+Did you participate in the previous contest? Then start again! + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-08.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-08.html new file mode 100644 index 0000000000..1fb9faccc9 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-08.html @@ -0,0 +1,6 @@ +Messenger:
+Surely you didn't think qualification would be easy? If you have time to gab like this, you have time to take the test...
+Don't forget to bring me 10 Crystals of Purity.
+Remember to raise the beast along with your clan, making sure to keep a close eye on it!
+"How do I raise the beasts?" + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-09.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-09.html new file mode 100644 index 0000000000..81acd6e28e --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-09.html @@ -0,0 +1,4 @@ +Messenger:
+If you have a Trainer License, register quickly!
+Clan Hall War Registration + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-10.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-10.html new file mode 100644 index 0000000000..ab41d3033b --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-10.html @@ -0,0 +1,4 @@ +Messenger:
+I checked out your 10 Crystals of Purity. While it's true you have skills, other clans are just as good as you. This Clan Hall War should prove to be very exciting! The finals will begin soon, so get registered. Only 5 clans may participate.
+Clan Hall War Registration + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-11.html b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-11.html new file mode 100644 index 0000000000..cc76a4b783 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-11.html @@ -0,0 +1,3 @@ +Messenger:
+Didn't I already cover that? Clan Hall registration begins an hour before the contest, and the next Clan Hall War will begin around %next_siege%. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/Q00655_AGrandPlanForTamingWildBeasts.java b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/Q00655_AGrandPlanForTamingWildBeasts.java new file mode 100644 index 0000000000..fef0eb360d --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/Q00655_AGrandPlanForTamingWildBeasts.java @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2004-2015 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package quests.Q00655_AGrandPlanForTamingWildBeasts; + +import java.text.SimpleDateFormat; +import java.util.Calendar; + +import com.l2jserver.gameserver.cache.HtmCache; +import com.l2jserver.gameserver.enums.QuestSound; +import com.l2jserver.gameserver.instancemanager.CHSiegeManager; +import com.l2jserver.gameserver.model.L2Clan; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.entity.clanhall.ClanHallSiegeEngine; +import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall; +import com.l2jserver.gameserver.model.quest.Quest; +import com.l2jserver.gameserver.model.quest.QuestState; +import com.l2jserver.gameserver.util.Util; + +/** + * A Grand Plan for Taming Wild Beasts (655) + * @author Zoey76 + */ +public final class Q00655_AGrandPlanForTamingWildBeasts extends Quest +{ + // NPCs + private static final int MESSENGER = 35627; + // Items + private static final int CRYSTAL_OF_PURITY = 8084; + private static final int TRAINER_LICENSE = 8293; + // Misc + private static final int REQUIRED_CRYSTAL_COUNT = 10; + private static final int REQUIRED_CLAN_LEVEL = 4; + private static final int MINUTES_TO_SIEGE = 3600; + private static final String PATH_TO_HTML = "data/scripts/conquerablehalls/flagwar/WildBeastReserve/messenger_initial.htm"; + + public Q00655_AGrandPlanForTamingWildBeasts() + { + super(655, Q00655_AGrandPlanForTamingWildBeasts.class.getSimpleName(), "A Grand Plan for Taming Wild Beasts"); + addStartNpc(MESSENGER); + addTalkId(MESSENGER); + registerQuestItems(CRYSTAL_OF_PURITY, TRAINER_LICENSE); + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + final QuestState qs = getQuestState(player, false); + if (qs == null) + { + return null; + } + + String htmltext = null; + final L2Clan clan = player.getClan(); + final long minutesToSiege = getMinutesToSiege(); + switch (event) + { + case "35627-06.html": + { + if (qs.isCreated()) + { + if ((clan != null) && (clan.getLevel() >= REQUIRED_CLAN_LEVEL) && (clan.getFortId() == 0) // + && player.isClanLeader() && (minutesToSiege > 0) && (minutesToSiege < MINUTES_TO_SIEGE)) + { + qs.startQuest(); + htmltext = event; + } + } + break; + } + case "35627-06a.html": + { + htmltext = event; + break; + } + case "35627-11.html": + { + if ((minutesToSiege > 0) && (minutesToSiege < MINUTES_TO_SIEGE)) + { + htmltext = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), PATH_TO_HTML); + } + else + { + htmltext = getHtm(player.getHtmlPrefix(), event); + htmltext = htmltext.replace("%next_siege%", getSiegeDate()); + } + break; + } + } + return htmltext; + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance talker) + { + final QuestState qs = getQuestState(talker, true); + String htmltext = getNoQuestMsg(talker); + final long minutesToSiege = getMinutesToSiege(); + if (qs.isCreated()) + { + final L2Clan clan = talker.getClan(); + if (clan == null) + { + return htmltext; + } + + if ((minutesToSiege > 0) && (minutesToSiege < MINUTES_TO_SIEGE)) + { + if (talker.isClanLeader()) + { + if (clan.getFortId() == 0) + { + if (clan.getLevel() >= REQUIRED_CLAN_LEVEL) + { + htmltext = "35627-01.html"; + } + else + { + htmltext = "35627-03.html"; + } + } + else + { + htmltext = "35627-04.html"; + } + } + else + { + if ((clan.getFortId() == ClanHallSiegeEngine.BEAST_FARM) && (minutesToSiege > 0) && (minutesToSiege < MINUTES_TO_SIEGE)) + { + htmltext = HtmCache.getInstance().getHtm(talker.getHtmlPrefix(), PATH_TO_HTML); + } + else + { + htmltext = "35627-05.html"; + } + } + } + else + { + htmltext = getHtm(talker.getHtmlPrefix(), "35627-02.html"); + htmltext = htmltext.replace("%next_siege%", getSiegeDate()); + } + } + else + { + if ((minutesToSiege < 0) || (minutesToSiege > MINUTES_TO_SIEGE)) + { + takeItems(talker, TRAINER_LICENSE, -1); + takeItems(talker, CRYSTAL_OF_PURITY, -1); + qs.exitQuest(true, true); + htmltext = "35627-07.html"; + } + else + { + if (hasQuestItems(talker, TRAINER_LICENSE)) + { + htmltext = "35627-09.html"; + } + else + { + if (getQuestItemsCount(talker, CRYSTAL_OF_PURITY) < REQUIRED_CRYSTAL_COUNT) + { + htmltext = "35627-08.html"; + } + else + { + giveItems(talker, TRAINER_LICENSE, 1); + takeItems(talker, CRYSTAL_OF_PURITY, -1); + qs.setCond(3, true); + htmltext = "35627-10.html"; + } + } + } + } + return htmltext; + } + + /** + * Gets the Wild Beast Reserve's siege date. + * @return the siege date + */ + private static String getSiegeDate() + { + final SiegableHall hall = CHSiegeManager.getInstance().getSiegableHall(ClanHallSiegeEngine.BEAST_FARM); + if (hall != null) + { + final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.format(hall.getSiegeDate()); + } + return "Error in date."; + } + + /** + * Gets the minutes to next siege. + * @return minutes to next siege + */ + private static long getMinutesToSiege() + { + final SiegableHall hall = CHSiegeManager.getInstance().getSiegableHall(ClanHallSiegeEngine.BEAST_FARM); + if (hall != null) + { + return (hall.getNextSiegeTime() - Calendar.getInstance().getTimeInMillis()) / 3600; + } + return -1; + } + + /** + * Rewards the clan leader with a Crystal of Purity after player tame a wild beast. + * @param player the player + * @param npc the wild beast + */ + public static void reward(L2PcInstance player, L2Npc npc) + { + final L2Clan clan = player.getClan(); + final L2PcInstance clanLeader = clan != null ? clan.getLeader().getPlayerInstance() : null; + if (clanLeader != null) + { + final QuestState qs655 = clanLeader.getQuestState(Q00655_AGrandPlanForTamingWildBeasts.class.getSimpleName()); + if (qs655 != null) + { + if ((getQuestItemsCount(clanLeader, CRYSTAL_OF_PURITY) < REQUIRED_CRYSTAL_COUNT) && Util.checkIfInRange(2000, clanLeader, npc, true)) + { + if (clanLeader.getLevel() >= REQUIRED_CLAN_LEVEL) + { + giveItems(clanLeader, CRYSTAL_OF_PURITY, 1); + } + + if (getQuestItemsCount(clanLeader, CRYSTAL_OF_PURITY) >= 9) + { + qs655.setCond(2, true); + } + else + { + playSound(clanLeader, QuestSound.ITEMSOUND_QUEST_ITEMGET); + } + } + } + } + } +} \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10292_SevenSignsGirlOfDoubt/Q10292_SevenSignsGirlOfDoubt.java b/trunk/dist/game/data/scripts/quests/Q10292_SevenSignsGirlOfDoubt/Q10292_SevenSignsGirlOfDoubt.java index 5f70c2f8cc..871654f350 100644 --- a/trunk/dist/game/data/scripts/quests/Q10292_SevenSignsGirlOfDoubt/Q10292_SevenSignsGirlOfDoubt.java +++ b/trunk/dist/game/data/scripts/quests/Q10292_SevenSignsGirlOfDoubt/Q10292_SevenSignsGirlOfDoubt.java @@ -168,16 +168,12 @@ public final class Q10292_SevenSignsGirlOfDoubt extends Quest creature1.setIsNoRndWalk(true); final L2Npc creature2 = addSpawn(CREATURE_OF_THE_DUSK2, 89524, -238131, -9632, 56, false, 0, false, player.getInstanceId()); creature2.setIsNoRndWalk(true); - ThreadPoolManager.getInstance().scheduleGeneral(new Runnable() + ThreadPoolManager.getInstance().scheduleGeneral(() -> { - @Override - public void run() - { - creature1.deleteMe(); - creature2.deleteMe(); - st.unset("ex"); - isBusy = false; - } + creature1.deleteMe(); + creature2.deleteMe(); + st.unset("ex"); + isBusy = false; }, 60000); } break; diff --git a/trunk/dist/game/data/scripts/quests/Q10323_TrainLikeItsReal/Q10323_TrainLikeItsReal.java b/trunk/dist/game/data/scripts/quests/Q10323_TrainLikeItsReal/Q10323_TrainLikeItsReal.java index 22e9148d94..d3187e1ae2 100644 --- a/trunk/dist/game/data/scripts/quests/Q10323_TrainLikeItsReal/Q10323_TrainLikeItsReal.java +++ b/trunk/dist/game/data/scripts/quests/Q10323_TrainLikeItsReal/Q10323_TrainLikeItsReal.java @@ -232,7 +232,7 @@ public class Q10323_TrainLikeItsReal extends Quest { final QuestState qs = getQuestState(killer, false); - if (npc.getId() == TRAINING_GOLEM) + if ((qs != null) && qs.isStarted()) { int killedGolem = qs.getInt(KILL_VAR); @@ -246,7 +246,7 @@ public class Q10323_TrainLikeItsReal extends Quest else { qs.set(KILL_VAR, killedGolem); - qs.playSound(QuestSound.ITEMSOUND_QUEST_ITEMGET); + playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET); } } else if (qs.isCond(6) || qs.isCond(7)) @@ -259,7 +259,7 @@ public class Q10323_TrainLikeItsReal extends Quest else { qs.set(KILL_VAR, killedGolem); - qs.playSound(QuestSound.ITEMSOUND_QUEST_ITEMGET); + playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET); } } } diff --git a/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-01.htm b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-01.htm new file mode 100644 index 0000000000..628e9357b1 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-01.htm @@ -0,0 +1,6 @@ +Forest Patrol Sivanthe:
+You must miss your friends and family back in Wind Realm.
+I also had a friend. She was there for me when my Lorne was killed by the monsters...she is but a child, but she is a truly kind heart.
+But she...
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-02.htm b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-02.htm new file mode 100644 index 0000000000..9088cfea0d --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-02.htm @@ -0,0 +1,5 @@ +Forest Patrol Sivanthe:
+She has a cold. What's that face? You thought something worse happened?
+Oh no. You've heard too many dark stories. She is my friend's sister, Leira. Leira has been sick for days with her cold. Speaking of which, could you help her recover from her cold?
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-03.htm b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-03.htm new file mode 100644 index 0000000000..8dfe698e45 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-03.htm @@ -0,0 +1,4 @@ +Forest Patrol Sivanthe:
+I heard honey is the best for colds. You can find the honey bee habitat inside the Whispering Woods. Get 10 bottles of Sweet Honey from Honey Bees and Robust Honeybees. You can collect the honey in the bottle that I give you. Also, she needs her stamina back. Please get 10 Nutritious Meats from Kiku.
+The name of my sick friend is Forest Patrol Leira. Please don't forget.
+ \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-04.htm b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-04.htm new file mode 100644 index 0000000000..7922c46a43 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-04.htm @@ -0,0 +1,3 @@ +Forest Patrol Sivanthe:
+Get 10 bottles of Sweet Honey from Honey Bees and Robust of Honeybees,and 10 Nutritious Meats from Kiku and bring them to Forest Patrol Leira. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-05.htm b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-05.htm new file mode 100644 index 0000000000..2c8d59dfbe --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-05.htm @@ -0,0 +1,4 @@ +Forest Patrol Sivanthe:
+When Leira said that she wanted to be a Forest Patrol, her sister Karla was very worried. Leira always has a cold.
+(Only Ertheia characters Lv. 10 to 20 can perform this quest.)
+ \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33952-01.htm b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33952-01.htm new file mode 100644 index 0000000000..605b9b892d --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33952-01.htm @@ -0,0 +1,6 @@ +Forest Patrol Leira:
+Oh, my. Sivanthe? Did she send me something for my cold? Does my sister know that I'm sick?
+Cough, cough... So, Sivanthe knew. She's going to lecture me for hours! With such a stoic face, too. Cough...Although, I guess it's better than just staring up at the sky with no one to talk to since Lorne left...cough, cough...Oh, what am I saying?
+By the way, what are you doing for Sivanthe?
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33952-02.htm b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33952-02.htm new file mode 100644 index 0000000000..6422d7015c --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33952-02.htm @@ -0,0 +1,4 @@ +Forest Patrol Leira:
+Did you...collect, cough, all this, cough, alone?
+But, if I take these and don't get better, Sivanthe's lecturing will, cough, get worse, cough. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/Q10741_ADraughtForTheCold.java b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/Q10741_ADraughtForTheCold.java new file mode 100644 index 0000000000..bbf61fc93d --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/Q10741_ADraughtForTheCold.java @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2004-2015 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package quests.Q10741_ADraughtForTheCold; + +import com.l2jserver.gameserver.enums.QuestSound; +import com.l2jserver.gameserver.enums.Race; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.quest.Quest; +import com.l2jserver.gameserver.model.quest.QuestState; + +/** + * @author Sdw + */ +public class Q10741_ADraughtForTheCold extends Quest +{ + // NPC's + private static final int SIVANTHE = 33951; + private static final int LEIRA = 33952; + // Items + private static final int EMPTY_HONEY_JAR = 39527; + private static final int SWEET_HONEY = 39528; + private static final int NUTRITIOUS_MEAT = 39529; + // Mobs + private static final int HONEY_BEE = 23452; + private static final int KIKU = 23453; + private static final int ROBUST_HONEY_BEE = 23484; + // Misc + private static final int MIN_LEVEL = 10; + private static final int MAX_LEVEL = 20; + + public Q10741_ADraughtForTheCold() + { + super(10741, Q10741_ADraughtForTheCold.class.getSimpleName(), "A Draught For The Cold"); + addStartNpc(SIVANTHE); + addTalkId(SIVANTHE, LEIRA); + addKillId(HONEY_BEE, KIKU, ROBUST_HONEY_BEE); + registerQuestItems(EMPTY_HONEY_JAR, SWEET_HONEY, NUTRITIOUS_MEAT); + addCondLevel(MIN_LEVEL, MAX_LEVEL, "33951-07.htm"); + addCondRace(Race.ERTHEIA, "33951-07.htm"); + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + final QuestState qs = getQuestState(player, false); + if (qs == null) + { + return null; + } + + String htmltext = null; + switch (event) + { + case "33951-03.htm": + { + qs.startQuest(); + giveItems(player, EMPTY_HONEY_JAR, 10); + htmltext = event; + break; + } + case "33951-02.htm": + { + htmltext = event; + break; + } + case "33952-02.htm": + { + if (qs.isCond(2)) + { + giveAdena(player, 2000, true); + addExpAndSp(player, 22973, 2); + qs.exitQuest(false, true); + htmltext = event; + } + break; + } + } + return htmltext; + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance player) + { + final QuestState qs = getQuestState(player, true); + String htmltext = getNoQuestMsg(player); + + if (qs.isCompleted()) + { + htmltext = getAlreadyCompletedMsg(player); + } + + switch (npc.getId()) + { + case SIVANTHE: + { + if (qs.isCreated()) + { + htmltext = "33951-01.htm"; + } + else if (qs.isStarted()) + { + htmltext = "33951-04.htm"; + } + break; + } + case LEIRA: + { + if (qs.isCond(2)) + { + htmltext = "33952-01.htm"; + } + break; + } + } + return htmltext; + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) + { + final QuestState qs = getQuestState(killer, false); + if ((qs != null) && qs.isCond(1)) + { + switch (npc.getId()) + { + case HONEY_BEE: + case ROBUST_HONEY_BEE: + { + if (hasQuestItems(killer, EMPTY_HONEY_JAR)) + { + takeItems(killer, EMPTY_HONEY_JAR, 1); + giveItems(killer, SWEET_HONEY, 1); + playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET); + } + break; + } + case KIKU: + { + giveItemRandomly(killer, npc, NUTRITIOUS_MEAT, 1, 10, 1.0, true); + break; + } + } + + if ((getQuestItemsCount(killer, SWEET_HONEY) >= 10) && (getQuestItemsCount(killer, NUTRITIOUS_MEAT) >= 10)) + { + qs.setCond(2, true); + } + } + return super.onKill(npc, killer, isSummon); + } +} diff --git a/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-01.htm b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-01.htm new file mode 100644 index 0000000000..317f15f57d --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-01.htm @@ -0,0 +1,6 @@ +Forest Patrol Leira:
+Did you happen to see a small fox playing in this area?
+Cough, my dear Ricky hasn't gotten a lot of attention from me lately due to my cold, cough...
+My Ricky may be small, but he eats a lot. And when he looks at me with those big eyes...cough!
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-02.htm b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-02.htm new file mode 100644 index 0000000000..d493b825f7 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-02.htm @@ -0,0 +1,7 @@ +Forest Patrol Leira:
+Ricky's favorite thing to do was chase Kiku around. I'd scold him, saying that's dangerous, but I would always catch him chasing Kiku anyway.
+Cough... This cold just isn't going away. Oh, my, where's my brain? I haven's show him to you yet.
+Would you like to meet Ricky?
+ + + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-03.htm b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-03.htm new file mode 100644 index 0000000000..13f5ef0d61 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-03.htm @@ -0,0 +1,6 @@ +Forest Patrol Leira:
+Oh no! Where did Ricky run off to now?
+It's dangerous over on that side! The Kikus and Growlers might hurt him. Please go find him. I can't leave my post.
+Cough... You'll find him in one of the 3 Kiku's Caves up there. Once you find him, you have 2 minutes to bring him back to me. Ricky might get restless and run away again.
+Do be careful. The Kiku might attack you for rummaging around its cave.
+ \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-04.htm b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-04.htm new file mode 100644 index 0000000000..7ae78c754f --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-04.htm @@ -0,0 +1,5 @@ +Forest Patrol Leira:
+Ricky!
+Where do you think you are going again, you little...cough, cough!
+I think Ricky needs, cough, some obedience traning. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-05.htm b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-05.htm new file mode 100644 index 0000000000..6ca99bf8f7 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-05.htm @@ -0,0 +1,3 @@ +Forest Patrol Leira:
+You're unbelievable! Cough... + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-01.htm b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-01.htm new file mode 100644 index 0000000000..79b458c549 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-01.htm @@ -0,0 +1,4 @@ +Kiku's Cave:
+This cave looks small. Is Ricky inside?
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-02.htm b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-02.htm new file mode 100644 index 0000000000..a0873a1b59 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-02.htm @@ -0,0 +1,4 @@ +Kiku's Cave:
+No Ricky, but plenty of Kikus.
+Try another Kiku's Cave. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-03.htm b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-03.htm new file mode 100644 index 0000000000..f5b43a1bab --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-03.htm @@ -0,0 +1,3 @@ +Kiku's Cave:
+Excellent, you found him!
+ \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/Q10742_AFurryFriend.java b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/Q10742_AFurryFriend.java new file mode 100644 index 0000000000..1eca294d0c --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/Q10742_AFurryFriend.java @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2004-2015 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package quests.Q10742_AFurryFriend; + +import com.l2jserver.gameserver.ai.CtrlIntention; +import com.l2jserver.gameserver.enums.Race; +import com.l2jserver.gameserver.model.Location; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.quest.Quest; +import com.l2jserver.gameserver.model.quest.QuestState; +import com.l2jserver.gameserver.network.NpcStringId; +import com.l2jserver.gameserver.network.serverpackets.ExSendUIEvent; +import com.l2jserver.gameserver.network.serverpackets.ExShowScreenMessage; + +/** + * @author Sdw + */ +public class Q10742_AFurryFriend extends Quest +{ + // NPC's + private static final int LEIRA = 33952; + private static final int KIKU_S_CAVE = 33995; + private static final int RICKY = 19552; + private static final int KIKU = 23453; + // Misc + private static final int MIN_LEVEL = 11; + private static final int MAX_LEVEL = 20; + // Location + private static final Location RICKY_SPAWN = new Location(-78138, 237328, -3548); + // Waypoints + protected static Location[] WAYPOINTS = + { + new Location(-78152, 237352, -3569), + new Location(-79176, 236792, -3440), + new Location(-80072, 237064, -3311), + new Location(-80440, 237320, -3313) + }; + + public Q10742_AFurryFriend() + { + super(10742, Q10742_AFurryFriend.class.getSimpleName(), "A Furry Friend"); + addStartNpc(LEIRA); + addTalkId(LEIRA, KIKU_S_CAVE); + addMoveFinishedId(RICKY); + addCondRace(Race.ERTHEIA, "fixme.html"); + addCondLevel(MIN_LEVEL, MAX_LEVEL, "fixme.html"); + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + final QuestState qs = getQuestState(player, false); + if (qs == null) + { + return null; + } + + String htmltext = null; + switch (event) + { + case "33952-02.htm": + case "33952-05.htm": + { + htmltext = event; + break; + } + case "33952-03.htm": + { + qs.startQuest(); + final L2Npc ricky = addSpawn(RICKY, RICKY_SPAWN); + ricky.setIsRunning(true); + ricky.setSummoner(player); + startQuestTimer("start_move_ricky", 1000, ricky, player); + showOnScreenMsg(player, NpcStringId.FOLLOW_RICKY, ExShowScreenMessage.TOP_CENTER, 4500); + htmltext = event; + break; + } + case "start_move_ricky": + { + npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, WAYPOINTS[0]); + npc.setScriptValue(0); + break; + } + case "33995-03.htm": + { + if (qs.isStarted()) + { + if (!player.getKnownList().getKnownCharactersInRadius(500).stream().anyMatch(n -> (n.getId() == RICKY) && (n.getSummoner() == player))) + { + showOnScreenMsg(player, NpcStringId.TAKE_RICKY_TO_LEIRA_IN_UNDER_2_MINUTES, ExShowScreenMessage.MIDDLE_CENTER, 4500); + final L2Npc ricky = addSpawn(RICKY, player.getLocation()); + ricky.setSummoner(player); + ricky.setTitle(player.getAppearance().getVisibleName()); + ricky.setIsRunning(true); + ricky.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, player); + startQuestTimer("check_ricky_distance", 1000, ricky, player, true); + startQuestTimer("unspawn_ricky_failed", 120000, ricky, player); + player.sendPacket(new ExSendUIEvent(player, false, false, 0, 120, NpcStringId.REMAINING_TIME)); + } + } + break; + } + case "check_ricky_distance": + { + if (player == null) + { + startQuestTimer("unspawn_ricky", 2000, npc, null); + } + else + { + // Follow was breaking sometimes, making sure it doesn't happen. + npc.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, player); + + final double distanceToRicky = player.calculateDistance(npc, false, true); + + if ((distanceToRicky > 200) && (distanceToRicky < 500)) + { + showOnScreenMsg(player, NpcStringId.YOU_ARE_FAR_FROM_RICKY, ExShowScreenMessage.TOP_CENTER, 4500); + } + else if (distanceToRicky > 500) + { + startQuestTimer("unspawn_ricky_failed", 120000, npc, player); + } + else + { + final L2Npc leira = (L2Npc) npc.getKnownList().getKnownCharactersInRadius(100).stream().filter(n -> (n.getId() == LEIRA)).findFirst().orElse(null); + if (leira != null) + { + qs.setCond(2, true); + showOnScreenMsg(player, NpcStringId.RICKY_HAS_FOUND_LEIRA, ExShowScreenMessage.TOP_CENTER, 4500); + player.sendPacket(new ExSendUIEvent(player, false, false, 0, 0, NpcStringId.REMAINING_TIME)); + startQuestTimer("unspawn_ricky", 2000, npc, player); + cancelQuestTimer("check_ricky_distance", npc, player); + } + } + } + break; + } + case "unspawn_ricky": + { + npc.deleteMe(); + break; + } + case "unspawn_ricky_failed": + { + showOnScreenMsg(player, NpcStringId.BRING_BACK_RICKY, ExShowScreenMessage.TOP_CENTER, 4500); + npc.deleteMe(); + break; + } + } + + return htmltext; + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance player) + { + final QuestState qs = getQuestState(player, true); + String htmltext = getNoQuestMsg(player); + + if (qs.isCompleted()) + { + htmltext = getAlreadyCompletedMsg(player); + } + + switch (npc.getId()) + { + case LEIRA: + { + if (qs.isCreated()) + { + htmltext = "33952-01.htm"; + } + else if (qs.isCond(2)) + { + giveAdena(player, 2500, true); + addExpAndSp(player, 52516, 5); + qs.exitQuest(false, true); + htmltext = "33952-04.htm"; + } + break; + } + case KIKU_S_CAVE: + { + if (qs.isStarted()) + { + if (getRandomBoolean()) + { + htmltext = "33995-01.htm"; + } + else + { + addAttackPlayerDesire(addSpawn(KIKU, player.getLocation(), true, 120000), player); + showOnScreenMsg(player, NpcStringId.RICKY_IS_NOT_HERE_NTRY_SEARCHING_ANOTHER_KIKU_S_CAVE, ExShowScreenMessage.TOP_CENTER, 4500); + htmltext = "33995-02.htm"; + } + } + break; + } + } + + return htmltext; + } + + @Override + public void onMoveFinished(L2Npc npc) + { + final int currentWaypoint = npc.getScriptValue(); + + switch (currentWaypoint) + { + case 0: + case 1: + case 2: + { + npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, WAYPOINTS[currentWaypoint + 1]); + npc.setScriptValue(currentWaypoint + 1); + break; + } + case 3: + { + showOnScreenMsg(npc.getSummoner().getActingPlayer(), NpcStringId.RICKY_IS_ENTERING_KIKU_S_CAVE, ExShowScreenMessage.TOP_CENTER, 4500); + npc.deleteMe(); + break; + } + } + } +} diff --git a/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-01.htm b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-01.htm new file mode 100644 index 0000000000..522fe478c0 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-01.htm @@ -0,0 +1,6 @@ +Forest Patrol Leira:
+I feel chilly. So tired of this cold. My cough's a bit better, though.
+Look at me, sick as a dog, any my Ricky just goes running off again. Where did he go now? I can't rest for a second.
+Oh, right! Mushrooms! A little while ago, I saw a very unusual mushroom spirit!
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-02.htm b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-02.htm new file mode 100644 index 0000000000..3c6e128862 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-02.htm @@ -0,0 +1,7 @@ +Forest Patrol Leira:
+Growlers are mushroom spirits. They used to be cute and calm spirits, but one they entered the Material Realm, they became dangerous. They were never known to harm anyone back in the Wind Spirit Realm.
+Oh, my, I'm rambling again. So, about these unusual mushrooms spirit.
+All the Growlers living in their habitat are the same color. But recently, I was out searching for Ricky when I came across a Growler that was a different color from the rest. +What if that particular Growler is poisonous? Ricky could get hurt! Please go see if that Growler is poisonous!
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-03.htm b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-03.htm new file mode 100644 index 0000000000..4d3a83ff83 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-03.htm @@ -0,0 +1,4 @@ +Forest Patrol Leira:
+All right. That unusual mushroom won't be easy to spot. It appears when the normal Growlers disappear, or something. Hard to explain.
+Anyway, if you cut down the Growlers, Evolved Growlers will appear in their place. Collet some Growler spores and take them to Forest Patrol Milone. Milone is an expert at mushrooms! + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-01.htm b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-01.htm new file mode 100644 index 0000000000..2bf055e153 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-01.htm @@ -0,0 +1,5 @@ +Forest Patrol Milone:
+Growlers are very sensitive spirits. I don't know what caused the Dimensional Rift. But I will never forgive whoever caused this.
+I'm sorry, was I making you nervous? I wasn't talking to you. What brings you all the way in here?
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-02.htm b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-02.htm new file mode 100644 index 0000000000..f1b62fa8d0 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-02.htm @@ -0,0 +1,6 @@ +Forest Patrol Milone:
+They are Growler's spores. The color is different, but I'm sure they are Growler's spores.
+The Growlers are adjusting to the Material Realm, which causes other kinds of Growlers to be found. This must be one of those Growler's spores.
+I see that everyone is getting scared with the new appearance of the Growlers, but there's no need to be. They are just tougher Growlers of a different color. But why give this to me? + + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-03.htm b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-03.htm new file mode 100644 index 0000000000..123533dc73 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-03.htm @@ -0,0 +1,9 @@ +Forest Patrol Milone:
+Leira sent you? The foolish child that only cares about her little fox? +
+Oh! Hahahaha! +
+I'm sorry, haha. She must have been worried that the Growler's Spores might hurt her fox. I'm sure! Hahaha. +
+I'm in tears. Hahaha! + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/Q10743_StrangeFungus.java b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/Q10743_StrangeFungus.java new file mode 100644 index 0000000000..d48e86b2eb --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/Q10743_StrangeFungus.java @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2004-2015 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package quests.Q10743_StrangeFungus; + +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.holders.ItemHolder; +import com.l2jserver.gameserver.model.quest.Quest; +import com.l2jserver.gameserver.model.quest.QuestState; +import com.l2jserver.gameserver.network.NpcStringId; +import com.l2jserver.gameserver.network.serverpackets.ExShowScreenMessage; + +/** + * @author Sdw + */ +public class Q10743_StrangeFungus extends Quest +{ + // NPCs + private static final int LEIRA = 33952; + private static final int MILONE = 33953; + private static final int GROWLER = 23455; + private static final int ROBUST_GROWLER = 23486; + private static final int EVOLVED_GROWLER = 23456; + // Items + private static final int PECULIAR_MUSHROOM_SPORE = 39530; + private static final ItemHolder LEATHER_SHOES = new ItemHolder(37, 1); + // Misc + private static final int MIN_LEVEL = 13; + private static final int MAX_LEVEL = 20; + private static final String KILL_VAR = "KillCount"; + + public Q10743_StrangeFungus() + { + super(10743, Q10743_StrangeFungus.class.getSimpleName(), "Strange Fungus"); + addStartNpc(LEIRA); + addTalkId(LEIRA, MILONE); + addKillId(GROWLER, ROBUST_GROWLER, EVOLVED_GROWLER); + registerQuestItems(PECULIAR_MUSHROOM_SPORE); + addCondLevel(MIN_LEVEL, MAX_LEVEL, "fixme.htm"); + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + final QuestState qs = getQuestState(player, false); + if (qs == null) + { + return null; + } + + String htmltext = null; + switch (event) + { + case "33952-02.htm": + case "33953-02.htm": + { + htmltext = event; + break; + } + case "33952-03.htm": + { + qs.startQuest(); + htmltext = event; + break; + } + case "33953-03.htm": + { + if (qs.isCond(2)) + { + giveAdena(player, 62000, true); + addExpAndSp(player, 62876, 0); + giveItems(player, LEATHER_SHOES); + showOnScreenMsg(player, NpcStringId.CHECK_YOUR_EQUIPMENT_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 4500); + qs.exitQuest(false, true); + htmltext = event; + } + break; + } + } + return htmltext; + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance player) + { + final QuestState qs = getQuestState(player, true); + String htmltext = getNoQuestMsg(player); + + if (qs.isCompleted()) + { + htmltext = getAlreadyCompletedMsg(player); + } + + switch (npc.getId()) + { + case LEIRA: + { + if (qs.isCreated()) + { + htmltext = "33952-01.htm"; + } + else if (qs.isStarted()) + { + htmltext = "33952-03.htm"; + } + break; + } + case MILONE: + { + if (qs.isCond(2)) + { + htmltext = "33953-01.htm"; + } + break; + } + } + + return htmltext; + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) + { + final QuestState qs = getQuestState(killer, false); + + if ((qs != null) && qs.isCond(1) && (getQuestItemsCount(killer, PECULIAR_MUSHROOM_SPORE) < 10)) + { + switch (npc.getId()) + { + case GROWLER: + case ROBUST_GROWLER: + { + final int killCount = qs.getInt(KILL_VAR) + 1; + if (killCount >= 3) + { + addAttackPlayerDesire(addSpawn(EVOLVED_GROWLER, npc.getLocation()), killer); + qs.set(KILL_VAR, 0); + } + else + { + qs.set(KILL_VAR, killCount); + } + break; + } + case EVOLVED_GROWLER: + { + if (giveItemRandomly(killer, npc, PECULIAR_MUSHROOM_SPORE, 1, 10, 1.0, true)) + { + qs.setCond(2); + } + break; + } + } + } + return super.onKill(npc, killer, isSummon); + } +} diff --git a/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-01.htm b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-01.htm new file mode 100644 index 0000000000..a7e83dc2a5 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-01.htm @@ -0,0 +1,5 @@ +Forest Patrol Milone:
+I am a scholar first and foremost. The Ertheia are known for our curiosity, after all.
+But apparently there are people in this world that are quite persistent as well.
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-02.htm b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-02.htm new file mode 100644 index 0000000000..7b5c0e2524 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-02.htm @@ -0,0 +1,5 @@ +Forest Patrol Milone:
+It's Maestro Dolkin. At first I wondered what a Warehouse Keeper was doing here. He doesn't waste even a branch on the ground. He never rest until he finishes the research he started. Are you interested? He is always whining about lack of research material. Perhaps he could get you something nice if you be nice to him.
+Do you want to go see him?
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-03.htm b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-03.htm new file mode 100644 index 0000000000..ce420acbcb --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-03.htm @@ -0,0 +1,4 @@ +Forest Patrol Milone:
+Not only you've gotten here safely, but you're also interested in intellectual pursuits. You're not just an average wanderer. + Maestro Dolkin is in the Treant habitat. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-01.htm b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-01.htm new file mode 100644 index 0000000000..586381af23 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-01.htm @@ -0,0 +1,6 @@ +Maestro Dolkin:
+You can't produce strong weapon or armor by just banging on the ingredients for a long time. The material and the timing have to be just right in order to produce some brilliant gear. Just like how I can. Ha ha ha.
+Now that I see it, your armor is very poor. It's not affording you much protection, and you'll get injured eventually. Now, I am a very skilled Dwarf. Even that snooty Forest Patroller Milone acknowledges this.
+If I gave you some good armor, will you consider helping me with something? It's nothing bad, just gathering up some material.
+ + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-02.htm b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-02.htm new file mode 100644 index 0000000000..6983896dbe --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-02.htm @@ -0,0 +1,6 @@ +Maestro Dolkin:
+You've got fire in you. I like that!
+What material do you think will produce the strongest armor? Diamond's a strong material, but it's very expensive and hard to forge. Steel is good, but it's too heavy, and rusts easily.
+The best material I've found is a tree leaf! The tree leaves around here are different from other leaves. They don't decay and they're very durable. And they're light! I've been researching the leaves in the Whispering Woods for use in high-quality armor. Leaves, stronger than steel! Don't you think that's amazing? + + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-03.htm b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-03.htm new file mode 100644 index 0000000000..b627a34ab7 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-03.htm @@ -0,0 +1,5 @@ +Maestro Dolkin:
+So impatient!
+The materials you need to gather are Treant Leaf and Leafie Leaf. Armor woven from these leaves are very light and strong, and makes you feels like you're flying.
+Get going! + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-04.htm b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-04.htm new file mode 100644 index 0000000000..7b7d50e767 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-04.htm @@ -0,0 +1,5 @@ +Maestro Dolkin:
+You are certainly strong! With this much material, I can just research for awhile. To be honest, I'm still doing research on the type of armor I want to create. Oh now, don't look at me like that. Your face will stick that way.
+That's not all I was going to say. I never said I wasn't going to give you any armor.
+I'm going to give you one that's appropriate for you right now, so don't worry. + \ No newline at end of file diff --git a/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/Q10744_StrongerThanSteel.java b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/Q10744_StrongerThanSteel.java new file mode 100644 index 0000000000..5b3c9fdeb0 --- /dev/null +++ b/trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/Q10744_StrongerThanSteel.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2004-2014 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package quests.Q10744_StrongerThanSteel; + +import com.l2jserver.gameserver.enums.Race; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.quest.Quest; +import com.l2jserver.gameserver.model.quest.QuestState; + +/** + * @author Sdw + */ +public class Q10744_StrongerThanSteel extends Quest +{ + // NPC's + private static final int MILONE = 33953; + private static final int DOLKIN = 33954; + private static final int TREANT = 23457; + private static final int LEAFIE = 23458; + // Misc + private static final int MIN_LEVEL = 15; + private static final int MAX_LEVEL = 20; + // Item + private static final int TREANT_LEAF = 39532; + private static final int LEAFIE_LEAF = 39531; + + public Q10744_StrongerThanSteel() + { + super(10744, Q10744_StrongerThanSteel.class.getSimpleName(), "Stronger Than Steel"); + addStartNpc(MILONE); + addTalkId(MILONE, DOLKIN); + addKillId(TREANT, LEAFIE); + registerQuestItems(TREANT_LEAF, LEAFIE_LEAF); + addCondLevel(MIN_LEVEL, MAX_LEVEL, "fixme.htm"); + addCondRace(Race.ERTHEIA, "fixme.htm"); + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + final QuestState qs = getQuestState(player, false); + if (qs == null) + { + return null; + } + + String htmltext = null; + switch (event) + { + case "33953-02.htm": + case "33954-02.htm": + { + htmltext = event; + break; + } + case "33953-03.htm": + { + qs.startQuest(); + htmltext = event; + break; + } + case "33954-03.htm": + { + if (qs.isCond(1)) + { + qs.setCond(2, true); + } + break; + } + } + return htmltext; + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance player) + { + final QuestState qs = getQuestState(player, true); + String htmltext = getNoQuestMsg(player); + + if (qs.isCompleted()) + { + htmltext = getAlreadyCompletedMsg(player); + } + + switch (npc.getId()) + { + case MILONE: + { + if (qs.isCreated()) + { + htmltext = "33953-01.htm"; + } + else if (qs.isStarted()) + { + htmltext = "33953-03.htm"; + } + break; + } + case DOLKIN: + { + if (qs.isCond(1)) + { + htmltext = "33954-01.htm"; + } + else if (qs.isCond(3)) + { + htmltext = "33954-04.htm"; + giveAdena(player, 34000, true); + addExpAndSp(player, 112001, 5); + qs.exitQuest(false, true); + } + break; + } + } + + return htmltext; + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) + { + final QuestState qs = getQuestState(killer, false); + + if ((qs != null) && qs.isCond(2)) + { + if (npc.getId() == TREANT) + { + giveItemRandomly(killer, npc, TREANT_LEAF, 1, 20, 1.0, true); + } + else if (npc.getId() == LEAFIE) + { + giveItemRandomly(killer, npc, LEAFIE_LEAF, 1, 15, 1.0, true); + } + + if ((getQuestItemsCount(killer, TREANT_LEAF) >= 20) && (getQuestItemsCount(killer, LEAFIE_LEAF) >= 15)) + { + qs.setCond(3, true); + } + } + + return super.onKill(npc, killer, isSummon); + } +} diff --git a/trunk/dist/game/data/scripts/quests/QuestMasterHandler.java b/trunk/dist/game/data/scripts/quests/QuestMasterHandler.java index 43d91e5fea..787b43d620 100644 --- a/trunk/dist/game/data/scripts/quests/QuestMasterHandler.java +++ b/trunk/dist/game/data/scripts/quests/QuestMasterHandler.java @@ -32,6 +32,7 @@ import quests.Q00018_MeetingWithTheGoldenRam.Q00018_MeetingWithTheGoldenRam; import quests.Q00019_GoToThePastureland.Q00019_GoToThePastureland; import quests.Q00020_BringUpWithLove.Q00020_BringUpWithLove; import quests.Q00021_HiddenTruth.Q00021_HiddenTruth; +import quests.Q00023_LidiasHeart.Q00023_LidiasHeart; import quests.Q00024_InhabitantsOfTheForestOfTheDead.Q00024_InhabitantsOfTheForestOfTheDead; import quests.Q00026_TiredOfWaiting.Q00026_TiredOfWaiting; import quests.Q00027_ChestCaughtWithABaitOfWind.Q00027_ChestCaughtWithABaitOfWind; @@ -242,6 +243,7 @@ import quests.Q00651_RunawayYouth.Q00651_RunawayYouth; import quests.Q00652_AnAgedExAdventurer.Q00652_AnAgedExAdventurer; import quests.Q00653_WildMaiden.Q00653_WildMaiden; import quests.Q00654_JourneyToASettlement.Q00654_JourneyToASettlement; +import quests.Q00655_AGrandPlanForTamingWildBeasts.Q00655_AGrandPlanForTamingWildBeasts; import quests.Q00659_IdRatherBeCollectingFairyBreath.Q00659_IdRatherBeCollectingFairyBreath; import quests.Q00660_AidingTheFloranVillage.Q00660_AidingTheFloranVillage; import quests.Q00661_MakingTheHarvestGroundsSafe.Q00661_MakingTheHarvestGroundsSafe; @@ -311,6 +313,10 @@ import quests.Q10737_GrakonsWarehouse.Q10737_GrakonsWarehouse; import quests.Q10738_AnInnerBeauty.Q10738_AnInnerBeauty; import quests.Q10739_SupplyAndDemand.Q10739_SupplyAndDemand; import quests.Q10740_NeverForget.Q10740_NeverForget; +import quests.Q10741_ADraughtForTheCold.Q10741_ADraughtForTheCold; +import quests.Q10742_AFurryFriend.Q10742_AFurryFriend; +import quests.Q10743_StrangeFungus.Q10743_StrangeFungus; +import quests.Q10744_StrongerThanSteel.Q10744_StrongerThanSteel; /** * @author NosBit @@ -332,6 +338,7 @@ public class QuestMasterHandler Q00019_GoToThePastureland.class, Q00020_BringUpWithLove.class, Q00021_HiddenTruth.class, + Q00023_LidiasHeart.class, Q00024_InhabitantsOfTheForestOfTheDead.class, Q00026_TiredOfWaiting.class, Q00027_ChestCaughtWithABaitOfWind.class, @@ -542,6 +549,7 @@ public class QuestMasterHandler Q00652_AnAgedExAdventurer.class, Q00653_WildMaiden.class, Q00654_JourneyToASettlement.class, + Q00655_AGrandPlanForTamingWildBeasts.class, Q00659_IdRatherBeCollectingFairyBreath.class, Q00660_AidingTheFloranVillage.class, Q00661_MakingTheHarvestGroundsSafe.class, @@ -610,7 +618,11 @@ public class QuestMasterHandler Q10737_GrakonsWarehouse.class, Q10738_AnInnerBeauty.class, Q10739_SupplyAndDemand.class, - Q10740_NeverForget.class + Q10740_NeverForget.class, + Q10741_ADraughtForTheCold.class, + Q10742_AFurryFriend.class, + Q10743_StrangeFungus.class, + Q10744_StrongerThanSteel.class }; public static void main(String[] args) diff --git a/trunk/dist/game/data/scripts/vehicles/BoatGiranTalking.java b/trunk/dist/game/data/scripts/vehicles/BoatGiranTalking.java deleted file mode 100644 index fb2934a15f..0000000000 --- a/trunk/dist/game/data/scripts/vehicles/BoatGiranTalking.java +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (C) 2004-2015 L2J DataPack - * - * This file is part of L2J DataPack. - * - * L2J DataPack is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * L2J DataPack is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package vehicles; - -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.instancemanager.BoatManager; -import com.l2jserver.gameserver.model.VehiclePathPoint; -import com.l2jserver.gameserver.model.actor.instance.L2BoatInstance; -import com.l2jserver.gameserver.network.SystemMessageId; -import com.l2jserver.gameserver.network.clientpackets.Say2; -import com.l2jserver.gameserver.network.serverpackets.CreatureSay; -import com.l2jserver.gameserver.network.serverpackets.PlaySound; - -/** - * @author DS - */ -public class BoatGiranTalking implements Runnable -{ - private static final Logger _log = Logger.getLogger(BoatGiranTalking.class.getName()); - - // Time: 868s - private static final VehiclePathPoint[] GIRAN_TO_TALKING = - { - new VehiclePathPoint(51914, 189023, -3610, 150, 800), - new VehiclePathPoint(60567, 189789, -3610, 150, 800), - new VehiclePathPoint(63732, 197457, -3610, 200, 800), - new VehiclePathPoint(63732, 219946, -3610, 250, 800), - new VehiclePathPoint(62008, 222240, -3610, 250, 1200), - new VehiclePathPoint(56115, 226791, -3610, 250, 1200), - new VehiclePathPoint(40384, 226432, -3610, 300, 800), - new VehiclePathPoint(37760, 226432, -3610, 300, 800), - new VehiclePathPoint(27153, 226791, -3610, 300, 800), - new VehiclePathPoint(12672, 227535, -3610, 300, 800), - new VehiclePathPoint(-1808, 228280, -3610, 300, 800), - new VehiclePathPoint(-22165, 230542, -3610, 300, 800), - new VehiclePathPoint(-42523, 235205, -3610, 300, 800), - new VehiclePathPoint(-68451, 259560, -3610, 250, 800), - new VehiclePathPoint(-70848, 261696, -3610, 200, 800), - new VehiclePathPoint(-83344, 261610, -3610, 200, 800), - new VehiclePathPoint(-88344, 261660, -3610, 180, 800), - new VehiclePathPoint(-92344, 261660, -3610, 180, 800), - new VehiclePathPoint(-94242, 261659, -3610, 150, 800) - }; - - private static final VehiclePathPoint[] TALKING_DOCK = - { - new VehiclePathPoint(-96622, 261660, -3610, 150, 800) - }; - - // Time: 1398s - private static final VehiclePathPoint[] TALKING_TO_GIRAN = - { - new VehiclePathPoint(-113925, 261660, -3610, 150, 800), - new VehiclePathPoint(-126107, 249116, -3610, 180, 800), - new VehiclePathPoint(-126107, 234499, -3610, 180, 800), - new VehiclePathPoint(-126107, 219882, -3610, 180, 800), - new VehiclePathPoint(-109414, 204914, -3610, 180, 800), - new VehiclePathPoint(-92807, 204914, -3610, 180, 800), - new VehiclePathPoint(-80425, 216450, -3610, 250, 800), - new VehiclePathPoint(-68043, 227987, -3610, 250, 800), - new VehiclePathPoint(-63744, 231168, -3610, 250, 800), - new VehiclePathPoint(-60844, 231369, -3610, 250, 1800), - new VehiclePathPoint(-44915, 231369, -3610, 200, 800), - new VehiclePathPoint(-28986, 231369, -3610, 200, 800), - new VehiclePathPoint(8233, 207624, -3610, 200, 800), - new VehiclePathPoint(21470, 201503, -3610, 180, 800), - new VehiclePathPoint(40058, 195383, -3610, 180, 800), - new VehiclePathPoint(43022, 193793, -3610, 150, 800), - new VehiclePathPoint(45986, 192203, -3610, 150, 800), - new VehiclePathPoint(48950, 190613, -3610, 150, 800) - }; - - private static final VehiclePathPoint GIRAN_DOCK = TALKING_TO_GIRAN[TALKING_TO_GIRAN.length - 1]; - - private final L2BoatInstance _boat; - private int _cycle = 0; - private int _shoutCount = 0; - - private final CreatureSay ARRIVED_AT_GIRAN; - private final CreatureSay ARRIVED_AT_GIRAN_2; - private final CreatureSay LEAVE_GIRAN5; - private final CreatureSay LEAVE_GIRAN1; - private final CreatureSay LEAVE_GIRAN0; - private final CreatureSay LEAVING_GIRAN; - private final CreatureSay ARRIVED_AT_TALKING; - private final CreatureSay ARRIVED_AT_TALKING_2; - private final CreatureSay LEAVE_TALKING5; - private final CreatureSay LEAVE_TALKING1; - private final CreatureSay LEAVE_TALKING0; - private final CreatureSay LEAVING_TALKING; - private final CreatureSay BUSY_TALKING; - - private final CreatureSay ARRIVAL_TALKING15; - private final CreatureSay ARRIVAL_TALKING10; - private final CreatureSay ARRIVAL_TALKING5; - private final CreatureSay ARRIVAL_TALKING1; - private final CreatureSay ARRIVAL_GIRAN20; - private final CreatureSay ARRIVAL_GIRAN15; - private final CreatureSay ARRIVAL_GIRAN10; - private final CreatureSay ARRIVAL_GIRAN5; - private final CreatureSay ARRIVAL_GIRAN1; - - private final PlaySound GIRAN_SOUND; - private final PlaySound TALKING_SOUND; - - public BoatGiranTalking(L2BoatInstance boat) - { - _boat = boat; - - ARRIVED_AT_GIRAN = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_HAS_ARRIVED_AT_GIRAN_HARBOR); - ARRIVED_AT_GIRAN_2 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_TALKING_ISLAND_HARBOR_AFTER_ANCHORING_FOR_TEN_MINUTES); - LEAVE_GIRAN5 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_TALKING_ISLAND_HARBOR_IN_FIVE_MINUTES); - LEAVE_GIRAN1 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_TALKING_ISLAND_HARBOR_IN_ONE_MINUTE); - LEAVE_GIRAN0 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_BE_LEAVING_SOON_FOR_TALKING_ISLAND_HARBOR); - LEAVING_GIRAN = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_IS_LEAVING_FOR_TALKING_ISLAND_HARBOR); - ARRIVED_AT_TALKING = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_HAS_ARRIVED_AT_TALKING_ISLAND_HARBOR); - ARRIVED_AT_TALKING_2 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_GIRAN_HARBOR_AFTER_ANCHORING_FOR_TEN_MINUTES); - LEAVE_TALKING5 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_GIRAN_HARBOR_IN_FIVE_MINUTES); - LEAVE_TALKING1 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_GIRAN_HARBOR_IN_ONE_MINUTE); - LEAVE_TALKING0 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_BE_LEAVING_SOON_FOR_GIRAN_HARBOR); - LEAVING_TALKING = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_IS_LEAVING_FOR_GIRAN_HARBOR); - BUSY_TALKING = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_GIRAN_HARBOR_TO_TALKING_ISLAND_HAS_BEEN_DELAYED); - - ARRIVAL_TALKING15 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_GIRAN_HARBOR_WILL_BE_ARRIVING_AT_TALKING_ISLAND_IN_APPROXIMATELY_15_MINUTES); - ARRIVAL_TALKING10 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_GIRAN_HARBOR_WILL_BE_ARRIVING_AT_TALKING_ISLAND_IN_APPROXIMATELY_10_MINUTES); - ARRIVAL_TALKING5 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_GIRAN_HARBOR_WILL_BE_ARRIVING_AT_TALKING_ISLAND_IN_APPROXIMATELY_5_MINUTES); - ARRIVAL_TALKING1 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_GIRAN_HARBOR_WILL_BE_ARRIVING_AT_TALKING_ISLAND_IN_APPROXIMATELY_1_MINUTE); - ARRIVAL_GIRAN20 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_TALKING_ISLAND_WILL_BE_ARRIVING_AT_GIRAN_HARBOR_IN_APPROXIMATELY_20_MINUTES); - ARRIVAL_GIRAN15 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_TALKING_ISLAND_WILL_BE_ARRIVING_AT_GIRAN_HARBOR_IN_APPROXIMATELY_15_MINUTES); - ARRIVAL_GIRAN10 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_TALKING_ISLAND_WILL_BE_ARRIVING_AT_GIRAN_HARBOR_IN_APPROXIMATELY_10_MINUTES); - ARRIVAL_GIRAN5 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_TALKING_ISLAND_WILL_BE_ARRIVING_AT_GIRAN_HARBOR_IN_APPROXIMATELY_5_MINUTES); - ARRIVAL_GIRAN1 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_TALKING_ISLAND_WILL_BE_ARRIVING_AT_GIRAN_HARBOR_IN_APPROXIMATELY_1_MINUTE); - - GIRAN_SOUND = new PlaySound(0, "itemsound.ship_arrival_departure", 1, _boat.getObjectId(), GIRAN_DOCK.getX(), GIRAN_DOCK.getY(), GIRAN_DOCK.getZ()); - TALKING_SOUND = new PlaySound(0, "itemsound.ship_arrival_departure", 1, _boat.getObjectId(), TALKING_DOCK[0].getX(), TALKING_DOCK[0].getY(), TALKING_DOCK[0].getZ()); - } - - @Override - public void run() - { - try - { - switch (_cycle) - { - case 0: - BoatManager.getInstance().broadcastPacket(GIRAN_DOCK, TALKING_DOCK[0], LEAVE_GIRAN5); - ThreadPoolManager.getInstance().scheduleGeneral(this, 240000); - break; - case 1: - BoatManager.getInstance().broadcastPacket(GIRAN_DOCK, TALKING_DOCK[0], LEAVE_GIRAN1); - ThreadPoolManager.getInstance().scheduleGeneral(this, 40000); - break; - case 2: - BoatManager.getInstance().broadcastPacket(GIRAN_DOCK, TALKING_DOCK[0], LEAVE_GIRAN0); - ThreadPoolManager.getInstance().scheduleGeneral(this, 20000); - break; - case 3: - BoatManager.getInstance().broadcastPackets(GIRAN_DOCK, TALKING_DOCK[0], LEAVING_GIRAN, ARRIVAL_TALKING15); - _boat.broadcastPacket(GIRAN_SOUND); - _boat.payForRide(3946, 1, 46763, 187041, -3451); - _boat.executePath(GIRAN_TO_TALKING); - ThreadPoolManager.getInstance().scheduleGeneral(this, 250000); - break; - case 4: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GIRAN_DOCK, ARRIVAL_TALKING10); - ThreadPoolManager.getInstance().scheduleGeneral(this, 300000); - break; - case 5: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GIRAN_DOCK, ARRIVAL_TALKING5); - ThreadPoolManager.getInstance().scheduleGeneral(this, 240000); - break; - case 6: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GIRAN_DOCK, ARRIVAL_TALKING1); - break; - case 7: - if (BoatManager.getInstance().dockBusy(BoatManager.TALKING_ISLAND)) - { - if (_shoutCount == 0) - { - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GIRAN_DOCK, BUSY_TALKING); - } - - _shoutCount++; - if (_shoutCount > 35) - { - _shoutCount = 0; - } - - ThreadPoolManager.getInstance().scheduleGeneral(this, 5000); - return; - } - _boat.executePath(TALKING_DOCK); - break; - case 8: - BoatManager.getInstance().dockShip(BoatManager.TALKING_ISLAND, true); - BoatManager.getInstance().broadcastPackets(TALKING_DOCK[0], GIRAN_DOCK, ARRIVED_AT_TALKING, ARRIVED_AT_TALKING_2); - _boat.broadcastPacket(TALKING_SOUND); - ThreadPoolManager.getInstance().scheduleGeneral(this, 300000); - break; - case 9: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GIRAN_DOCK, LEAVE_TALKING5); - ThreadPoolManager.getInstance().scheduleGeneral(this, 240000); - break; - case 10: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GIRAN_DOCK, LEAVE_TALKING1); - ThreadPoolManager.getInstance().scheduleGeneral(this, 40000); - break; - case 11: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GIRAN_DOCK, LEAVE_TALKING0); - ThreadPoolManager.getInstance().scheduleGeneral(this, 20000); - break; - case 12: - BoatManager.getInstance().dockShip(BoatManager.TALKING_ISLAND, false); - BoatManager.getInstance().broadcastPackets(TALKING_DOCK[0], GIRAN_DOCK, LEAVING_TALKING); - _boat.broadcastPacket(TALKING_SOUND); - _boat.payForRide(3945, 1, -96777, 258970, -3623); - _boat.executePath(TALKING_TO_GIRAN); - ThreadPoolManager.getInstance().scheduleGeneral(this, 200000); - break; - case 13: - BoatManager.getInstance().broadcastPacket(GIRAN_DOCK, TALKING_DOCK[0], ARRIVAL_GIRAN20); - ThreadPoolManager.getInstance().scheduleGeneral(this, 300000); - break; - case 14: - BoatManager.getInstance().broadcastPacket(GIRAN_DOCK, TALKING_DOCK[0], ARRIVAL_GIRAN15); - ThreadPoolManager.getInstance().scheduleGeneral(this, 300000); - break; - case 15: - BoatManager.getInstance().broadcastPacket(GIRAN_DOCK, TALKING_DOCK[0], ARRIVAL_GIRAN10); - ThreadPoolManager.getInstance().scheduleGeneral(this, 300000); - break; - case 16: - BoatManager.getInstance().broadcastPacket(GIRAN_DOCK, TALKING_DOCK[0], ARRIVAL_GIRAN5); - ThreadPoolManager.getInstance().scheduleGeneral(this, 240000); - break; - case 17: - BoatManager.getInstance().broadcastPacket(GIRAN_DOCK, TALKING_DOCK[0], ARRIVAL_GIRAN1); - break; - case 18: - BoatManager.getInstance().broadcastPackets(GIRAN_DOCK, TALKING_DOCK[0], ARRIVED_AT_GIRAN, ARRIVED_AT_GIRAN_2); - _boat.broadcastPacket(GIRAN_SOUND); - ThreadPoolManager.getInstance().scheduleGeneral(this, 300000); - break; - } - _shoutCount = 0; - _cycle++; - if (_cycle > 18) - { - _cycle = 0; - } - } - catch (Exception e) - { - _log.log(Level.WARNING, e.getMessage()); - } - } - - public static void main(String[] args) - { - final L2BoatInstance boat = BoatManager.getInstance().getNewBoat(2, 48950, 190613, -3610, 60800); - if (boat != null) - { - boat.registerEngine(new BoatGiranTalking(boat)); - boat.runEngine(180000); - } - } -} diff --git a/trunk/dist/game/data/scripts/vehicles/BoatTalkingGludin.java b/trunk/dist/game/data/scripts/vehicles/BoatTalkingGludin.java deleted file mode 100644 index 9a31f13360..0000000000 --- a/trunk/dist/game/data/scripts/vehicles/BoatTalkingGludin.java +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Copyright (C) 2004-2015 L2J DataPack - * - * This file is part of L2J DataPack. - * - * L2J DataPack is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * L2J DataPack is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package vehicles; - -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.instancemanager.BoatManager; -import com.l2jserver.gameserver.model.VehiclePathPoint; -import com.l2jserver.gameserver.model.actor.instance.L2BoatInstance; -import com.l2jserver.gameserver.network.SystemMessageId; -import com.l2jserver.gameserver.network.clientpackets.Say2; -import com.l2jserver.gameserver.network.serverpackets.CreatureSay; -import com.l2jserver.gameserver.network.serverpackets.PlaySound; - -/** - * @author DS - */ -public class BoatTalkingGludin implements Runnable -{ - private static final Logger _log = Logger.getLogger(BoatTalkingGludin.class.getName()); - - // Time: 919s - private static final VehiclePathPoint[] TALKING_TO_GLUDIN = - { - new VehiclePathPoint(-121385, 261660, -3610, 180, 800), - new VehiclePathPoint(-127694, 253312, -3610, 200, 800), - new VehiclePathPoint(-129274, 237060, -3610, 250, 800), - new VehiclePathPoint(-114688, 139040, -3610, 200, 800), - new VehiclePathPoint(-109663, 135704, -3610, 180, 800), - new VehiclePathPoint(-102151, 135704, -3610, 180, 800), - new VehiclePathPoint(-96686, 140595, -3610, 180, 800), - new VehiclePathPoint(-95686, 147718, -3610, 180, 800), - new VehiclePathPoint(-95686, 148718, -3610, 180, 800), - new VehiclePathPoint(-95686, 149718, -3610, 150, 800) - }; - - private static final VehiclePathPoint[] GLUDIN_DOCK = - { - new VehiclePathPoint(-95686, 150514, -3610, 150, 800) - }; - - // Time: 780s - private static final VehiclePathPoint[] GLUDIN_TO_TALKING = - { - new VehiclePathPoint(-95686, 155514, -3610, 180, 800), - new VehiclePathPoint(-95686, 185514, -3610, 250, 800), - new VehiclePathPoint(-60136, 238816, -3610, 200, 800), - new VehiclePathPoint(-60520, 259609, -3610, 180, 1800), - new VehiclePathPoint(-65344, 261460, -3610, 180, 1800), - new VehiclePathPoint(-83344, 261560, -3610, 180, 1800), - new VehiclePathPoint(-88344, 261660, -3610, 180, 1800), - new VehiclePathPoint(-92344, 261660, -3610, 150, 1800), - new VehiclePathPoint(-94242, 261659, -3610, 150, 1800) - }; - - private static final VehiclePathPoint[] TALKING_DOCK = - { - new VehiclePathPoint(-96622, 261660, -3610, 150, 1800) - }; - - private final L2BoatInstance _boat; - private int _cycle = 0; - private int _shoutCount = 0; - - private final CreatureSay ARRIVED_AT_TALKING; - private final CreatureSay ARRIVED_AT_TALKING_2; - private final CreatureSay LEAVE_TALKING5; - private final CreatureSay LEAVE_TALKING1; - private final CreatureSay LEAVE_TALKING1_2; - private final CreatureSay LEAVE_TALKING0; - private final CreatureSay LEAVING_TALKING; - private final CreatureSay ARRIVED_AT_GLUDIN; - private final CreatureSay ARRIVED_AT_GLUDIN_2; - private final CreatureSay LEAVE_GLUDIN5; - private final CreatureSay LEAVE_GLUDIN1; - private final CreatureSay LEAVE_GLUDIN0; - private final CreatureSay LEAVING_GLUDIN; - private final CreatureSay BUSY_TALKING; - private final CreatureSay BUSY_GLUDIN; - - private final CreatureSay ARRIVAL_GLUDIN10; - private final CreatureSay ARRIVAL_GLUDIN5; - private final CreatureSay ARRIVAL_GLUDIN1; - private final CreatureSay ARRIVAL_TALKING10; - private final CreatureSay ARRIVAL_TALKING5; - private final CreatureSay ARRIVAL_TALKING1; - - private final PlaySound TALKING_SOUND; - private final PlaySound GLUDIN_SOUND; - - public BoatTalkingGludin(L2BoatInstance boat) - { - _boat = boat; - _cycle = 0; - - ARRIVED_AT_TALKING = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_HAS_ARRIVED_AT_TALKING_ISLAND_HARBOR); - ARRIVED_AT_TALKING_2 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_GLUDIN_HARBOR_AFTER_ANCHORING_FOR_TEN_MINUTES); - LEAVE_TALKING5 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_GLUDIN_HARBOR_IN_FIVE_MINUTES); - LEAVE_TALKING1 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_GLUDIN_HARBOR_IN_ONE_MINUTE); - LEAVE_TALKING1_2 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THOSE_WISHING_TO_RIDE_THE_FERRY_SHOULD_MAKE_HASTE_TO_GET_ON); - LEAVE_TALKING0 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_BE_LEAVING_SOON_FOR_GLUDIN_HARBOR); - LEAVING_TALKING = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_IS_LEAVING_FOR_GLUDIN_HARBOR); - ARRIVED_AT_GLUDIN = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_HAS_ARRIVED_AT_GLUDIN_HARBOR); - ARRIVED_AT_GLUDIN_2 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_TALKING_ISLAND_HARBOR_AFTER_ANCHORING_FOR_TEN_MINUTES); - LEAVE_GLUDIN5 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_TALKING_ISLAND_HARBOR_IN_FIVE_MINUTES); - LEAVE_GLUDIN1 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_LEAVE_FOR_TALKING_ISLAND_HARBOR_IN_ONE_MINUTE); - LEAVE_GLUDIN0 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_WILL_BE_LEAVING_SOON_FOR_TALKING_ISLAND_HARBOR); - LEAVING_GLUDIN = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_IS_LEAVING_FOR_TALKING_ISLAND_HARBOR); - BUSY_TALKING = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_GLUDIN_HARBOR_TO_TALKING_ISLAND_HAS_BEEN_DELAYED); - BUSY_GLUDIN = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_TALKING_ISLAND_TO_GLUDIN_HARBOR_HAS_BEEN_DELAYED); - - ARRIVAL_GLUDIN10 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_TALKING_ISLAND_WILL_ARRIVE_AT_GLUDIN_HARBOR_IN_APPROXIMATELY_10_MINUTES); - ARRIVAL_GLUDIN5 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_TALKING_ISLAND_WILL_BE_ARRIVING_AT_GLUDIN_HARBOR_IN_APPROXIMATELY_5_MINUTES); - ARRIVAL_GLUDIN1 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_TALKING_ISLAND_WILL_BE_ARRIVING_AT_GLUDIN_HARBOR_IN_APPROXIMATELY_1_MINUTE); - ARRIVAL_TALKING10 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_GLUDIN_HARBOR_WILL_BE_ARRIVING_AT_TALKING_ISLAND_IN_APPROXIMATELY_10_MINUTES); - ARRIVAL_TALKING5 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_GLUDIN_HARBOR_WILL_BE_ARRIVING_AT_TALKING_ISLAND_IN_APPROXIMATELY_5_MINUTES); - ARRIVAL_TALKING1 = new CreatureSay(0, Say2.BOAT, 801, SystemMessageId.THE_FERRY_FROM_GLUDIN_HARBOR_WILL_BE_ARRIVING_AT_TALKING_ISLAND_IN_APPROXIMATELY_1_MINUTE); - - TALKING_SOUND = new PlaySound(0, "itemsound.ship_arrival_departure", 1, _boat.getObjectId(), TALKING_DOCK[0].getX(), TALKING_DOCK[0].getY(), TALKING_DOCK[0].getZ()); - GLUDIN_SOUND = new PlaySound(0, "itemsound.ship_arrival_departure", 1, _boat.getObjectId(), GLUDIN_DOCK[0].getX(), GLUDIN_DOCK[0].getY(), GLUDIN_DOCK[0].getZ()); - } - - @Override - public void run() - { - try - { - switch (_cycle) - { - case 0: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GLUDIN_DOCK[0], LEAVE_TALKING5); - ThreadPoolManager.getInstance().scheduleGeneral(this, 240000); - break; - case 1: - BoatManager.getInstance().broadcastPackets(TALKING_DOCK[0], GLUDIN_DOCK[0], LEAVE_TALKING1, LEAVE_TALKING1_2); - ThreadPoolManager.getInstance().scheduleGeneral(this, 40000); - break; - case 2: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GLUDIN_DOCK[0], LEAVE_TALKING0); - ThreadPoolManager.getInstance().scheduleGeneral(this, 20000); - break; - case 3: - BoatManager.getInstance().dockShip(BoatManager.TALKING_ISLAND, false); - BoatManager.getInstance().broadcastPackets(TALKING_DOCK[0], GLUDIN_DOCK[0], LEAVING_TALKING); - _boat.broadcastPacket(TALKING_SOUND); - _boat.payForRide(1074, 1, -96777, 258970, -3623); - _boat.executePath(TALKING_TO_GLUDIN); - ThreadPoolManager.getInstance().scheduleGeneral(this, 300000); - break; - case 4: - BoatManager.getInstance().broadcastPacket(GLUDIN_DOCK[0], TALKING_DOCK[0], ARRIVAL_GLUDIN10); - ThreadPoolManager.getInstance().scheduleGeneral(this, 300000); - break; - case 5: - BoatManager.getInstance().broadcastPacket(GLUDIN_DOCK[0], TALKING_DOCK[0], ARRIVAL_GLUDIN5); - ThreadPoolManager.getInstance().scheduleGeneral(this, 240000); - break; - case 6: - BoatManager.getInstance().broadcastPacket(GLUDIN_DOCK[0], TALKING_DOCK[0], ARRIVAL_GLUDIN1); - break; - case 7: - if (BoatManager.getInstance().dockBusy(BoatManager.GLUDIN_HARBOR)) - { - if (_shoutCount == 0) - { - BoatManager.getInstance().broadcastPacket(GLUDIN_DOCK[0], TALKING_DOCK[0], BUSY_GLUDIN); - } - - _shoutCount++; - if (_shoutCount > 35) - { - _shoutCount = 0; - } - - ThreadPoolManager.getInstance().scheduleGeneral(this, 5000); - return; - } - _boat.executePath(GLUDIN_DOCK); - break; - case 8: - BoatManager.getInstance().dockShip(BoatManager.GLUDIN_HARBOR, true); - BoatManager.getInstance().broadcastPackets(GLUDIN_DOCK[0], TALKING_DOCK[0], ARRIVED_AT_GLUDIN, ARRIVED_AT_GLUDIN_2); - _boat.broadcastPacket(GLUDIN_SOUND); - ThreadPoolManager.getInstance().scheduleGeneral(this, 300000); - break; - case 9: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GLUDIN_DOCK[0], LEAVE_GLUDIN5); - ThreadPoolManager.getInstance().scheduleGeneral(this, 240000); - break; - case 10: - BoatManager.getInstance().broadcastPackets(TALKING_DOCK[0], GLUDIN_DOCK[0], LEAVE_GLUDIN1, LEAVE_TALKING1_2); - ThreadPoolManager.getInstance().scheduleGeneral(this, 40000); - break; - case 11: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GLUDIN_DOCK[0], LEAVE_GLUDIN0); - ThreadPoolManager.getInstance().scheduleGeneral(this, 20000); - break; - case 12: - BoatManager.getInstance().dockShip(BoatManager.GLUDIN_HARBOR, false); - BoatManager.getInstance().broadcastPackets(TALKING_DOCK[0], GLUDIN_DOCK[0], LEAVING_GLUDIN); - _boat.broadcastPacket(GLUDIN_SOUND); - _boat.payForRide(1075, 1, -90015, 150422, -3610); - _boat.executePath(GLUDIN_TO_TALKING); - ThreadPoolManager.getInstance().scheduleGeneral(this, 150000); - break; - case 13: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GLUDIN_DOCK[0], ARRIVAL_TALKING10); - ThreadPoolManager.getInstance().scheduleGeneral(this, 300000); - break; - case 14: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GLUDIN_DOCK[0], ARRIVAL_TALKING5); - ThreadPoolManager.getInstance().scheduleGeneral(this, 240000); - break; - case 15: - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GLUDIN_DOCK[0], ARRIVAL_TALKING1); - break; - case 16: - if (BoatManager.getInstance().dockBusy(BoatManager.TALKING_ISLAND)) - { - if (_shoutCount == 0) - { - BoatManager.getInstance().broadcastPacket(TALKING_DOCK[0], GLUDIN_DOCK[0], BUSY_TALKING); - } - - _shoutCount++; - if (_shoutCount > 35) - { - _shoutCount = 0; - } - - ThreadPoolManager.getInstance().scheduleGeneral(this, 5000); - return; - } - _boat.executePath(TALKING_DOCK); - break; - case 17: - BoatManager.getInstance().dockShip(BoatManager.TALKING_ISLAND, true); - BoatManager.getInstance().broadcastPackets(TALKING_DOCK[0], GLUDIN_DOCK[0], ARRIVED_AT_TALKING, ARRIVED_AT_TALKING_2); - _boat.broadcastPacket(TALKING_SOUND); - ThreadPoolManager.getInstance().scheduleGeneral(this, 300000); - break; - } - _shoutCount = 0; - _cycle++; - if (_cycle > 17) - { - _cycle = 0; - } - } - catch (Exception e) - { - _log.log(Level.WARNING, e.getMessage()); - } - } - - public static void main(String[] args) - { - final L2BoatInstance boat = BoatManager.getInstance().getNewBoat(1, -96622, 261660, -3610, 32768); - if (boat != null) - { - boat.registerEngine(new BoatTalkingGludin(boat)); - boat.runEngine(180000); - BoatManager.getInstance().dockShip(BoatManager.TALKING_ISLAND, true); - } - } -} diff --git a/trunk/dist/game/data/scripts/village_master/ProofOfCourage/ProofOfCourage.java b/trunk/dist/game/data/scripts/village_master/ProofOfCourage/ProofOfCourage.java index 000b11d87c..44f44dff1f 100644 --- a/trunk/dist/game/data/scripts/village_master/ProofOfCourage/ProofOfCourage.java +++ b/trunk/dist/game/data/scripts/village_master/ProofOfCourage/ProofOfCourage.java @@ -25,7 +25,7 @@ import java.util.Map; import ai.npc.AbstractNpcAI; -import com.l2jserver.gameserver.datatables.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.base.ClassId; diff --git a/trunk/dist/game/data/scripts/village_master/ProofOfJustice/ProofOfJustice.java b/trunk/dist/game/data/scripts/village_master/ProofOfJustice/ProofOfJustice.java index 6e0614e42a..3059cbb81e 100644 --- a/trunk/dist/game/data/scripts/village_master/ProofOfJustice/ProofOfJustice.java +++ b/trunk/dist/game/data/scripts/village_master/ProofOfJustice/ProofOfJustice.java @@ -25,7 +25,7 @@ import java.util.Map; import ai.npc.AbstractNpcAI; -import com.l2jserver.gameserver.datatables.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.base.ClassId; diff --git a/trunk/dist/game/data/skillTrees/AbyssWalker.xml b/trunk/dist/game/data/skillTrees/AbyssWalker.xml index 142eb7852a..485d57f13d 100644 --- a/trunk/dist/game/data/skillTrees/AbyssWalker.xml +++ b/trunk/dist/game/data/skillTrees/AbyssWalker.xml @@ -1,10 +1,10 @@ - - - - + + + + @@ -420,6 +420,6 @@ - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Adventurer.xml b/trunk/dist/game/data/skillTrees/Adventurer.xml index a8584a869e..82bbdc2c4c 100644 --- a/trunk/dist/game/data/skillTrees/Adventurer.xml +++ b/trunk/dist/game/data/skillTrees/Adventurer.xml @@ -18,17 +18,17 @@ - - - - - - - + + + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/AeoreCardinal.xml b/trunk/dist/game/data/skillTrees/AeoreCardinal.xml index 6e693d94e8..390f86046b 100644 --- a/trunk/dist/game/data/skillTrees/AeoreCardinal.xml +++ b/trunk/dist/game/data/skillTrees/AeoreCardinal.xml @@ -2,6 +2,7 @@ + @@ -309,5 +310,16 @@ + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/AeoreEva'sSaint.xml b/trunk/dist/game/data/skillTrees/AeoreEva'sSaint.xml index 3bb4b83adf..bdab6d11ba 100644 --- a/trunk/dist/game/data/skillTrees/AeoreEva'sSaint.xml +++ b/trunk/dist/game/data/skillTrees/AeoreEva'sSaint.xml @@ -2,6 +2,7 @@ + @@ -309,5 +310,16 @@ + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/AeoreShillienSaint.xml b/trunk/dist/game/data/skillTrees/AeoreShillienSaint.xml index 81a987ce95..c76a384b66 100644 --- a/trunk/dist/game/data/skillTrees/AeoreShillienSaint.xml +++ b/trunk/dist/game/data/skillTrees/AeoreShillienSaint.xml @@ -2,6 +2,7 @@ + @@ -310,5 +311,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/Arbalester.xml b/trunk/dist/game/data/skillTrees/Arbalester.xml index 5fd9e072f5..9fc652a503 100644 --- a/trunk/dist/game/data/skillTrees/Arbalester.xml +++ b/trunk/dist/game/data/skillTrees/Arbalester.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/ArcanaLord.xml b/trunk/dist/game/data/skillTrees/ArcanaLord.xml index 1b5e722144..0ff36ddeb5 100644 --- a/trunk/dist/game/data/skillTrees/ArcanaLord.xml +++ b/trunk/dist/game/data/skillTrees/ArcanaLord.xml @@ -23,18 +23,18 @@ - - - - + + + + - - - + + + - + diff --git a/trunk/dist/game/data/skillTrees/Archmage.xml b/trunk/dist/game/data/skillTrees/Archmage.xml index 2011d33639..d47b11481a 100644 --- a/trunk/dist/game/data/skillTrees/Archmage.xml +++ b/trunk/dist/game/data/skillTrees/Archmage.xml @@ -16,15 +16,15 @@ - - - - + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/Berserker.xml b/trunk/dist/game/data/skillTrees/Berserker.xml index 49f49ec0e7..b804983500 100644 --- a/trunk/dist/game/data/skillTrees/Berserker.xml +++ b/trunk/dist/game/data/skillTrees/Berserker.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/Bishop.xml b/trunk/dist/game/data/skillTrees/Bishop.xml index 43d31319f8..a15a1da20c 100644 --- a/trunk/dist/game/data/skillTrees/Bishop.xml +++ b/trunk/dist/game/data/skillTrees/Bishop.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/Bladedancer.xml b/trunk/dist/game/data/skillTrees/Bladedancer.xml index eb693bb7bd..5bc5b03cb1 100644 --- a/trunk/dist/game/data/skillTrees/Bladedancer.xml +++ b/trunk/dist/game/data/skillTrees/Bladedancer.xml @@ -2,10 +2,10 @@ - - - - + + + + @@ -44,6 +44,7 @@ + @@ -103,6 +104,7 @@ + @@ -126,6 +128,7 @@ + @@ -148,6 +151,7 @@ + @@ -164,6 +168,7 @@ + diff --git a/trunk/dist/game/data/skillTrees/BountyHunter.xml b/trunk/dist/game/data/skillTrees/BountyHunter.xml index 2b84df510d..a66d6f7ad1 100644 --- a/trunk/dist/game/data/skillTrees/BountyHunter.xml +++ b/trunk/dist/game/data/skillTrees/BountyHunter.xml @@ -113,10 +113,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/Cardinal.xml b/trunk/dist/game/data/skillTrees/Cardinal.xml index ce6cce4db1..09a086ef16 100644 --- a/trunk/dist/game/data/skillTrees/Cardinal.xml +++ b/trunk/dist/game/data/skillTrees/Cardinal.xml @@ -21,14 +21,14 @@ - - - - + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/CloudBreaker.xml b/trunk/dist/game/data/skillTrees/CloudBreaker.xml index 8e00574874..dd211139a2 100644 --- a/trunk/dist/game/data/skillTrees/CloudBreaker.xml +++ b/trunk/dist/game/data/skillTrees/CloudBreaker.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/DarkAvenger.xml b/trunk/dist/game/data/skillTrees/DarkAvenger.xml index d562dd1ff2..0f4fb474a6 100644 --- a/trunk/dist/game/data/skillTrees/DarkAvenger.xml +++ b/trunk/dist/game/data/skillTrees/DarkAvenger.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/DarkFighter.xml b/trunk/dist/game/data/skillTrees/DarkFighter.xml index eeb8a801db..8526ddf52c 100644 --- a/trunk/dist/game/data/skillTrees/DarkFighter.xml +++ b/trunk/dist/game/data/skillTrees/DarkFighter.xml @@ -9,6 +9,9 @@ + + + @@ -63,7 +66,7 @@ - - + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/DarkMystic.xml b/trunk/dist/game/data/skillTrees/DarkMystic.xml index f79a2aaf4c..0ca167e906 100644 --- a/trunk/dist/game/data/skillTrees/DarkMystic.xml +++ b/trunk/dist/game/data/skillTrees/DarkMystic.xml @@ -12,6 +12,9 @@ + + + @@ -65,7 +68,7 @@ - - + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Destroyer.xml b/trunk/dist/game/data/skillTrees/Destroyer.xml index fd4fd807ad..5c66ccd61d 100644 --- a/trunk/dist/game/data/skillTrees/Destroyer.xml +++ b/trunk/dist/game/data/skillTrees/Destroyer.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/Dominator.xml b/trunk/dist/game/data/skillTrees/Dominator.xml index 3a753408e0..2d5559d50e 100644 --- a/trunk/dist/game/data/skillTrees/Dominator.xml +++ b/trunk/dist/game/data/skillTrees/Dominator.xml @@ -21,16 +21,16 @@ - - - - + + + + - - - + + + - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Doombringer.xml b/trunk/dist/game/data/skillTrees/Doombringer.xml index 7dbee80765..fd568b217a 100644 --- a/trunk/dist/game/data/skillTrees/Doombringer.xml +++ b/trunk/dist/game/data/skillTrees/Doombringer.xml @@ -14,15 +14,15 @@ - - - - + + + + - - - + + + - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Doomcryer.xml b/trunk/dist/game/data/skillTrees/Doomcryer.xml index 8d86a4e718..2e8a073511 100644 --- a/trunk/dist/game/data/skillTrees/Doomcryer.xml +++ b/trunk/dist/game/data/skillTrees/Doomcryer.xml @@ -17,14 +17,14 @@ - - - + + + - - - + + + - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Dreadnought.xml b/trunk/dist/game/data/skillTrees/Dreadnought.xml index d657743602..cfff6883e5 100644 --- a/trunk/dist/game/data/skillTrees/Dreadnought.xml +++ b/trunk/dist/game/data/skillTrees/Dreadnought.xml @@ -17,15 +17,15 @@ - - - - - + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/Duelist.xml b/trunk/dist/game/data/skillTrees/Duelist.xml index 9449d92e91..02207cb09f 100644 --- a/trunk/dist/game/data/skillTrees/Duelist.xml +++ b/trunk/dist/game/data/skillTrees/Duelist.xml @@ -20,16 +20,16 @@ - - - - + + + + - - - + + + - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/DwarvenFighter.xml b/trunk/dist/game/data/skillTrees/DwarvenFighter.xml index 3faf540310..0661bd9542 100644 --- a/trunk/dist/game/data/skillTrees/DwarvenFighter.xml +++ b/trunk/dist/game/data/skillTrees/DwarvenFighter.xml @@ -9,6 +9,9 @@ + + + @@ -36,7 +39,7 @@ - - + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/ElementalMaster.xml b/trunk/dist/game/data/skillTrees/ElementalMaster.xml index 4372f90208..aa1b701bbe 100644 --- a/trunk/dist/game/data/skillTrees/ElementalMaster.xml +++ b/trunk/dist/game/data/skillTrees/ElementalMaster.xml @@ -22,18 +22,18 @@ - - - - + + + + - - - + + + - + diff --git a/trunk/dist/game/data/skillTrees/ElemntalSummoner.xml b/trunk/dist/game/data/skillTrees/ElemntalSummoner.xml index e810eb9a58..5acfaeac38 100644 --- a/trunk/dist/game/data/skillTrees/ElemntalSummoner.xml +++ b/trunk/dist/game/data/skillTrees/ElemntalSummoner.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/ElvenElder.xml b/trunk/dist/game/data/skillTrees/ElvenElder.xml index 663dcaf9e3..c2c13db04c 100644 --- a/trunk/dist/game/data/skillTrees/ElvenElder.xml +++ b/trunk/dist/game/data/skillTrees/ElvenElder.xml @@ -1,10 +1,10 @@ - - - - + + + + @@ -137,8 +137,8 @@ - - + + diff --git a/trunk/dist/game/data/skillTrees/ElvenFighter.xml b/trunk/dist/game/data/skillTrees/ElvenFighter.xml index ef24b10e4e..bfa4ade336 100644 --- a/trunk/dist/game/data/skillTrees/ElvenFighter.xml +++ b/trunk/dist/game/data/skillTrees/ElvenFighter.xml @@ -9,6 +9,9 @@ + + + @@ -61,7 +64,7 @@ - - + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/ElvenMystic.xml b/trunk/dist/game/data/skillTrees/ElvenMystic.xml index 20e0440fbb..c01b104a60 100644 --- a/trunk/dist/game/data/skillTrees/ElvenMystic.xml +++ b/trunk/dist/game/data/skillTrees/ElvenMystic.xml @@ -12,6 +12,9 @@ + + + @@ -62,7 +65,7 @@ - - + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/EvaSaint.xml b/trunk/dist/game/data/skillTrees/EvaSaint.xml index 08bd9249f1..988c08450b 100644 --- a/trunk/dist/game/data/skillTrees/EvaSaint.xml +++ b/trunk/dist/game/data/skillTrees/EvaSaint.xml @@ -20,14 +20,14 @@ - - - - + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/EvaTemplar.xml b/trunk/dist/game/data/skillTrees/EvaTemplar.xml index b2ff6db26d..c9fcadbc0f 100644 --- a/trunk/dist/game/data/skillTrees/EvaTemplar.xml +++ b/trunk/dist/game/data/skillTrees/EvaTemplar.xml @@ -23,18 +23,18 @@ - - - - - - - + + + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/Eviscerator.xml b/trunk/dist/game/data/skillTrees/Eviscerator.xml index 88cacd623c..02fe8e7f3a 100644 --- a/trunk/dist/game/data/skillTrees/Eviscerator.xml +++ b/trunk/dist/game/data/skillTrees/Eviscerator.xml @@ -36,7 +36,7 @@ - + @@ -61,5 +61,13 @@ + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/FemaleSoulBreaker.xml b/trunk/dist/game/data/skillTrees/FemaleSoulBreaker.xml index 7ea7eea2b8..10833b6be4 100644 --- a/trunk/dist/game/data/skillTrees/FemaleSoulBreaker.xml +++ b/trunk/dist/game/data/skillTrees/FemaleSoulBreaker.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/FemaleSoulHound.xml b/trunk/dist/game/data/skillTrees/FemaleSoulHound.xml index 141b8617f8..4d5c334f97 100644 --- a/trunk/dist/game/data/skillTrees/FemaleSoulHound.xml +++ b/trunk/dist/game/data/skillTrees/FemaleSoulHound.xml @@ -17,17 +17,17 @@ - - - - - - + + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/FemalerSoldier.xml b/trunk/dist/game/data/skillTrees/FemalerSoldier.xml index 683b309ba6..fa7dd13cc4 100644 --- a/trunk/dist/game/data/skillTrees/FemalerSoldier.xml +++ b/trunk/dist/game/data/skillTrees/FemalerSoldier.xml @@ -9,6 +9,9 @@ + + + @@ -58,8 +61,8 @@ - - - + + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/FeohArchmage.xml b/trunk/dist/game/data/skillTrees/FeohArchmage.xml index cf8c453406..bc797af0db 100644 --- a/trunk/dist/game/data/skillTrees/FeohArchmage.xml +++ b/trunk/dist/game/data/skillTrees/FeohArchmage.xml @@ -2,6 +2,7 @@ + @@ -100,10 +101,10 @@ - - - - + + + + @@ -316,5 +317,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/FeohMysticMuse.xml b/trunk/dist/game/data/skillTrees/FeohMysticMuse.xml index b5dfa7d970..e4c27825fe 100644 --- a/trunk/dist/game/data/skillTrees/FeohMysticMuse.xml +++ b/trunk/dist/game/data/skillTrees/FeohMysticMuse.xml @@ -2,6 +2,7 @@ + @@ -101,10 +102,10 @@ - - - - + + + + @@ -320,5 +321,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/FeohSoulhound.xml b/trunk/dist/game/data/skillTrees/FeohSoulhound.xml index 93273a17aa..f73eb49c84 100644 --- a/trunk/dist/game/data/skillTrees/FeohSoulhound.xml +++ b/trunk/dist/game/data/skillTrees/FeohSoulhound.xml @@ -2,6 +2,7 @@ + @@ -320,5 +321,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/FeohSoultaker.xml b/trunk/dist/game/data/skillTrees/FeohSoultaker.xml index 481a251f95..031915f9b1 100644 --- a/trunk/dist/game/data/skillTrees/FeohSoultaker.xml +++ b/trunk/dist/game/data/skillTrees/FeohSoultaker.xml @@ -2,9 +2,9 @@ + - @@ -104,10 +104,10 @@ - - - - + + + + @@ -146,7 +146,6 @@ - @@ -329,5 +328,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/FeohStormScreamer.xml b/trunk/dist/game/data/skillTrees/FeohStormScreamer.xml index 5c4f698171..819c268467 100644 --- a/trunk/dist/game/data/skillTrees/FeohStormScreamer.xml +++ b/trunk/dist/game/data/skillTrees/FeohStormScreamer.xml @@ -2,6 +2,7 @@ + @@ -86,7 +87,6 @@ - @@ -100,10 +100,10 @@ - - - - + + + + @@ -317,5 +317,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/FortuneSeeker.xml b/trunk/dist/game/data/skillTrees/FortuneSeeker.xml index ccbc91be0a..47e44bf856 100644 --- a/trunk/dist/game/data/skillTrees/FortuneSeeker.xml +++ b/trunk/dist/game/data/skillTrees/FortuneSeeker.xml @@ -23,20 +23,20 @@ - - - - - - + + + + + + - - - + + + - + diff --git a/trunk/dist/game/data/skillTrees/GhostHunter.xml b/trunk/dist/game/data/skillTrees/GhostHunter.xml index 97e765128c..31890b264f 100644 --- a/trunk/dist/game/data/skillTrees/GhostHunter.xml +++ b/trunk/dist/game/data/skillTrees/GhostHunter.xml @@ -18,17 +18,17 @@ - - - - - - - + + + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/GhostSentinel.xml b/trunk/dist/game/data/skillTrees/GhostSentinel.xml index 75bec87a27..e53e637139 100644 --- a/trunk/dist/game/data/skillTrees/GhostSentinel.xml +++ b/trunk/dist/game/data/skillTrees/GhostSentinel.xml @@ -16,15 +16,15 @@ - - - - - + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/Gladiator.xml b/trunk/dist/game/data/skillTrees/Gladiator.xml index d9df80d856..5450b1fa22 100644 --- a/trunk/dist/game/data/skillTrees/Gladiator.xml +++ b/trunk/dist/game/data/skillTrees/Gladiator.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/GrandKhavatari.xml b/trunk/dist/game/data/skillTrees/GrandKhavatari.xml index 224e3085da..4a78df752c 100644 --- a/trunk/dist/game/data/skillTrees/GrandKhavatari.xml +++ b/trunk/dist/game/data/skillTrees/GrandKhavatari.xml @@ -18,17 +18,17 @@ - - - - - + + + + + - - - + + + - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Hawkeye.xml b/trunk/dist/game/data/skillTrees/Hawkeye.xml index 6f705677b0..0676d5be1c 100644 --- a/trunk/dist/game/data/skillTrees/Hawkeye.xml +++ b/trunk/dist/game/data/skillTrees/Hawkeye.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/HellKnight.xml b/trunk/dist/game/data/skillTrees/HellKnight.xml index ffc07cddd2..e0d328bb08 100644 --- a/trunk/dist/game/data/skillTrees/HellKnight.xml +++ b/trunk/dist/game/data/skillTrees/HellKnight.xml @@ -23,19 +23,19 @@ - - - - - - - - + + + + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/Hierophant.xml b/trunk/dist/game/data/skillTrees/Hierophant.xml index a0bd29c693..50c22fcb3a 100644 --- a/trunk/dist/game/data/skillTrees/Hierophant.xml +++ b/trunk/dist/game/data/skillTrees/Hierophant.xml @@ -19,14 +19,14 @@ - - - + + + - - - + + + - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/HumanFighter.xml b/trunk/dist/game/data/skillTrees/HumanFighter.xml index 5c58bf5084..bb60ea2c71 100644 --- a/trunk/dist/game/data/skillTrees/HumanFighter.xml +++ b/trunk/dist/game/data/skillTrees/HumanFighter.xml @@ -9,6 +9,9 @@ + + + @@ -59,7 +62,7 @@ - - + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/HumanMystic.xml b/trunk/dist/game/data/skillTrees/HumanMystic.xml index cc8fb4a7cc..48cd67f13a 100644 --- a/trunk/dist/game/data/skillTrees/HumanMystic.xml +++ b/trunk/dist/game/data/skillTrees/HumanMystic.xml @@ -9,6 +9,9 @@ + + + @@ -64,7 +67,7 @@ - - + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Inspector.xml b/trunk/dist/game/data/skillTrees/Inspector.xml index 46d2b00655..26cdea5f1f 100644 --- a/trunk/dist/game/data/skillTrees/Inspector.xml +++ b/trunk/dist/game/data/skillTrees/Inspector.xml @@ -2,10 +2,10 @@ - - - - + + + + @@ -304,8 +304,8 @@ - - - + + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/IssDominator.xml b/trunk/dist/game/data/skillTrees/IssDominator.xml index 807239c418..c6e85fdbed 100644 --- a/trunk/dist/game/data/skillTrees/IssDominator.xml +++ b/trunk/dist/game/data/skillTrees/IssDominator.xml @@ -352,5 +352,19 @@ + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/IssDoomcryer.xml b/trunk/dist/game/data/skillTrees/IssDoomcryer.xml index 0fdd96130c..5195c1cb40 100644 --- a/trunk/dist/game/data/skillTrees/IssDoomcryer.xml +++ b/trunk/dist/game/data/skillTrees/IssDoomcryer.xml @@ -401,5 +401,19 @@ + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/IssHierophant.xml b/trunk/dist/game/data/skillTrees/IssHierophant.xml index 0686110d61..3504b46884 100644 --- a/trunk/dist/game/data/skillTrees/IssHierophant.xml +++ b/trunk/dist/game/data/skillTrees/IssHierophant.xml @@ -263,5 +263,19 @@ + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/IssSpectralDancer.xml b/trunk/dist/game/data/skillTrees/IssSpectralDancer.xml index b4680b4f3c..623bbd2f7f 100644 --- a/trunk/dist/game/data/skillTrees/IssSpectralDancer.xml +++ b/trunk/dist/game/data/skillTrees/IssSpectralDancer.xml @@ -410,5 +410,19 @@ + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/IssSwordMuse.xml b/trunk/dist/game/data/skillTrees/IssSwordMuse.xml index 53c996a2df..275955ce26 100644 --- a/trunk/dist/game/data/skillTrees/IssSwordMuse.xml +++ b/trunk/dist/game/data/skillTrees/IssSwordMuse.xml @@ -409,5 +409,19 @@ + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Judicator.xml b/trunk/dist/game/data/skillTrees/Judicator.xml index e095d94edf..11613ba6ae 100644 --- a/trunk/dist/game/data/skillTrees/Judicator.xml +++ b/trunk/dist/game/data/skillTrees/Judicator.xml @@ -12,8 +12,8 @@ - - - + + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/KamaelMaleSoldier.xml b/trunk/dist/game/data/skillTrees/KamaelMaleSoldier.xml index 5719340358..47cc47c0bf 100644 --- a/trunk/dist/game/data/skillTrees/KamaelMaleSoldier.xml +++ b/trunk/dist/game/data/skillTrees/KamaelMaleSoldier.xml @@ -9,6 +9,9 @@ + + + @@ -56,8 +59,8 @@ - - - + + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Maestro.xml b/trunk/dist/game/data/skillTrees/Maestro.xml index 599145cf0d..0dcec9c3d0 100644 --- a/trunk/dist/game/data/skillTrees/Maestro.xml +++ b/trunk/dist/game/data/skillTrees/Maestro.xml @@ -15,16 +15,16 @@ - - - - - + + + + + - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/MaleSoulBreaker.xml b/trunk/dist/game/data/skillTrees/MaleSoulBreaker.xml index 22869d979a..3074be3843 100644 --- a/trunk/dist/game/data/skillTrees/MaleSoulBreaker.xml +++ b/trunk/dist/game/data/skillTrees/MaleSoulBreaker.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/MaleSoulHound.xml b/trunk/dist/game/data/skillTrees/MaleSoulHound.xml index 15d0a87e84..e53cd10492 100644 --- a/trunk/dist/game/data/skillTrees/MaleSoulHound.xml +++ b/trunk/dist/game/data/skillTrees/MaleSoulHound.xml @@ -16,18 +16,18 @@ - - - - - - + + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/Marauder.xml b/trunk/dist/game/data/skillTrees/Marauder.xml index e11af6d820..ae2b743502 100644 --- a/trunk/dist/game/data/skillTrees/Marauder.xml +++ b/trunk/dist/game/data/skillTrees/Marauder.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/MoonlightSentinel.xml b/trunk/dist/game/data/skillTrees/MoonlightSentinel.xml index 37e96be601..c6328c89a3 100644 --- a/trunk/dist/game/data/skillTrees/MoonlightSentinel.xml +++ b/trunk/dist/game/data/skillTrees/MoonlightSentinel.xml @@ -16,15 +16,15 @@ - - - - - + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/MysticMuse.xml b/trunk/dist/game/data/skillTrees/MysticMuse.xml index ba28cec4bc..9df2248e6e 100644 --- a/trunk/dist/game/data/skillTrees/MysticMuse.xml +++ b/trunk/dist/game/data/skillTrees/MysticMuse.xml @@ -18,15 +18,15 @@ - - - - + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/Necromancer.xml b/trunk/dist/game/data/skillTrees/Necromancer.xml index 26d1b45f73..ddf8cf1564 100644 --- a/trunk/dist/game/data/skillTrees/Necromancer.xml +++ b/trunk/dist/game/data/skillTrees/Necromancer.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/OrcFighter.xml b/trunk/dist/game/data/skillTrees/OrcFighter.xml index bf6ef01804..173d8d8d67 100644 --- a/trunk/dist/game/data/skillTrees/OrcFighter.xml +++ b/trunk/dist/game/data/skillTrees/OrcFighter.xml @@ -10,6 +10,9 @@ + + + @@ -52,7 +55,7 @@ - - + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/OrcMystic.xml b/trunk/dist/game/data/skillTrees/OrcMystic.xml index 7377c027ec..bf51823373 100644 --- a/trunk/dist/game/data/skillTrees/OrcMystic.xml +++ b/trunk/dist/game/data/skillTrees/OrcMystic.xml @@ -14,6 +14,9 @@ + + + @@ -57,7 +60,7 @@ - - + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/OthellAdventurer.xml b/trunk/dist/game/data/skillTrees/OthellAdventurer.xml index f5fbe5ba21..382d2e3461 100644 --- a/trunk/dist/game/data/skillTrees/OthellAdventurer.xml +++ b/trunk/dist/game/data/skillTrees/OthellAdventurer.xml @@ -2,6 +2,7 @@ + @@ -119,9 +120,7 @@ - - - + @@ -250,5 +249,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/OthellFortuneSeeker.xml b/trunk/dist/game/data/skillTrees/OthellFortuneSeeker.xml index fa96c8f9d5..fc3730021f 100644 --- a/trunk/dist/game/data/skillTrees/OthellFortuneSeeker.xml +++ b/trunk/dist/game/data/skillTrees/OthellFortuneSeeker.xml @@ -2,6 +2,7 @@ + @@ -117,9 +118,7 @@ - - - + @@ -251,5 +250,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/OthellGhostHunter.xml b/trunk/dist/game/data/skillTrees/OthellGhostHunter.xml index c37369a9c0..8499037302 100644 --- a/trunk/dist/game/data/skillTrees/OthellGhostHunter.xml +++ b/trunk/dist/game/data/skillTrees/OthellGhostHunter.xml @@ -2,6 +2,7 @@ + @@ -56,7 +57,6 @@ - @@ -119,9 +119,7 @@ - - - + @@ -253,5 +251,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/OthellWindRider.xml b/trunk/dist/game/data/skillTrees/OthellWindRider.xml index a547ad1203..d7d9aa8e07 100644 --- a/trunk/dist/game/data/skillTrees/OthellWindRider.xml +++ b/trunk/dist/game/data/skillTrees/OthellWindRider.xml @@ -2,6 +2,7 @@ + @@ -56,7 +57,6 @@ - @@ -120,9 +120,7 @@ - - - + @@ -254,5 +252,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/Overlord.xml b/trunk/dist/game/data/skillTrees/Overlord.xml index 293cbf09c2..843507b253 100644 --- a/trunk/dist/game/data/skillTrees/Overlord.xml +++ b/trunk/dist/game/data/skillTrees/Overlord.xml @@ -2,10 +2,10 @@ - - - - + + + + @@ -487,9 +487,9 @@ - - - + + + diff --git a/trunk/dist/game/data/skillTrees/Paladin.xml b/trunk/dist/game/data/skillTrees/Paladin.xml index 0f33de8ff6..90346702f4 100644 --- a/trunk/dist/game/data/skillTrees/Paladin.xml +++ b/trunk/dist/game/data/skillTrees/Paladin.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/PhantomRanger.xml b/trunk/dist/game/data/skillTrees/PhantomRanger.xml index f05b3b3ec3..a0198d9607 100644 --- a/trunk/dist/game/data/skillTrees/PhantomRanger.xml +++ b/trunk/dist/game/data/skillTrees/PhantomRanger.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/PhantomSummoner.xml b/trunk/dist/game/data/skillTrees/PhantomSummoner.xml index 86cff47cb4..87067e580d 100644 --- a/trunk/dist/game/data/skillTrees/PhantomSummoner.xml +++ b/trunk/dist/game/data/skillTrees/PhantomSummoner.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/PhoenixKnight.xml b/trunk/dist/game/data/skillTrees/PhoenixKnight.xml index 29eece3ba6..66d13c292b 100644 --- a/trunk/dist/game/data/skillTrees/PhoenixKnight.xml +++ b/trunk/dist/game/data/skillTrees/PhoenixKnight.xml @@ -23,21 +23,21 @@ - - - - - - - + + + + + + + - - - + + + - + diff --git a/trunk/dist/game/data/skillTrees/PlainsWalker.xml b/trunk/dist/game/data/skillTrees/PlainsWalker.xml index c9029ab1a3..d9c1807892 100644 --- a/trunk/dist/game/data/skillTrees/PlainsWalker.xml +++ b/trunk/dist/game/data/skillTrees/PlainsWalker.xml @@ -2,10 +2,10 @@ - - - - + + + + @@ -360,6 +360,6 @@ - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Prophet.xml b/trunk/dist/game/data/skillTrees/Prophet.xml index 2997ccb903..73c10999d3 100644 --- a/trunk/dist/game/data/skillTrees/Prophet.xml +++ b/trunk/dist/game/data/skillTrees/Prophet.xml @@ -2,10 +2,10 @@ - - - - + + + + @@ -353,8 +353,8 @@ - - + + diff --git a/trunk/dist/game/data/skillTrees/Rogue.xml b/trunk/dist/game/data/skillTrees/Rogue.xml index f4efa9acad..26a9c486a5 100644 --- a/trunk/dist/game/data/skillTrees/Rogue.xml +++ b/trunk/dist/game/data/skillTrees/Rogue.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/Sagittarius.xml b/trunk/dist/game/data/skillTrees/Sagittarius.xml index 670d4efc4b..1572b93464 100644 --- a/trunk/dist/game/data/skillTrees/Sagittarius.xml +++ b/trunk/dist/game/data/skillTrees/Sagittarius.xml @@ -15,15 +15,15 @@ - - - - - + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/Sayha'sSeer.xml b/trunk/dist/game/data/skillTrees/Sayha'sSeer.xml index f639a697ab..646ca551e9 100644 --- a/trunk/dist/game/data/skillTrees/Sayha'sSeer.xml +++ b/trunk/dist/game/data/skillTrees/Sayha'sSeer.xml @@ -15,7 +15,7 @@ - + @@ -35,5 +35,13 @@ + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/ShillienElder.xml b/trunk/dist/game/data/skillTrees/ShillienElder.xml index e596b3bec2..cb3bcda190 100644 --- a/trunk/dist/game/data/skillTrees/ShillienElder.xml +++ b/trunk/dist/game/data/skillTrees/ShillienElder.xml @@ -2,10 +2,10 @@ - - - - + + + + @@ -356,7 +356,7 @@ - - + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/ShillienKnight.xml b/trunk/dist/game/data/skillTrees/ShillienKnight.xml index be964f95a6..66637ef9e1 100644 --- a/trunk/dist/game/data/skillTrees/ShillienKnight.xml +++ b/trunk/dist/game/data/skillTrees/ShillienKnight.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/ShillienSaint.xml b/trunk/dist/game/data/skillTrees/ShillienSaint.xml index a721eb012e..b65eaa0eaf 100644 --- a/trunk/dist/game/data/skillTrees/ShillienSaint.xml +++ b/trunk/dist/game/data/skillTrees/ShillienSaint.xml @@ -20,14 +20,14 @@ - - - - + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/ShillienTemplar.xml b/trunk/dist/game/data/skillTrees/ShillienTemplar.xml index 3f50c059d8..d9e0b31220 100644 --- a/trunk/dist/game/data/skillTrees/ShillienTemplar.xml +++ b/trunk/dist/game/data/skillTrees/ShillienTemplar.xml @@ -24,18 +24,18 @@ - - - - - - - + + + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/SigelEva'sTemplar.xml b/trunk/dist/game/data/skillTrees/SigelEva'sTemplar.xml index a4be3e7a3d..b12263790b 100644 --- a/trunk/dist/game/data/skillTrees/SigelEva'sTemplar.xml +++ b/trunk/dist/game/data/skillTrees/SigelEva'sTemplar.xml @@ -2,6 +2,7 @@ + @@ -71,7 +72,7 @@ - + @@ -152,7 +153,7 @@ - + @@ -191,7 +192,7 @@ - + @@ -229,7 +230,7 @@ - + @@ -239,5 +240,22 @@ + + + + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/SigelHellKnight.xml b/trunk/dist/game/data/skillTrees/SigelHellKnight.xml index f42e627d09..bf3246c72f 100644 --- a/trunk/dist/game/data/skillTrees/SigelHellKnight.xml +++ b/trunk/dist/game/data/skillTrees/SigelHellKnight.xml @@ -2,6 +2,7 @@ + @@ -70,7 +71,7 @@ - + @@ -149,7 +150,7 @@ - + @@ -187,7 +188,7 @@ - + @@ -224,7 +225,7 @@ - + @@ -233,5 +234,22 @@ + + + + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/SigelPhoenixKnight.xml b/trunk/dist/game/data/skillTrees/SigelPhoenixKnight.xml index 6e5bb36844..88233381a1 100644 --- a/trunk/dist/game/data/skillTrees/SigelPhoenixKnight.xml +++ b/trunk/dist/game/data/skillTrees/SigelPhoenixKnight.xml @@ -2,6 +2,7 @@ + @@ -72,7 +73,7 @@ - + @@ -143,7 +144,6 @@ - @@ -152,7 +152,7 @@ - + @@ -192,7 +192,7 @@ - + @@ -231,7 +231,7 @@ - + @@ -240,5 +240,22 @@ + + + + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/SigelShillienTemplar.xml b/trunk/dist/game/data/skillTrees/SigelShillienTemplar.xml index e0cfe6bc28..c4cafa802a 100644 --- a/trunk/dist/game/data/skillTrees/SigelShillienTemplar.xml +++ b/trunk/dist/game/data/skillTrees/SigelShillienTemplar.xml @@ -2,6 +2,7 @@ + @@ -70,7 +71,7 @@ - + @@ -151,7 +152,7 @@ - + @@ -191,7 +192,7 @@ - + @@ -231,7 +232,7 @@ - + @@ -242,5 +243,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/SilverRanger.xml b/trunk/dist/game/data/skillTrees/SilverRanger.xml index 83349eef83..379e901352 100644 --- a/trunk/dist/game/data/skillTrees/SilverRanger.xml +++ b/trunk/dist/game/data/skillTrees/SilverRanger.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/Sorcerer.xml b/trunk/dist/game/data/skillTrees/Sorcerer.xml index f1d7ecac7a..3f108bb8a1 100644 --- a/trunk/dist/game/data/skillTrees/Sorcerer.xml +++ b/trunk/dist/game/data/skillTrees/Sorcerer.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/Soultaker.xml b/trunk/dist/game/data/skillTrees/Soultaker.xml index 7be99b5dfa..289fff2849 100644 --- a/trunk/dist/game/data/skillTrees/Soultaker.xml +++ b/trunk/dist/game/data/skillTrees/Soultaker.xml @@ -19,14 +19,14 @@ - - - - + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/SpectralDancer.xml b/trunk/dist/game/data/skillTrees/SpectralDancer.xml index 4a89ed999f..f3e6529de6 100644 --- a/trunk/dist/game/data/skillTrees/SpectralDancer.xml +++ b/trunk/dist/game/data/skillTrees/SpectralDancer.xml @@ -3,8 +3,9 @@ - + + @@ -19,19 +20,20 @@ + - - - - + + + + - - - + + + - + diff --git a/trunk/dist/game/data/skillTrees/SpectralMaster.xml b/trunk/dist/game/data/skillTrees/SpectralMaster.xml index 393aaf8f29..5d3086ecce 100644 --- a/trunk/dist/game/data/skillTrees/SpectralMaster.xml +++ b/trunk/dist/game/data/skillTrees/SpectralMaster.xml @@ -23,18 +23,18 @@ - - - - + + + + - - - + + + - + diff --git a/trunk/dist/game/data/skillTrees/Spelljowler.xml b/trunk/dist/game/data/skillTrees/Spelljowler.xml index 6d9a8067ba..ede53ee221 100644 --- a/trunk/dist/game/data/skillTrees/Spelljowler.xml +++ b/trunk/dist/game/data/skillTrees/Spelljowler.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/Spellsinger.xml b/trunk/dist/game/data/skillTrees/Spellsinger.xml index 4bb56c45d9..d6f9d1e39b 100644 --- a/trunk/dist/game/data/skillTrees/Spellsinger.xml +++ b/trunk/dist/game/data/skillTrees/Spellsinger.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/StormScreamer.xml b/trunk/dist/game/data/skillTrees/StormScreamer.xml index caecb21eb2..c8dc275aa1 100644 --- a/trunk/dist/game/data/skillTrees/StormScreamer.xml +++ b/trunk/dist/game/data/skillTrees/StormScreamer.xml @@ -19,15 +19,15 @@ - - - - + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/Swordmuse.xml b/trunk/dist/game/data/skillTrees/Swordmuse.xml index bf686cfa9d..e3773806b1 100644 --- a/trunk/dist/game/data/skillTrees/Swordmuse.xml +++ b/trunk/dist/game/data/skillTrees/Swordmuse.xml @@ -3,8 +3,9 @@ - + + @@ -20,19 +21,20 @@ + - - - - + + + + - - - + + + - + diff --git a/trunk/dist/game/data/skillTrees/Swordsinger.xml b/trunk/dist/game/data/skillTrees/Swordsinger.xml index b0acadec9c..af3f1ec0fc 100644 --- a/trunk/dist/game/data/skillTrees/Swordsinger.xml +++ b/trunk/dist/game/data/skillTrees/Swordsinger.xml @@ -1,10 +1,10 @@ - - - - + + + + @@ -38,6 +38,7 @@ + @@ -87,6 +88,7 @@ + @@ -106,6 +108,7 @@ + @@ -124,6 +127,7 @@ + @@ -138,6 +142,7 @@ + diff --git a/trunk/dist/game/data/skillTrees/TempleKnight.xml b/trunk/dist/game/data/skillTrees/TempleKnight.xml index e6906a07c1..81d12fd349 100644 --- a/trunk/dist/game/data/skillTrees/TempleKnight.xml +++ b/trunk/dist/game/data/skillTrees/TempleKnight.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/Titan.xml b/trunk/dist/game/data/skillTrees/Titan.xml index 3e588931c1..35ecfce9f7 100644 --- a/trunk/dist/game/data/skillTrees/Titan.xml +++ b/trunk/dist/game/data/skillTrees/Titan.xml @@ -17,15 +17,15 @@ - - - - - + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/TreasureHunter.xml b/trunk/dist/game/data/skillTrees/TreasureHunter.xml index 01fcf14c6a..e154b01130 100644 --- a/trunk/dist/game/data/skillTrees/TreasureHunter.xml +++ b/trunk/dist/game/data/skillTrees/TreasureHunter.xml @@ -295,6 +295,6 @@ - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Trickster.xml b/trunk/dist/game/data/skillTrees/Trickster.xml index 6367cce92b..0741ae55f7 100644 --- a/trunk/dist/game/data/skillTrees/Trickster.xml +++ b/trunk/dist/game/data/skillTrees/Trickster.xml @@ -13,14 +13,14 @@ - - - - + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/Tyrant.xml b/trunk/dist/game/data/skillTrees/Tyrant.xml index 60807b345c..5f26687f40 100644 --- a/trunk/dist/game/data/skillTrees/Tyrant.xml +++ b/trunk/dist/game/data/skillTrees/Tyrant.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/TyrrDoombringer.xml b/trunk/dist/game/data/skillTrees/TyrrDoombringer.xml index 6a22cf44bc..23ea8faf87 100644 --- a/trunk/dist/game/data/skillTrees/TyrrDoombringer.xml +++ b/trunk/dist/game/data/skillTrees/TyrrDoombringer.xml @@ -2,6 +2,7 @@ + @@ -161,7 +162,6 @@ - @@ -198,7 +198,6 @@ - @@ -285,5 +284,22 @@ + + + + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/TyrrDreadnought.xml b/trunk/dist/game/data/skillTrees/TyrrDreadnought.xml index f38086c770..f22f2a1902 100644 --- a/trunk/dist/game/data/skillTrees/TyrrDreadnought.xml +++ b/trunk/dist/game/data/skillTrees/TyrrDreadnought.xml @@ -2,6 +2,7 @@ + @@ -140,7 +141,6 @@ - @@ -252,7 +252,6 @@ - @@ -281,5 +280,22 @@ + + + + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/TyrrDuelist.xml b/trunk/dist/game/data/skillTrees/TyrrDuelist.xml index 576706d1bd..63eac88c2d 100644 --- a/trunk/dist/game/data/skillTrees/TyrrDuelist.xml +++ b/trunk/dist/game/data/skillTrees/TyrrDuelist.xml @@ -2,6 +2,7 @@ + @@ -108,7 +109,6 @@ - @@ -268,33 +268,22 @@ - - - - + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - diff --git a/trunk/dist/game/data/skillTrees/TyrrGrandKhavatari.xml b/trunk/dist/game/data/skillTrees/TyrrGrandKhavatari.xml index 0671ec46dc..b3cb009642 100644 --- a/trunk/dist/game/data/skillTrees/TyrrGrandKhavatari.xml +++ b/trunk/dist/game/data/skillTrees/TyrrGrandKhavatari.xml @@ -2,6 +2,7 @@ + @@ -258,32 +259,26 @@ - - - - + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - diff --git a/trunk/dist/game/data/skillTrees/TyrrMaestro.xml b/trunk/dist/game/data/skillTrees/TyrrMaestro.xml index 02aa3c62b8..14e1a38089 100644 --- a/trunk/dist/game/data/skillTrees/TyrrMaestro.xml +++ b/trunk/dist/game/data/skillTrees/TyrrMaestro.xml @@ -2,6 +2,7 @@ + @@ -21,6 +22,7 @@ + @@ -279,5 +281,17 @@ + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/TyrrTitan.xml b/trunk/dist/game/data/skillTrees/TyrrTitan.xml index 13cc715c0e..85de0fa214 100644 --- a/trunk/dist/game/data/skillTrees/TyrrTitan.xml +++ b/trunk/dist/game/data/skillTrees/TyrrTitan.xml @@ -2,6 +2,7 @@ + @@ -266,18 +267,13 @@ - - - - - - - - - + + + + + + + - - - diff --git a/trunk/dist/game/data/skillTrees/Warcryer.xml b/trunk/dist/game/data/skillTrees/Warcryer.xml index c0492bb0d6..f2c9dfcc9b 100644 --- a/trunk/dist/game/data/skillTrees/Warcryer.xml +++ b/trunk/dist/game/data/skillTrees/Warcryer.xml @@ -1,10 +1,10 @@ - - - - + + + + @@ -333,7 +333,7 @@ - + @@ -356,8 +356,8 @@ - - + + @@ -384,6 +384,6 @@ - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/Warlock.xml b/trunk/dist/game/data/skillTrees/Warlock.xml index 8249638eab..677046c6bb 100644 --- a/trunk/dist/game/data/skillTrees/Warlock.xml +++ b/trunk/dist/game/data/skillTrees/Warlock.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/Warlord.xml b/trunk/dist/game/data/skillTrees/Warlord.xml index c3d8f038cd..2bbb55e610 100644 --- a/trunk/dist/game/data/skillTrees/Warlord.xml +++ b/trunk/dist/game/data/skillTrees/Warlord.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/Warsmith.xml b/trunk/dist/game/data/skillTrees/Warsmith.xml index 93d408ae11..ad9b991867 100644 --- a/trunk/dist/game/data/skillTrees/Warsmith.xml +++ b/trunk/dist/game/data/skillTrees/Warsmith.xml @@ -1,10 +1,10 @@ - - - - + + + + diff --git a/trunk/dist/game/data/skillTrees/WindRider.xml b/trunk/dist/game/data/skillTrees/WindRider.xml index dcdc79180c..22c76dcc42 100644 --- a/trunk/dist/game/data/skillTrees/WindRider.xml +++ b/trunk/dist/game/data/skillTrees/WindRider.xml @@ -18,17 +18,17 @@ - - - - - - - + + + + + + + - - - + + + diff --git a/trunk/dist/game/data/skillTrees/WynnArcanaLord.xml b/trunk/dist/game/data/skillTrees/WynnArcanaLord.xml index 3626575bc5..d18cef1b9b 100644 --- a/trunk/dist/game/data/skillTrees/WynnArcanaLord.xml +++ b/trunk/dist/game/data/skillTrees/WynnArcanaLord.xml @@ -2,6 +2,7 @@ + @@ -258,5 +259,16 @@ + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/WynnElementalMaster.xml b/trunk/dist/game/data/skillTrees/WynnElementalMaster.xml index b9a56a7b59..001ec62133 100644 --- a/trunk/dist/game/data/skillTrees/WynnElementalMaster.xml +++ b/trunk/dist/game/data/skillTrees/WynnElementalMaster.xml @@ -2,6 +2,7 @@ + @@ -258,5 +259,19 @@ + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/WynnSpectralMaster.xml b/trunk/dist/game/data/skillTrees/WynnSpectralMaster.xml index 446ddf939f..95d1b1dfa3 100644 --- a/trunk/dist/game/data/skillTrees/WynnSpectralMaster.xml +++ b/trunk/dist/game/data/skillTrees/WynnSpectralMaster.xml @@ -2,6 +2,7 @@ + @@ -258,5 +259,16 @@ + + + + + + + + + + + - + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/YulGhostSentinel.xml b/trunk/dist/game/data/skillTrees/YulGhostSentinel.xml index d94abc5174..ff80403968 100644 --- a/trunk/dist/game/data/skillTrees/YulGhostSentinel.xml +++ b/trunk/dist/game/data/skillTrees/YulGhostSentinel.xml @@ -2,6 +2,7 @@ + @@ -246,5 +247,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/YulMoonlightSentinel.xml b/trunk/dist/game/data/skillTrees/YulMoonlightSentinel.xml index 6bc2f2dc1e..aaf2461b4f 100644 --- a/trunk/dist/game/data/skillTrees/YulMoonlightSentinel.xml +++ b/trunk/dist/game/data/skillTrees/YulMoonlightSentinel.xml @@ -2,6 +2,7 @@ + @@ -246,5 +247,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/YulSagittarius.xml b/trunk/dist/game/data/skillTrees/YulSagittarius.xml index 889bd7fc00..016a3ed188 100644 --- a/trunk/dist/game/data/skillTrees/YulSagittarius.xml +++ b/trunk/dist/game/data/skillTrees/YulSagittarius.xml @@ -2,6 +2,7 @@ + @@ -246,5 +247,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/YulTrickster.xml b/trunk/dist/game/data/skillTrees/YulTrickster.xml index 46f306bcf1..ab14afe741 100644 --- a/trunk/dist/game/data/skillTrees/YulTrickster.xml +++ b/trunk/dist/game/data/skillTrees/YulTrickster.xml @@ -2,6 +2,7 @@ + @@ -246,5 +247,13 @@ + + + + + + + + diff --git a/trunk/dist/game/data/skillTrees/revelationSkillTree.xml b/trunk/dist/game/data/skillTrees/revelationSkillTree.xml index b595887195..5caac38a0c 100644 --- a/trunk/dist/game/data/skillTrees/revelationSkillTree.xml +++ b/trunk/dist/game/data/skillTrees/revelationSkillTree.xml @@ -25,6 +25,12 @@ + + + + + + @@ -51,5 +57,11 @@ + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/skillTrees/transferSkillTree.xml b/trunk/dist/game/data/skillTrees/transferSkillTree.xml index 844861403f..81dfe9f5f6 100644 --- a/trunk/dist/game/data/skillTrees/transferSkillTree.xml +++ b/trunk/dist/game/data/skillTrees/transferSkillTree.xml @@ -1,255 +1,333 @@ - - - - + + + + - + - + - + - - - - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + - + - + - + - + - + - - - - - - - - - - - - - - - - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/stats/chars/baseStats/AbyssWalker.xml b/trunk/dist/game/data/stats/chars/baseStats/AbyssWalker.xml index 4906307bd8..b787ec5084 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/AbyssWalker.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/AbyssWalker.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Adventurer.xml b/trunk/dist/game/data/stats/chars/baseStats/Adventurer.xml index ccd4f127d9..dafca8b3d5 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Adventurer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Adventurer.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/AeoreCardinal.xml b/trunk/dist/game/data/stats/chars/baseStats/AeoreCardinal.xml index 53152294fc..f5b9347e86 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/AeoreCardinal.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/AeoreCardinal.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/AeoreEva'sSaint.xml b/trunk/dist/game/data/stats/chars/baseStats/AeoreEva'sSaint.xml index 915e282dc6..f31e5b15b9 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/AeoreEva'sSaint.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/AeoreEva'sSaint.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/AeoreShillienSaint.xml b/trunk/dist/game/data/stats/chars/baseStats/AeoreShillienSaint.xml index 9fa5ce14f4..29ba60a9f1 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/AeoreShillienSaint.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/AeoreShillienSaint.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Arbalester.xml b/trunk/dist/game/data/stats/chars/baseStats/Arbalester.xml index baab0f0615..d3832328bd 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Arbalester.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Arbalester.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ArcanaLord.xml b/trunk/dist/game/data/stats/chars/baseStats/ArcanaLord.xml index 540afd758d..6b75c64a67 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ArcanaLord.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ArcanaLord.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Archmage.xml b/trunk/dist/game/data/stats/chars/baseStats/Archmage.xml index b3efd30ce1..0232b17bf8 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Archmage.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Archmage.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Artisan.xml b/trunk/dist/game/data/stats/chars/baseStats/Artisan.xml index 2fa6a56476..2c6a97e720 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Artisan.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Artisan.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Assassin.xml b/trunk/dist/game/data/stats/chars/baseStats/Assassin.xml index 661f91c71a..522d2bc496 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Assassin.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Assassin.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Berserker.xml b/trunk/dist/game/data/stats/chars/baseStats/Berserker.xml index 72800be8ea..027008303a 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Berserker.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Berserker.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Bishop.xml b/trunk/dist/game/data/stats/chars/baseStats/Bishop.xml index c6a81f3b25..e062b2e3ae 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Bishop.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Bishop.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Bladedancer.xml b/trunk/dist/game/data/stats/chars/baseStats/Bladedancer.xml index 6eea0a0484..92969f623a 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Bladedancer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Bladedancer.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/BountyHunter.xml b/trunk/dist/game/data/stats/chars/baseStats/BountyHunter.xml index cf9a4862a3..267918f834 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/BountyHunter.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/BountyHunter.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Cardinal.xml b/trunk/dist/game/data/stats/chars/baseStats/Cardinal.xml index 29edf0ef72..514ac175dc 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Cardinal.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Cardinal.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Cleric.xml b/trunk/dist/game/data/stats/chars/baseStats/Cleric.xml index d2aa40a089..5355d5e0c3 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Cleric.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Cleric.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/CloudBreaker.xml b/trunk/dist/game/data/stats/chars/baseStats/CloudBreaker.xml index 09b32bb7be..7450cf8542 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/CloudBreaker.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/CloudBreaker.xml @@ -15,7 +15,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/DarkAvenger.xml b/trunk/dist/game/data/stats/chars/baseStats/DarkAvenger.xml index b7a3a57114..9b37276318 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/DarkAvenger.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/DarkAvenger.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/DarkFighter.xml b/trunk/dist/game/data/stats/chars/baseStats/DarkFighter.xml index d20384171a..590e37ff8d 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/DarkFighter.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/DarkFighter.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/DarkMystic.xml b/trunk/dist/game/data/stats/chars/baseStats/DarkMystic.xml index b508fc2f5e..54751c7d0a 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/DarkMystic.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/DarkMystic.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/DarkWizard.xml b/trunk/dist/game/data/stats/chars/baseStats/DarkWizard.xml index 25e753887f..43899fae07 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/DarkWizard.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/DarkWizard.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Destroyer.xml b/trunk/dist/game/data/stats/chars/baseStats/Destroyer.xml index 00d39c4b14..7562509836 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Destroyer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Destroyer.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Dominator.xml b/trunk/dist/game/data/stats/chars/baseStats/Dominator.xml index 9517eb7484..54f271f1c6 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Dominator.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Dominator.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Doombringer.xml b/trunk/dist/game/data/stats/chars/baseStats/Doombringer.xml index 0a328fabdd..753242fc21 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Doombringer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Doombringer.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Doomcryer.xml b/trunk/dist/game/data/stats/chars/baseStats/Doomcryer.xml index ce7f870e0c..e895bad91c 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Doomcryer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Doomcryer.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Dreadnought.xml b/trunk/dist/game/data/stats/chars/baseStats/Dreadnought.xml index dce44ba120..bdfdcacb23 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Dreadnought.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Dreadnought.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Duelist.xml b/trunk/dist/game/data/stats/chars/baseStats/Duelist.xml index 0fd18f9932..a2414a37f8 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Duelist.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Duelist.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/DwarvenFighter.xml b/trunk/dist/game/data/stats/chars/baseStats/DwarvenFighter.xml index d8a5bd32d4..790e923b23 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/DwarvenFighter.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/DwarvenFighter.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ElementalMaster.xml b/trunk/dist/game/data/stats/chars/baseStats/ElementalMaster.xml index 27d2778915..660b7ca700 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ElementalMaster.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ElementalMaster.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ElementalSummoner.xml b/trunk/dist/game/data/stats/chars/baseStats/ElementalSummoner.xml index 70d41203fb..895311a43d 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ElementalSummoner.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ElementalSummoner.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ElvenElder.xml b/trunk/dist/game/data/stats/chars/baseStats/ElvenElder.xml index 84b9495b15..cc1ddd5c16 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ElvenElder.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ElvenElder.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ElvenFighter.xml b/trunk/dist/game/data/stats/chars/baseStats/ElvenFighter.xml index 7a229fe077..da3573c4ab 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ElvenFighter.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ElvenFighter.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ElvenKnight.xml b/trunk/dist/game/data/stats/chars/baseStats/ElvenKnight.xml index 606b9b1a5d..2814e0c04e 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ElvenKnight.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ElvenKnight.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ElvenMystic.xml b/trunk/dist/game/data/stats/chars/baseStats/ElvenMystic.xml index 69b70efb54..c98d915f47 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ElvenMystic.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ElvenMystic.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ElvenOracle.xml b/trunk/dist/game/data/stats/chars/baseStats/ElvenOracle.xml index b238950e14..27b5987ddb 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ElvenOracle.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ElvenOracle.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ElvenScout.xml b/trunk/dist/game/data/stats/chars/baseStats/ElvenScout.xml index dc1a8f03c1..933dfc7bcd 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ElvenScout.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ElvenScout.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ElvenWizard.xml b/trunk/dist/game/data/stats/chars/baseStats/ElvenWizard.xml index c6852cb1bc..560efaa840 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ElvenWizard.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ElvenWizard.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ErtheiaFighter.xml b/trunk/dist/game/data/stats/chars/baseStats/ErtheiaFighter.xml index e26b6128ae..5df57529df 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ErtheiaFighter.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ErtheiaFighter.xml @@ -15,10 +15,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ErtheiaWizard.xml b/trunk/dist/game/data/stats/chars/baseStats/ErtheiaWizard.xml index 47933e2db7..f0e6a15fdd 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ErtheiaWizard.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ErtheiaWizard.xml @@ -15,7 +15,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Eva'sSaint.xml b/trunk/dist/game/data/stats/chars/baseStats/Eva'sSaint.xml index be636a1139..cc110d91f6 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Eva'sSaint.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Eva'sSaint.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Eva'sTemplar.xml b/trunk/dist/game/data/stats/chars/baseStats/Eva'sTemplar.xml index baedbcdc72..eee347181d 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Eva'sTemplar.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Eva'sTemplar.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Eviscerator.xml b/trunk/dist/game/data/stats/chars/baseStats/Eviscerator.xml index 379bb1a745..316e133ffa 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Eviscerator.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Eviscerator.xml @@ -15,10 +15,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/FemaleKamaelSoldier.xml b/trunk/dist/game/data/stats/chars/baseStats/FemaleKamaelSoldier.xml index 9b329e5b9c..a3eb461c38 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/FemaleKamaelSoldier.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/FemaleKamaelSoldier.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/FemaleSoulBraker.xml b/trunk/dist/game/data/stats/chars/baseStats/FemaleSoulBraker.xml index 19d2cd736c..31fbe468e9 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/FemaleSoulBraker.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/FemaleSoulBraker.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/FemaleSoulHound.xml b/trunk/dist/game/data/stats/chars/baseStats/FemaleSoulHound.xml index 5fc4cc7537..26f94957b1 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/FemaleSoulHound.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/FemaleSoulHound.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/FeohArchmage.xml b/trunk/dist/game/data/stats/chars/baseStats/FeohArchmage.xml index 693fa13d0b..45b92ccc6d 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/FeohArchmage.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/FeohArchmage.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/FeohMysticMuse.xml b/trunk/dist/game/data/stats/chars/baseStats/FeohMysticMuse.xml index 9bfc96ef45..be13254c93 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/FeohMysticMuse.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/FeohMysticMuse.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/FeohSoultaker.xml b/trunk/dist/game/data/stats/chars/baseStats/FeohSoultaker.xml index e9a8ccbf0d..33cc3cea57 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/FeohSoultaker.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/FeohSoultaker.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/FeohStormScreamer.xml b/trunk/dist/game/data/stats/chars/baseStats/FeohStormScreamer.xml index 022628aa65..1d03973123 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/FeohStormScreamer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/FeohStormScreamer.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/FortuneSeeker.xml b/trunk/dist/game/data/stats/chars/baseStats/FortuneSeeker.xml index 64ff45f9b6..fdc5164735 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/FortuneSeeker.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/FortuneSeeker.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/GhostHunter.xml b/trunk/dist/game/data/stats/chars/baseStats/GhostHunter.xml index 1e4f59f26f..5098e56ade 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/GhostHunter.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/GhostHunter.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/GhostSentinel.xml b/trunk/dist/game/data/stats/chars/baseStats/GhostSentinel.xml index a65cab3581..8bc80753fb 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/GhostSentinel.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/GhostSentinel.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Gladiator.xml b/trunk/dist/game/data/stats/chars/baseStats/Gladiator.xml index 28d74eb5af..b685a5f437 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Gladiator.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Gladiator.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/GrandKhavatari.xml b/trunk/dist/game/data/stats/chars/baseStats/GrandKhavatari.xml index 7f3cf9f9a6..7db17804f9 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/GrandKhavatari.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/GrandKhavatari.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/HawkEye.xml b/trunk/dist/game/data/stats/chars/baseStats/HawkEye.xml index 01b1b04284..f424d78b9b 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/HawkEye.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/HawkEye.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/HellKnight.xml b/trunk/dist/game/data/stats/chars/baseStats/HellKnight.xml index 9aabb6abd7..96cddf55ec 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/HellKnight.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/HellKnight.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Hierophant.xml b/trunk/dist/game/data/stats/chars/baseStats/Hierophant.xml index eeab676838..0ea59937d6 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Hierophant.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Hierophant.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/HumanFighter.xml b/trunk/dist/game/data/stats/chars/baseStats/HumanFighter.xml index a32d45a115..f5efc8afab 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/HumanFighter.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/HumanFighter.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/HumanKnight.xml b/trunk/dist/game/data/stats/chars/baseStats/HumanKnight.xml index f7c55ecb00..b49506b34d 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/HumanKnight.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/HumanKnight.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/HumanMystic.xml b/trunk/dist/game/data/stats/chars/baseStats/HumanMystic.xml index 3e5f59e1e4..014b514106 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/HumanMystic.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/HumanMystic.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/HumanWizard.xml b/trunk/dist/game/data/stats/chars/baseStats/HumanWizard.xml index 1f42cf2c55..1da8566166 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/HumanWizard.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/HumanWizard.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Inspector.xml b/trunk/dist/game/data/stats/chars/baseStats/Inspector.xml index 1fec124cc8..2efa395026 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Inspector.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Inspector.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/IssDominator.xml b/trunk/dist/game/data/stats/chars/baseStats/IssDominator.xml index b3cb3cc301..11dd1754bd 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/IssDominator.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/IssDominator.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/IssDoomcryer.xml b/trunk/dist/game/data/stats/chars/baseStats/IssDoomcryer.xml index 99c2558b5a..97b799e1b1 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/IssDoomcryer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/IssDoomcryer.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/IssHierophant.xml b/trunk/dist/game/data/stats/chars/baseStats/IssHierophant.xml index 1ef014e1df..ef5ad6ed6c 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/IssHierophant.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/IssHierophant.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/IssSpectralDancer.xml b/trunk/dist/game/data/stats/chars/baseStats/IssSpectralDancer.xml index f9f0d547ce..f4bbd06342 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/IssSpectralDancer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/IssSpectralDancer.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/IssSwordMuse.xml b/trunk/dist/game/data/stats/chars/baseStats/IssSwordMuse.xml index 6a6de48f5b..e164ec595f 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/IssSwordMuse.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/IssSwordMuse.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Judicator.xml b/trunk/dist/game/data/stats/chars/baseStats/Judicator.xml index e0e79500b0..aab6a663ab 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Judicator.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Judicator.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Maestro.xml b/trunk/dist/game/data/stats/chars/baseStats/Maestro.xml index 4136222e7a..b9d2157d32 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Maestro.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Maestro.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/MaleKamaelSoldier.xml b/trunk/dist/game/data/stats/chars/baseStats/MaleKamaelSoldier.xml index 681c7f8362..2db0116733 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/MaleKamaelSoldier.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/MaleKamaelSoldier.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/MaleSoulBraker.xml b/trunk/dist/game/data/stats/chars/baseStats/MaleSoulBraker.xml index a40d39bd83..4a62ee1826 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/MaleSoulBraker.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/MaleSoulBraker.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/MaleSoulHound.xml b/trunk/dist/game/data/stats/chars/baseStats/MaleSoulHound.xml index 5ac90ed90e..268c2e3e85 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/MaleSoulHound.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/MaleSoulHound.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Marauder.xml b/trunk/dist/game/data/stats/chars/baseStats/Marauder.xml index c362597c73..04e57b86ac 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Marauder.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Marauder.xml @@ -15,10 +15,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Monk.xml b/trunk/dist/game/data/stats/chars/baseStats/Monk.xml index 47a14eae13..a990c4a4a1 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Monk.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Monk.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/MoonlightSentinel.xml b/trunk/dist/game/data/stats/chars/baseStats/MoonlightSentinel.xml index 3d5ec608ae..1daa8a63d9 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/MoonlightSentinel.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/MoonlightSentinel.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/MysticMuse.xml b/trunk/dist/game/data/stats/chars/baseStats/MysticMuse.xml index b93cd9e1e1..a94b5911fb 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/MysticMuse.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/MysticMuse.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Necromancer.xml b/trunk/dist/game/data/stats/chars/baseStats/Necromancer.xml index edbe7fb9aa..6293f399e8 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Necromancer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Necromancer.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/OrcFighter.xml b/trunk/dist/game/data/stats/chars/baseStats/OrcFighter.xml index 93da9775ed..4a288c3683 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/OrcFighter.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/OrcFighter.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/OrcMystic.xml b/trunk/dist/game/data/stats/chars/baseStats/OrcMystic.xml index c940431261..44ec11ce77 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/OrcMystic.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/OrcMystic.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/OrcRaider.xml b/trunk/dist/game/data/stats/chars/baseStats/OrcRaider.xml index c44463f88c..b14ba87f79 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/OrcRaider.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/OrcRaider.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/OrcShaman.xml b/trunk/dist/game/data/stats/chars/baseStats/OrcShaman.xml index d54a945783..ee59ffd0e8 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/OrcShaman.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/OrcShaman.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/OthellAdventurer.xml b/trunk/dist/game/data/stats/chars/baseStats/OthellAdventurer.xml index 97a6b22108..dfdd31e118 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/OthellAdventurer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/OthellAdventurer.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/OthellFortuneSeeker.xml b/trunk/dist/game/data/stats/chars/baseStats/OthellFortuneSeeker.xml index 1646dce8d1..d6b25d42fa 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/OthellFortuneSeeker.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/OthellFortuneSeeker.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/OthellGhostHunter.xml b/trunk/dist/game/data/stats/chars/baseStats/OthellGhostHunter.xml index 5ba5f1028f..07f5278666 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/OthellGhostHunter.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/OthellGhostHunter.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/OthellWindRider.xml b/trunk/dist/game/data/stats/chars/baseStats/OthellWindRider.xml index b23190c0c7..1fdc042247 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/OthellWindRider.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/OthellWindRider.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Overlord.xml b/trunk/dist/game/data/stats/chars/baseStats/Overlord.xml index b97a9ffd78..37a528fc80 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Overlord.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Overlord.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Paladin.xml b/trunk/dist/game/data/stats/chars/baseStats/Paladin.xml index 45beff4829..93979ff434 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Paladin.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Paladin.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/PallusKnight.xml b/trunk/dist/game/data/stats/chars/baseStats/PallusKnight.xml index 9c6bf864d5..bded171e9f 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/PallusKnight.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/PallusKnight.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/PhantomRanger.xml b/trunk/dist/game/data/stats/chars/baseStats/PhantomRanger.xml index 527e520dbe..8458a83544 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/PhantomRanger.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/PhantomRanger.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/PhantomSummoner.xml b/trunk/dist/game/data/stats/chars/baseStats/PhantomSummoner.xml index 37cd9acaf7..64275ad886 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/PhantomSummoner.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/PhantomSummoner.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/PhoenixKnight.xml b/trunk/dist/game/data/stats/chars/baseStats/PhoenixKnight.xml index 10a23b03d8..899a7fe1d1 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/PhoenixKnight.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/PhoenixKnight.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/PlainsWalker.xml b/trunk/dist/game/data/stats/chars/baseStats/PlainsWalker.xml index 0f37bedc48..3a0151f738 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/PlainsWalker.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/PlainsWalker.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Prophet.xml b/trunk/dist/game/data/stats/chars/baseStats/Prophet.xml index 1793aeb012..dbcd7713d4 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Prophet.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Prophet.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Ripper.xml b/trunk/dist/game/data/stats/chars/baseStats/Ripper.xml index f85fab4001..b820c9c1a2 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Ripper.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Ripper.xml @@ -15,10 +15,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Rogue.xml b/trunk/dist/game/data/stats/chars/baseStats/Rogue.xml index b76f09db3f..734ea37bb9 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Rogue.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Rogue.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Sagittarius.xml b/trunk/dist/game/data/stats/chars/baseStats/Sagittarius.xml index 2841c2078c..cc8c0ccf43 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Sagittarius.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Sagittarius.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Sayha'sSeer.xml b/trunk/dist/game/data/stats/chars/baseStats/Sayha'sSeer.xml index 7a3eb68456..afb046e8e5 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Sayha'sSeer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Sayha'sSeer.xml @@ -15,7 +15,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Scavenger.xml b/trunk/dist/game/data/stats/chars/baseStats/Scavenger.xml index 797415a9f6..a37b424625 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Scavenger.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Scavenger.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ShillienElder.xml b/trunk/dist/game/data/stats/chars/baseStats/ShillienElder.xml index 5873f6bb32..0c64dc736e 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ShillienElder.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ShillienElder.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ShillienKnight.xml b/trunk/dist/game/data/stats/chars/baseStats/ShillienKnight.xml index fde67df37e..da215092b1 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ShillienKnight.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ShillienKnight.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ShillienOracle.xml b/trunk/dist/game/data/stats/chars/baseStats/ShillienOracle.xml index a571542a01..63af9b4e33 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ShillienOracle.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ShillienOracle.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ShillienSaint.xml b/trunk/dist/game/data/stats/chars/baseStats/ShillienSaint.xml index 7c697bdae5..c249f089e7 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ShillienSaint.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ShillienSaint.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/ShillienTemplar.xml b/trunk/dist/game/data/stats/chars/baseStats/ShillienTemplar.xml index e3a53426ef..ffb9a6e497 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/ShillienTemplar.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/ShillienTemplar.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/SigelEva'sTemplar.xml b/trunk/dist/game/data/stats/chars/baseStats/SigelEva'sTemplar.xml index 6c8269f8ba..f1c8be2c22 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/SigelEva'sTemplar.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/SigelEva'sTemplar.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/SigelHellKnight.xml b/trunk/dist/game/data/stats/chars/baseStats/SigelHellKnight.xml index 3472473918..2d0dd76625 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/SigelHellKnight.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/SigelHellKnight.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/SigelPhoenixKnight.xml b/trunk/dist/game/data/stats/chars/baseStats/SigelPhoenixKnight.xml index 6c3423187d..4c7d6aedeb 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/SigelPhoenixKnight.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/SigelPhoenixKnight.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/SigelShillienTemplar.xml b/trunk/dist/game/data/stats/chars/baseStats/SigelShillienTemplar.xml index 3959c80f58..4eaf723a42 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/SigelShillienTemplar.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/SigelShillienTemplar.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/SilverRanger.xml b/trunk/dist/game/data/stats/chars/baseStats/SilverRanger.xml index ffb13fbb21..897dd30acf 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/SilverRanger.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/SilverRanger.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Sorcerer.xml b/trunk/dist/game/data/stats/chars/baseStats/Sorcerer.xml index b086500a6b..8142d68ca5 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Sorcerer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Sorcerer.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Soultaker.xml b/trunk/dist/game/data/stats/chars/baseStats/Soultaker.xml index ce6a75fd9f..65a48ff234 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Soultaker.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Soultaker.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/SpectralDancer.xml b/trunk/dist/game/data/stats/chars/baseStats/SpectralDancer.xml index f7f3bf703a..cfd2df76e4 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/SpectralDancer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/SpectralDancer.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/SpectralMaster.xml b/trunk/dist/game/data/stats/chars/baseStats/SpectralMaster.xml index 217f914df4..1fa4e4668a 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/SpectralMaster.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/SpectralMaster.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Spellhowler.xml b/trunk/dist/game/data/stats/chars/baseStats/Spellhowler.xml index a083699131..eb7c294678 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Spellhowler.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Spellhowler.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Spellsinger.xml b/trunk/dist/game/data/stats/chars/baseStats/Spellsinger.xml index 6c3d44e726..6d712edbae 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Spellsinger.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Spellsinger.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/StormScreamer.xml b/trunk/dist/game/data/stats/chars/baseStats/StormScreamer.xml index 01208da5fe..95b6f52e1c 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/StormScreamer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/StormScreamer.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Stratomancer.xml b/trunk/dist/game/data/stats/chars/baseStats/Stratomancer.xml index 796c961584..be70445907 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Stratomancer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Stratomancer.xml @@ -15,7 +15,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/SwordMuse.xml b/trunk/dist/game/data/stats/chars/baseStats/SwordMuse.xml index 6a5d834fbb..89261ce12b 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/SwordMuse.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/SwordMuse.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/SwordSinger.xml b/trunk/dist/game/data/stats/chars/baseStats/SwordSinger.xml index ced14d7ac0..9b403009e8 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/SwordSinger.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/SwordSinger.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/TempleKnight.xml b/trunk/dist/game/data/stats/chars/baseStats/TempleKnight.xml index 200c5c02eb..09320b956d 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/TempleKnight.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/TempleKnight.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Titan.xml b/trunk/dist/game/data/stats/chars/baseStats/Titan.xml index fcf3d7eed4..de4063ac5c 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Titan.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Titan.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/TreasureHunter.xml b/trunk/dist/game/data/stats/chars/baseStats/TreasureHunter.xml index 88ccb413af..6e71eaccc6 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/TreasureHunter.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/TreasureHunter.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Trickster.xml b/trunk/dist/game/data/stats/chars/baseStats/Trickster.xml index 9e0e7d2b92..35b698afe4 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Trickster.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Trickster.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Trooper.xml b/trunk/dist/game/data/stats/chars/baseStats/Trooper.xml index d7c79a2cc4..6e4e97d6e0 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Trooper.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Trooper.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Tyrant.xml b/trunk/dist/game/data/stats/chars/baseStats/Tyrant.xml index 6b5be56056..dcc04daaff 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Tyrant.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Tyrant.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/TyrrDoombringer.xml b/trunk/dist/game/data/stats/chars/baseStats/TyrrDoombringer.xml index f3d369ffcc..23c76f2042 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/TyrrDoombringer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/TyrrDoombringer.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/TyrrDreadnought.xml b/trunk/dist/game/data/stats/chars/baseStats/TyrrDreadnought.xml index 8975bfe68a..5094d82cc7 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/TyrrDreadnought.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/TyrrDreadnought.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/TyrrDuelist.xml b/trunk/dist/game/data/stats/chars/baseStats/TyrrDuelist.xml index ae317cdeb4..8ebaae9dcf 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/TyrrDuelist.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/TyrrDuelist.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/TyrrGrandKhavatari.xml b/trunk/dist/game/data/stats/chars/baseStats/TyrrGrandKhavatari.xml index 32e24f85f9..5a00604e4e 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/TyrrGrandKhavatari.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/TyrrGrandKhavatari.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/TyrrMaestro.xml b/trunk/dist/game/data/stats/chars/baseStats/TyrrMaestro.xml index bb359619c8..79aa454c4b 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/TyrrMaestro.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/TyrrMaestro.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/TyrrTyrant.xml b/trunk/dist/game/data/stats/chars/baseStats/TyrrTyrant.xml index 1d95cfc8f2..967c434fe5 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/TyrrTyrant.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/TyrrTyrant.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Warcryer.xml b/trunk/dist/game/data/stats/chars/baseStats/Warcryer.xml index 5d261e8bba..b38843d3ff 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Warcryer.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Warcryer.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Warder.xml b/trunk/dist/game/data/stats/chars/baseStats/Warder.xml index 8783c26a7d..47395db551 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Warder.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Warder.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Warlock.xml b/trunk/dist/game/data/stats/chars/baseStats/Warlock.xml index eaf07aa65c..5f94a93494 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Warlock.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Warlock.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Warlord.xml b/trunk/dist/game/data/stats/chars/baseStats/Warlord.xml index 0b1c061120..eb5db3d2d8 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Warlord.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Warlord.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Warrior.xml b/trunk/dist/game/data/stats/chars/baseStats/Warrior.xml index 8d791c2eda..3778d235da 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Warrior.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Warrior.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/Warsmith.xml b/trunk/dist/game/data/stats/chars/baseStats/Warsmith.xml index e66c28bea4..6a4e8b7b50 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/Warsmith.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/Warsmith.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/WindRider.xml b/trunk/dist/game/data/stats/chars/baseStats/WindRider.xml index a511d5bbc9..296accfb8b 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/WindRider.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/WindRider.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/WynnArcanaLord.xml b/trunk/dist/game/data/stats/chars/baseStats/WynnArcanaLord.xml index 5c84f2756a..400dbb677a 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/WynnArcanaLord.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/WynnArcanaLord.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/WynnElementalMaster.xml b/trunk/dist/game/data/stats/chars/baseStats/WynnElementalMaster.xml index 073d706cc6..c0a32cf00a 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/WynnElementalMaster.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/WynnElementalMaster.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/WynnSpectralMaster.xml b/trunk/dist/game/data/stats/chars/baseStats/WynnSpectralMaster.xml index 9f505988c3..572f817ae6 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/WynnSpectralMaster.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/WynnSpectralMaster.xml @@ -19,7 +19,7 @@ 3 4 - 7 + 5 FIST 240 333 diff --git a/trunk/dist/game/data/stats/chars/baseStats/YulGhostHunter.xml b/trunk/dist/game/data/stats/chars/baseStats/YulGhostHunter.xml index dba120ecc3..4edbdb0258 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/YulGhostHunter.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/YulGhostHunter.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/YulMoonlightSentinel.xml b/trunk/dist/game/data/stats/chars/baseStats/YulMoonlightSentinel.xml index 64ce038ac8..8ca82095f6 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/YulMoonlightSentinel.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/YulMoonlightSentinel.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/YulSagittarius.xml b/trunk/dist/game/data/stats/chars/baseStats/YulSagittarius.xml index 0aef4ec4db..bbcd6903ed 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/YulSagittarius.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/YulSagittarius.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/chars/baseStats/YulTrickster.xml b/trunk/dist/game/data/stats/chars/baseStats/YulTrickster.xml index 54f74c2fec..be305f7344 100644 --- a/trunk/dist/game/data/stats/chars/baseStats/YulTrickster.xml +++ b/trunk/dist/game/data/stats/chars/baseStats/YulTrickster.xml @@ -19,10 +19,10 @@ 4 4 - 7 + 5 FIST 300 - 490 + 333 31 18 diff --git a/trunk/dist/game/data/stats/items/08100-08199.xml b/trunk/dist/game/data/stats/items/08100-08199.xml index ccfc5993f3..482b82d0c1 100644 --- a/trunk/dist/game/data/stats/items/08100-08199.xml +++ b/trunk/dist/game/data/stats/items/08100-08199.xml @@ -1699,6 +1699,8 @@ + + diff --git a/trunk/dist/game/data/stats/npcs/19500-19600.xml b/trunk/dist/game/data/stats/npcs/19500-19600.xml index 02e7812621..6757bf1903 100644 --- a/trunk/dist/game/data/stats/npcs/19500-19600.xml +++ b/trunk/dist/game/data/stats/npcs/19500-19600.xml @@ -538,7 +538,7 @@ - + diff --git a/trunk/dist/game/data/stats/npcs/23400-23500.xml b/trunk/dist/game/data/stats/npcs/23400-23500.xml index a82586035d..6505509710 100644 --- a/trunk/dist/game/data/stats/npcs/23400-23500.xml +++ b/trunk/dist/game/data/stats/npcs/23400-23500.xml @@ -1044,38 +1044,118 @@ - + - HUMAN - FEMALE - - + + + + + + ANIMAL + MALE + + + + + + + + - - + + + 370 - + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + - - + + - + - HUMAN - FEMALE - - + + + + + + ANIMAL + MALE + + + + + + + + - - + + + 370 - + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + - - + + @@ -1095,72 +1175,232 @@ - + - HUMAN - FEMALE - - + + + + + + ANIMAL + MALE + + + + + + + + - - + + + 370 - + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + - - + + - + - HUMAN - FEMALE - - + + + + + + ANIMAL + MALE + + + + + + + + - - + + + 370 - + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + - - + + - + - HUMAN - FEMALE - - + + + + + + ANIMAL + MALE + + + + + + + + - - + + + 370 - + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + - - + + - + - HUMAN - FEMALE - - + + + + + + ANIMAL + MALE + + + + + + + + - - + + + 370 - + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + - - + + @@ -1588,21 +1828,61 @@ - + - HUMAN - FEMALE - - + + + + + + ANIMAL + MALE + + + + + + + + - - + + + 370 - + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + - - + + @@ -1622,21 +1902,61 @@ - + - HUMAN - FEMALE - - + + + + + + ANIMAL + MALE + + + + + + + + - - + + + 370 - + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + - - + + diff --git a/trunk/dist/game/data/stats/skills/00000-00099.xml b/trunk/dist/game/data/stats/skills/00000-00099.xml index 1ef23cb5de..5eba4c8060 100644 --- a/trunk/dist/game/data/stats/skills/00000-00099.xml +++ b/trunk/dist/game/data/stats/skills/00000-00099.xml @@ -571,8 +571,9 @@ - + + @@ -933,7 +934,10 @@ - + + + + diff --git a/trunk/dist/game/data/stats/skills/00200-00299.xml b/trunk/dist/game/data/stats/skills/00200-00299.xml index 892416575d..5c66d1704d 100644 --- a/trunk/dist/game/data/stats/skills/00200-00299.xml +++ b/trunk/dist/game/data/stats/skills/00200-00299.xml @@ -2496,7 +2496,10 @@ - + + + + @@ -3029,8 +3032,9 @@ - + + diff --git a/trunk/dist/game/data/stats/skills/00300-00399.xml b/trunk/dist/game/data/stats/skills/00300-00399.xml index 932935ace5..d6ebd61811 100644 --- a/trunk/dist/game/data/stats/skills/00300-00399.xml +++ b/trunk/dist/game/data/stats/skills/00300-00399.xml @@ -18,7 +18,10 @@ - + + + + diff --git a/trunk/dist/game/data/stats/skills/00400-00499.xml b/trunk/dist/game/data/stats/skills/00400-00499.xml index b02d2b24a2..679d0b36c0 100644 --- a/trunk/dist/game/data/stats/skills/00400-00499.xml +++ b/trunk/dist/game/data/stats/skills/00400-00499.xml @@ -1758,8 +1758,9 @@ - + + diff --git a/trunk/dist/game/data/stats/skills/00700-00799.xml b/trunk/dist/game/data/stats/skills/00700-00799.xml index 2cf8e99e41..2dc1226a42 100644 --- a/trunk/dist/game/data/stats/skills/00700-00799.xml +++ b/trunk/dist/game/data/stats/skills/00700-00799.xml @@ -318,7 +318,10 @@ - + + + + diff --git a/trunk/dist/game/data/stats/skills/00900-00999.xml b/trunk/dist/game/data/stats/skills/00900-00999.xml index a364c532a4..ebfa813e0b 100644 --- a/trunk/dist/game/data/stats/skills/00900-00999.xml +++ b/trunk/dist/game/data/stats/skills/00900-00999.xml @@ -336,7 +336,10 @@ - + + + + @@ -1067,7 +1070,7 @@ - + @@ -2420,4 +2423,4 @@ - \ No newline at end of file + diff --git a/trunk/dist/game/data/stats/skills/01100-01199.xml b/trunk/dist/game/data/stats/skills/01100-01199.xml index bd82e300cd..80099374f3 100644 --- a/trunk/dist/game/data/stats/skills/01100-01199.xml +++ b/trunk/dist/game/data/stats/skills/01100-01199.xml @@ -269,7 +269,10 @@ - + + + + @@ -386,7 +389,10 @@ - + + + + @@ -423,7 +429,10 @@ - + + + + @@ -789,7 +798,10 @@ - + + + + diff --git a/trunk/dist/game/data/stats/skills/01200-01299.xml b/trunk/dist/game/data/stats/skills/01200-01299.xml index f1d3aa49b5..5e04df93ea 100644 --- a/trunk/dist/game/data/stats/skills/01200-01299.xml +++ b/trunk/dist/game/data/stats/skills/01200-01299.xml @@ -650,7 +650,10 @@ - + + + + @@ -692,7 +695,10 @@ - + + + + @@ -731,7 +737,10 @@ - + + + + @@ -770,7 +779,10 @@ - + + + + @@ -2682,7 +2694,10 @@ - + + + + @@ -2721,7 +2736,10 @@ - + + + + @@ -2760,7 +2778,10 @@ - + + + + diff --git a/trunk/dist/game/data/stats/skills/01300-01399.xml b/trunk/dist/game/data/stats/skills/01300-01399.xml index 5beaaadf30..a27d1242b7 100644 --- a/trunk/dist/game/data/stats/skills/01300-01399.xml +++ b/trunk/dist/game/data/stats/skills/01300-01399.xml @@ -795,7 +795,10 @@ - + + + + @@ -834,7 +837,10 @@ - + + + + @@ -873,7 +879,10 @@ - + + + + @@ -912,7 +921,10 @@ - + + + + diff --git a/trunk/dist/game/data/stats/skills/01400-01499.xml b/trunk/dist/game/data/stats/skills/01400-01499.xml index 30e58a4e31..a1256f2107 100644 --- a/trunk/dist/game/data/stats/skills/01400-01499.xml +++ b/trunk/dist/game/data/stats/skills/01400-01499.xml @@ -268,7 +268,10 @@ - + + + + @@ -305,7 +308,10 @@ - + + + + @@ -344,7 +350,10 @@ - + + + + diff --git a/trunk/dist/game/data/stats/skills/01900-01999.xml b/trunk/dist/game/data/stats/skills/01900-01999.xml index 9558d571c9..ac7a94497c 100644 --- a/trunk/dist/game/data/stats/skills/01900-01999.xml +++ b/trunk/dist/game/data/stats/skills/01900-01999.xml @@ -561,95 +561,183 @@ - - - + 1.01 1.02 1.03 1.04
+ 1.01 1.03 1.04 1.06
+ + + + + + + + +
- - - + 1.01 1.02 1.03 1.04
+ + + + + + + + +
- - - + 1.01 1.02 1.03 1.04
+ + + + + + + + +
- - - + 10 20 30 40
+ + + + + + + + +
- - - + 2 4 6 8
+ + + + + + + + +
- - - + 2 4 6 8
+ + + + + + + + +
- - - + 1.03 1.06 1.09 1.12
+ 1.04 1.09 1.13 1.18
+ + + + + + + + +
- - - + 1.03 1.06 1.09 1.12
+ + + + + + + + +
- - - + 1.03 1.06 1.09 1.12
+ + + + + + + + +
- - - + 1.06 1.12 1.18 1.24
+ + + + + + + +
- - - + 1.06 1.12 1.18 1.24
+ + + + + + + +
- - - + 1.06 1.12 1.18 1.24
+ + + + + + + +
- - - + + + + + + + + @@ -659,96 +747,192 @@ - - - + + + + + + + + + + - - - + + + + + + + + + + - - - - + + + + + + + + + + - - - + + + + + + + + + + + - - - + + + + + + + + + + + + + + - - - + + + + + + + + - - - + + + + + + + + + + + + + + - - - + - + + + + + + + + + + - - - + + + + + + + + + + + + + + - - - + + + + + + + + + + - - - + + + + + + + + + + + + + + - - - + + + + + + + + diff --git a/trunk/dist/game/data/stats/skills/05100-05199.xml b/trunk/dist/game/data/stats/skills/05100-05199.xml index bcacc162f8..ae981a16c5 100644 --- a/trunk/dist/game/data/stats/skills/05100-05199.xml +++ b/trunk/dist/game/data/stats/skills/05100-05199.xml @@ -585,7 +585,9 @@ - + + + @@ -599,7 +601,9 @@ - + + + @@ -613,7 +617,9 @@ - + + + @@ -627,7 +633,9 @@ - + + + @@ -848,8 +856,8 @@ - + diff --git a/trunk/dist/game/data/stats/skills/07000-07099.xml b/trunk/dist/game/data/stats/skills/07000-07099.xml index 393b61ccab..4460c3715a 100644 --- a/trunk/dist/game/data/stats/skills/07000-07099.xml +++ b/trunk/dist/game/data/stats/skills/07000-07099.xml @@ -292,7 +292,7 @@ - + @@ -313,7 +313,7 @@ - + @@ -334,7 +334,7 @@ - + diff --git a/trunk/dist/game/data/stats/skills/08200-08299.xml b/trunk/dist/game/data/stats/skills/08200-08299.xml index 05d024556c..04f7171335 100644 --- a/trunk/dist/game/data/stats/skills/08200-08299.xml +++ b/trunk/dist/game/data/stats/skills/08200-08299.xml @@ -1213,7 +1213,7 @@ - + diff --git a/trunk/dist/game/data/stats/skills/11000-11099.xml b/trunk/dist/game/data/stats/skills/11000-11099.xml index 82083f7f40..5903d4dca2 100644 --- a/trunk/dist/game/data/stats/skills/11000-11099.xml +++ b/trunk/dist/game/data/stats/skills/11000-11099.xml @@ -12,47 +12,159 @@ - - + + 88 94 99 105 110 115 121 126 132 137
+ 111 117 124 131 138 144 151 158 164 171
+ + - + + + + + + + + + + + + + + + + + + + + + +
- - + + 77 81 86 90 95 100 104 109 113 118
+ 320 340 360 380 400 420 440 460 480 500
+ + - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- + 146 154 162 170 178 186 194 202 210 218
+ + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- + + - + + + + + + + + + + - - + + + + + + + + + + + + - + + - + + + + + + + + diff --git a/trunk/dist/game/data/stats/skills/11700-11799.xml b/trunk/dist/game/data/stats/skills/11700-11799.xml index 530d04c9ba..ad7d87f712 100644 --- a/trunk/dist/game/data/stats/skills/11700-11799.xml +++ b/trunk/dist/game/data/stats/skills/11700-11799.xml @@ -87,45 +87,76 @@ - 138 138 141 143 146 148 151 153
+ 1488 1495 1507 1519 1532 1544 1557 1570
+ 467 484 500 516 530 544 556 559
+ 85 86 88 90 92 94 96 98
- + + + + + + + + +
- + 1488 1495 1507 1519 1532 1544 1557 1570
207 208 212 216 218 222 226 230
+ 437 444 450 456 462 468 473 479
+ 85 86 88 90 92 94 96 98
- + + + + + + + + +
- + 1191 1200 1210 1220 1230 1240 1250 1261
+ 431 467 500 530 556 566 576 586
277 281 286 290 295 300 305 310
+ 85 87 89 91 93 95 97 99
- + + + + + + + + + +
@@ -178,29 +209,49 @@ - - - - - + + + + + + + + + - + + + + + + + + - - - - - + + + + + + + + - + + + + + + + @@ -255,16 +306,33 @@ - + - + + + + + + + + + + + + + + + + + + @@ -442,18 +510,31 @@ - - 35 38 42 46
- - - - + 35 38 42 46
+ 85 90 95 100
+ 85 90 95 99
+ 147 142 137 132 127 122 117 112 108 103
+ - + + + + + + + + + + + + + + +
diff --git a/trunk/dist/game/data/stats/skills/11800-11899.xml b/trunk/dist/game/data/stats/skills/11800-11899.xml index 5188ac68cf..0009d28de0 100644 --- a/trunk/dist/game/data/stats/skills/11800-11899.xml +++ b/trunk/dist/game/data/stats/skills/11800-11899.xml @@ -282,16 +282,29 @@ - - - - - + + + + + + + + + + + - + + + + + + + + @@ -301,16 +314,26 @@ - - - - - + + + + + + + + + - + + + + + + + @@ -401,30 +424,59 @@ - 185 205 225 243
+ 85 90 95 99
+ 50 60 70 100
- + + + + + + + + + + + + + +
- - 185 205 225 243
- + 4 5 6 7
+ 1.05 1.07 1.1 1.15
+ 85 90 95 99
+ 37 41 45 49
+ 185 205 225 243
+ + + + - - + + + + + + + + + + +
diff --git a/trunk/dist/game/data/stats/skills/21200-21299.xml b/trunk/dist/game/data/stats/skills/21200-21299.xml index bc65c7d22b..fb3a3989e9 100644 --- a/trunk/dist/game/data/stats/skills/21200-21299.xml +++ b/trunk/dist/game/data/stats/skills/21200-21299.xml @@ -632,10 +632,24 @@ - + - - + + + + + + + + + + + + + + + + diff --git a/trunk/dist/game/data/teleporters/TeleportDevice-Elven.xml b/trunk/dist/game/data/teleporters/TeleportDevice-Elven.xml new file mode 100644 index 0000000000..a25852e071 --- /dev/null +++ b/trunk/dist/game/data/teleporters/TeleportDevice-Elven.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/teleporters/TeleportDevice-Kamael.xml b/trunk/dist/game/data/teleporters/TeleportDevice-Kamael.xml new file mode 100644 index 0000000000..d50dfd7ffd --- /dev/null +++ b/trunk/dist/game/data/teleporters/TeleportDevice-Kamael.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trunk/dist/game/data/xsd/skills.xsd b/trunk/dist/game/data/xsd/skills.xsd index 201a413fc2..9257f1a153 100644 --- a/trunk/dist/game/data/xsd/skills.xsd +++ b/trunk/dist/game/data/xsd/skills.xsd @@ -45,7 +45,9 @@ - + + + @@ -53,8 +55,8 @@ - - + + diff --git a/trunk/dist/tools/sql/game/announcements.sql b/trunk/dist/tools/sql/game/announcements.sql index fa110f077e..f87fd4772a 100644 --- a/trunk/dist/tools/sql/game/announcements.sql +++ b/trunk/dist/tools/sql/game/announcements.sql @@ -9,4 +9,5 @@ CREATE TABLE IF NOT EXISTS `announcements` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -INSERT INTO announcements (`type`, `author`, `content`) VALUES (0, 'Mobius', 'Powered by www.l2jmobius.com'); \ No newline at end of file +INSERT INTO announcements (`type`, `author`, `content`) VALUES +(0, 'Mobius', 'Powered by www.l2jmobius.com'); \ No newline at end of file diff --git a/trunk/dist/tools/sql/game/character_summons.sql b/trunk/dist/tools/sql/game/character_summons.sql index 8e9e0245e4..1f0b693009 100644 --- a/trunk/dist/tools/sql/game/character_summons.sql +++ b/trunk/dist/tools/sql/game/character_summons.sql @@ -1,5 +1,6 @@ CREATE TABLE IF NOT EXISTS `character_summons` ( `ownerId` int(10) unsigned NOT NULL, + `summonId` int(10) unsigned NOT NULL, `summonSkillId` int(10) unsigned NOT NULL, `curHp` int(9) unsigned DEFAULT '0', `curMp` int(9) unsigned DEFAULT '0', diff --git a/trunk/dist/tools/sql/game/spawnlist.sql b/trunk/dist/tools/sql/game/spawnlist.sql index 1d0db14ae2..ae47c4fe06 100644 --- a/trunk/dist/tools/sql/game/spawnlist.sql +++ b/trunk/dist/tools/sql/game/spawnlist.sql @@ -1635,106 +1635,14 @@ INSERT INTO `spawnlist` VALUES ("Kamael Island", 1, 22242, -103050, 46123, -1144, 0, 0, 51177, 60, 0, 0, 0), ("Kamael Island", 1, 22242, -103366, 46353, -1144, 0, 0, 3895, 60, 0, 0, 0), ("Kamael Island", 1, 22242, -102373, 46844, -1128, 0, 0, 63341, 60, 0, 0, 0), --- Lottery Ticket Seller -("unset", 1, 30990, -117079, 47175, 448, 0, 0, 16384, 60, 0, 0, 0), --- Grand Olympiad Manager -("unset", 1, 31688, -115008, 47488, 496, 0, 0, 37504, 60, 0, 0, 0), --- Monument of Heroes -("unset", 1, 31690, -114991, 47563, 496, 0, 0, 32768, 60, 0, 0, 0), --- Mr. Cat -("Kamael Village", 1, 31756, -116948, 46841, 360, 0, 0, 3355, 60, 0, 0, 0), --- Miss Queen -("Kamael Village", 1, 31757, -116902, 46841, 360, 0, 0, 49151, 60, 0, 0, 0), -- Perwan ("unset", 1, 32133, -125872, 38208, 1232, 0, 0, 0, 60, 0, 0, 0), -- Newbie Helper ("unset", 1, 32134, -125872, 38016, 1232, 0, 0, 0, 60, 0, 0, 0), --- Newbie Helper -("unset", 1, 32135, -119692, 44504, 360, 0, 0, 33324, 60, 0, 0, 0), -- Basil ("unset", 1, 32136, -122400, 38432, 1440, 0, 0, 0, 60, 0, 0, 0), -- Sucrete ("unset", 1, 32137, -122396, 37784, 1432, 0, 0, 0, 60, 0, 0, 0), --- Kekropus -("unset", 1, 32138, -118080, 42835, 712, 0, 0, 15964, 60, 0, 0, 0), --- Casca -("unset", 1, 32139, -118132, 42788, 712, 0, 0, 17008, 60, 0, 0, 0), --- Zenya -("unset", 1, 32140, -118028, 42778, 712, 0, 0, 16688, 60, 0, 0, 0), --- Nerga -("unset", 1, 32141, -119104, 43280, 544, 0, 0, 0, 60, 0, 0, 0), --- Tenor -("unset", 1, 32142, -119104, 43152, 544, 0, 0, 0, 60, 0, 0, 0), --- Belkis -("unset", 1, 32143, -117056, 43168, 544, 0, 0, 33556, 60, 0, 0, 0), --- Xonia -("unset", 1, 32144, -117060, 43296, 544, 0, 0, 32568, 60, 0, 0, 0), --- Maynard -("unset", 1, 32145, -118192, 42384, 824, 0, 0, 16400, 60, 0, 0, 0), --- Valfar -("unset", 1, 32146, -117968, 42384, 824, 0, 0, 15880, 60, 0, 0, 0), --- Rivian -("unset", 1, 32147, -120400, 46921, 400, 0, 0, 0, 60, 0, 0, 0), --- Cindet -("unset", 1, 32148, -120407, 46755, 408, 0, 0, 0, 60, 0, 0, 0), --- Ennear -("unset", 1, 32149, -120442, 47125, 408, 0, 0, 0, 60, 0, 0, 0), --- Took -("unset", 1, 32150, -120294, 46013, 384, 0, 0, 16416, 60, 0, 0, 0), --- Herz -("unset", 1, 32151, -120157, 45813, 344, 0, 0, 16416, 60, 0, 0, 0), --- Henri -("unset", 1, 32152, -120158, 46221, 344, 0, 0, 49252, 60, 0, 0, 0), --- Franco -("unset", 1, 32153, -120432, 45296, 408, 0, 0, 45056, 60, 0, 0, 0), --- Aldenia -("unset", 1, 32154, -120706, 45079, 408, 0, 0, 6956, 60, 0, 0, 0), --- Nabot -("unset", 1, 32155, -120356, 45293, 408, 0, 0, 45392, 60, 0, 0, 0), --- Talbot -("unset", 1, 32156, -120604, 44960, 408, 0, 0, 24308, 60, 0, 0, 0), --- Moka -("unset", 1, 32157, -117824, 48080, 464, 0, 0, 50060, 60, 0, 0, 0), --- Fisler -("unset", 1, 32158, -117605, 48079, 456, 0, 0, 43644, 60, 0, 0, 0), --- Kincaid -("unset", 1, 32159, -118030, 47930, 456, 0, 0, 0, 60, 0, 0, 0), --- Devon -("unset", 1, 32160, -118720, 48062, 464, 0, 0, 49308, 60, 0, 0, 0), --- Black -("unset", 1, 32161, -118527, 47955, 464, 0, 0, 32936, 60, 0, 0, 0), --- Martika -("unset", 1, 32162, -118918, 47956, 464, 0, 0, 0, 60, 0, 0, 0), --- Teleport Device -("unset", 1, 32163, -116879, 46591, 360, 0, 0, 44352, 60, 0, 0, 0), --- Erinu -("unset", 1, 32164, -115888, 43568, 524, 0, 0, 8372, 60, 0, 0, 0), --- Zakone -("unset", 1, 32165, -115486, 43567, 525, 0, 0, 24616, 60, 0, 0, 0), --- Trevor -("unset", 1, 32166, -116749, 48077, 462, 0, 0, 41732, 60, 0, 0, 0), --- Nika -("unset", 1, 32167, -117153, 48075, 456, 0, 0, 58116, 60, 0, 0, 0), --- Benis -("unset", 1, 32170, -114975, 44658, 512, 0, 0, 15332, 60, 0, 0, 0), --- Hoffa -("unset", 1, 32171, -114802, 44821, 524, 0, 0, 32144, 60, 0, 0, 0), --- Saylem -("unset", 1, 32172, -114801, 45031, 525, 0, 0, 32164, 60, 0, 0, 0), --- Marcela -("unset", 1, 32173, -119378, 49242, 8, 0, 0, 32812, 60, 0, 0, 0), --- Maddy -("unset", 1, 32174, -119774, 49245, 8, 0, 0, 0, 60, 0, 0, 0), --- Bixon -("unset", 1, 32175, -119830, 51860, -792, 0, 0, 2960, 60, 0, 0, 0), --- Ambra -("unset", 1, 32176, -119362, 51862, -792, 0, 0, 31496, 60, 0, 0, 0), --- Syzar -("unset", 1, 32177, -112872, 46850, 48, 0, 0, 8944, 60, 0, 0, 0), --- Carver -("unset", 1, 32178, -112352, 47392, 48, 0, 0, 41568, 60, 0, 0, 0), --- Putin -("unset", 1, 32179, -110544, 49040, -1128, 0, 0, 63440, 60, 0, 0, 0), -- Kato ("unset", 1, 32180, -110536, 45162, -1128, 0, 0, 3072, 60, 0, 0, 0), -- Hanarin @@ -1755,22 +1663,6 @@ INSERT INTO `spawnlist` VALUES ("Kamael Island", 1, 32335, -122260, 60127, -2392, 0, 0, 38351, 60, 0, 0, 0), ("Kamael Island", 1, 32335, -122074, 56592, -1976, 0, 0, 6659, 60, 0, 0, 0), ("Kamael Island", 1, 32335, -117290, 50962, -744, 0, 0, 6996, 60, 0, 0, 0), --- Adventure Guildsman -("unset", 1, 32337, -119808, 47760, 384, 0, 0, 0, 60, 0, 0, 0), --- Adventure Guildsman -("unset", 1, 32338, -120048, 45296, 392, 0, 0, 0, 60, 0, 0, 0), --- Adventure Guildsman -("unset", 1, 32339, -115680, 44144, 496, 0, 0, 17712, 60, 0, 0, 0), --- Adventure Guildsman -("unset", 1, 32340, -115088, 46784, 496, 0, 0, 32964, 60, 0, 0, 0), --- Burang -("unset", 1, 32348, -116944, 48144, 456, 0, 0, 49152, 60, 0, 0, 0), --- Eindburgh -("Kamael Village", 1, 32469, -111519, 41742, 2175, 0, 0, 31385, 60, 0, 0, 0), --- Dimensional Merchant -("unset", 1, 32478, -115215, 45059, 496, 0, 0, 32768, 60, 0, 0, 0), --- Manor Manager -("unset", 1, 36456, -115169, 44156, 512, 0, 0, 25360, 60, 0, 0, 0), -- [16_20] @@ -17496,117 +17388,6 @@ INSERT INTO `spawnlist` VALUES ("Elven_Village", 1, 27017, 34721, 36156, -3640, 0, 0, 0, 30, 0, 0, 0), -- Kracha ("Elven_Village", 1, 27060, 36910, 61471, -3616, 0, 0, 0, 180, 0, 0, 0), --- Teleport Device -("Elven_Village_Npc", 1, 30146, 46926, 51511, -2976, 0, 0, 43000, 60, 0, 0, 0), --- Unoren -("Elven_Village_Npc", 1, 30147, 44667, 46896, -2982, 0, 0, 31000, 60, 0, 0, 0), --- Ariel -("Elven_Village_Npc", 1, 30148, 44683, 46952, -2981, 0, 0, 28672, 60, 0, 0, 0), --- Creamees -("Elven_Village_Npc", 1, 30149, 42700, 50057, -2984, 0, 0, 14500, 60, 0, 0, 0), --- Herbiel -("Elven_Village_Npc", 1, 30150, 42766, 50037, -2984, 0, 0, 11500, 60, 0, 0, 0), --- Chad -("Elven_Village_Npc", 1, 30151, 47868, 50167, -2983, 0, 0, 50000, 60, 0, 0, 0), --- Julia -("Elven_Village_Npc", 1, 30152, 47912, 50170, -2983, 0, 0, 50000, 60, 0, 0, 0), --- Markius -("Elven_Village_Npc", 1, 30153, 47780, 49568, -2984, 0, 0, 4096, 60, 0, 0, 0), --- Asterios -("Elven_Village_Npc", 1, 30154, 44692, 52261, -2792, 0, 0, 0, 60, 0, 0, 0), --- Ellenia -("Elven_Village_Npc", 1, 30155, 45725, 52105, -2792, 0, 0, 16384, 60, 0, 0, 0), --- Esrandell -("Elven_Village_Npc", 1, 30156, 44823, 52414, -2792, 0, 0, 49152, 60, 0, 0, 0), --- Greenis -("Elven_Village_Npc", 1, 30157, 45000, 52101, -2792, 0, 0, 16384, 60, 0, 0, 0), --- Esrandell -("Elven_Village_Npc", 1, 30158, 45919, 52414, -2792, 0, 0, 49152, 60, 0, 0, 0), --- Wheeler -("Elven_Village_Npc", 1, 30216, 45778, 46534, -2992, 0, 0, 40960, 60, 0, 0, 0), --- Berros -("Elven_Village_Npc", 1, 30217, 45487, 46511, -2992, 0, 0, 57344, 60, 0, 0, 0), --- Kendell -("Elven_Village_Npc", 1, 30218, 47595, 51569, -2992, 0, 0, 16384, 60, 0, 0, 0), --- Veltress -("Elven_Village_Npc", 1, 30219, 47401, 51764, -2992, 0, 0, 0, 60, 0, 0, 0), --- Starden -("Elven_Village_Npc", 1, 30220, 42971, 51372, -2992, 0, 0, 32768, 60, 0, 0, 0), --- Rayen -("Elven_Village_Npc", 1, 30221, 42812, 51138, -2992, 0, 0, 16384, 60, 0, 0, 0), --- Alshupes -("Elven_Village_Npc", 1, 30222, 45859, 50827, -3056, 0, 0, 45056, 60, 0, 0, 0), --- Arujien -("Elven_Village_Npc", 1, 30223, 42978, 49115, -2992, 0, 0, 0, 60, 0, 0, 0), --- Alberius -("Elven_Village_Npc", 1, 30284, 45727, 51721, -2800, 0, 0, 49152, 60, 0, 0, 0), --- Gartrandell -("Elven_Village_Npc", 1, 30285, 44995, 51706, -2800, 0, 0, 49352, 60, 0, 0, 0), --- Rizraell -("Elven_Village_Npc", 1, 30361, 45610, 49008, -3056, 0, 0, 53248, 60, 0, 0, 0), --- Andellia -("Elven_Village_Npc", 1, 30362, 46475, 50495, -3056, 0, 0, 61440, 60, 0, 0, 0), --- Aios -("Elven_Village_Npc", 1, 30363, 44476, 47153, -2984, 0, 0, 46000, 60, 0, 0, 0), --- Nerupa -("Elven_Village_Npc", 1, 30370, 46048, 41200, -3504, 0, 0, 17000, 60, 0, 0, 0), --- Newbie Helper -("Elven_Village_Npc", 1, 30400, 46112, 41200, -3504, 0, 0, 17000, 60, 0, 0, 0), --- Rosella -("Elven_Village_Npc", 1, 30414, 43673, 49683, -3048, 0, 0, 0, 60, 0, 0, 0), --- Newbie Helper -("Elven_Village_Npc", 1, 30599, 45475, 48359, -3056, 0, 0, 49152, 60, 0, 0, 0), --- Lottery Ticket Seller -("Elven_Village_Npc", 1, 30991, 46960, 51506, -2976, 0, 0, 47000, 60, 0, 0, 0), --- Broadcasting Tower -("Elven_Village_Npc", 1, 31031, 46450, 50822, -3056, 0, 0, 16384, 5, 0, 0, 0), --- Sentinel -("Elven_Village_Npc", 1, 31033, 48885, 44208, -3504, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31033, 39175, 37179, -3608, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31033, 49442, 55892, -3448, 0, 0, 14536, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31033, 38222, 44301, -3648, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31033, 43649, 59039, -3632, 0, 0, 0, 60, 0, 0, 0), --- Kasiel -("Elven_Village", 1, 31358, 43936, 51092, -2994, 0, 0, 0, 60, 0, 0, 0), --- Jaradine -("Elven_Village", 1, 31359, 44947, 50556, -3056, 0, 0, 0, 60, 0, 0, 0), --- Perelin -("Elven_Village_Npc", 1, 31563, 42672, 50352, -2984, 0, 0, 63500, 60, 0, 0, 0), --- Grand Olympiad Manager -("Elven_Village_Npc", 1, 31688, 44652, 50972, -3056, 0, 0, 49000, 60, 0, 0, 0), --- Mr. Cat -("Elven Village", 1, 31756, 45472, 49312, -3067, 0, 0, 53000, 60, 0, 0, 0), -("Elven Village", 1, 31756, 47648, 51296, -2989, 0, 0, 38500, 60, 0, 0, 0), --- Miss Queen -("Elven Village", 1, 31757, 45414, 49296, -3067, 0, 0, 53000, 60, 0, 0, 0), -("Elven Village", 1, 31757, 47680, 51255, -2989, 0, 0, 38500, 60, 0, 0, 0), --- Monument of Heroes -("Elven_Village_Npc", 1, 31769, 44602, 50979, -3056, 0, 0, 49000, 60, 0, 0, 0), --- Adventure Guildsman -("Elven_Village_Npc", 1, 31780, 45443, 48357, -3056, 0, 0, 50000, 60, 0, 0, 0), --- Adventure Guildsman -("Elven_Village_Npc", 1, 31781, 43136, 51376, -2992, 0, 0, 59000, 60, 0, 0, 0), --- Pixy -("Elven_Village_Npc", 1, 31848, 44336, 45127, -3704, 0, 0, 4676, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31848, 48468, 37228, -3568, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31848, 53396, 54646, -3480, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31848, 47891, 45145, -3680, 0, 0, 28372, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31848, 52948, 64124, -3472, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31848, 36370, 52378, -3520, 0, 0, 47819, 60, 0, 0, 0), --- Treant -("Elven_Village_Npc", 1, 31851, 43496, 38808, -3488, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31851, 50944, 38828, -3520, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31851, 56274, 53431, -3592, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31851, 50640, 60470, -3440, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31851, 57036, 62656, -3360, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31851, 42211, 58300, -3664, 0, 0, 0, 60, 0, 0, 0), -("Elven_Village_Npc", 1, 31851, 35592, 57852, -3680, 0, 0, 0, 60, 0, 0, 0), --- Pixy Murika -("Elven_Village_Npc", 1, 31852, 49262, 53607, -3216, 0, 0, 53248, 60, 0, 0, 0), --- Treant Bremec -("Elven_Village_Npc", 1, 31853, 50592, 54896, -3352, 0, 0, 40960, 60, 0, 0, 0), --- Dimensional Merchant -("Elven_Village_Npc", 1, 32478, 47600, 49920, -2992, 0, 0, 33500, 60, 0, 0, 0), -- ("oren03_npc2119_01", 1, 32529, 46199, 39120, -3511, 0, 0, 0, 60, 0, 0, 0), ("oren03_npc2119_02", 1, 32529, 46723, 39231, -3511, 0, 0, 0, 60, 0, 0, 0), @@ -17628,8 +17409,6 @@ INSERT INTO `spawnlist` VALUES ("oren03_npc2119_18", 1, 32529, 46216, 39585, -3510, 0, 0, 0, 60, 0, 0, 0), ("oren03_npc2119_19", 1, 32529, 46139, 41117, -3508, 0, 0, 0, 60, 0, 0, 0), ("oren03_npc2119_20", 1, 32529, 45580, 40728, -3509, 0, 0, 0, 60, 0, 0, 0), --- Manor Manager -("Elven_Village_Npc", 1, 35230, 43849, 50558, -3056, 0, 0, 1448, 60, 0, 0, 0), -- [21_20] @@ -42469,7 +42248,14 @@ INSERT INTO `spawnlist` VALUES ('21_16', 1, 31757, 44294, -47642, -792, 0, 0, 50000, 60, 0, 0, 0), -- Miss Queen -- New Orc Village ('18_14', 1, 30994, -45266, -112468, -240, 0, 0, 500, 60, 0, 0, 0), -- Lottery Ticket Seller -('18_14', 1, 30576, -43964, -113389, -232, 0, 0, 0, 60, 0, 0, 0); -- Teleport Device +('18_14', 1, 30576, -43964, -113389, -232, 0, 0, 0, 60, 0, 0, 0), -- Teleport Device +-- New Elven Village +('21_19', 1, 30146, 45173, 48889, -3056, 0, 0, 0, 60, 0, 0, 0), -- Teleport Device +('21_19', 1, 33786, 45256, 49556, -3064, 0, 0, 27964, 60, 0, 0, 0), -- Mother Tree +('21_19', 1, 30991, 46960, 51506, -2976, 0, 0, 47000, 60, 0, 0, 0), -- Lottery Ticket Seller +-- New Kamael Village +('16_19', 1, 32163, -116882, 46565, 360, 0, 0, 0, 60, 0, 0, 0), -- Teleport Device +('16_19', 1, 30990, -117079, 47175, 448, 0, 0, 16384, 60, 0, 0, 0); -- Lottery Ticket Seller -- Dr. Chaos DELETE FROM spawnlist WHERE (npc_templateid = 32033); @@ -42477,3 +42263,4 @@ DELETE FROM spawnlist WHERE (npc_templateid = 32033); -- Faeron NPC correct Z value UPDATE spawnlist SET locz=-3289 WHERE npc_templateid=33937; UPDATE spawnlist SET locz=-3360 WHERE npc_templateid=33943; + diff --git a/trunk/java/com/l2jserver/Config.java b/trunk/java/com/l2jserver/Config.java index e47fccd315..d902b0e9a1 100644 --- a/trunk/java/com/l2jserver/Config.java +++ b/trunk/java/com/l2jserver/Config.java @@ -58,7 +58,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.enums.IllegalActionPunishmentType; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.Location; @@ -156,7 +156,6 @@ public final class Config public static boolean DIVINE_SP_BOOK_NEEDED; public static boolean ALT_GAME_SKILL_LEARN; public static boolean ALT_GAME_SUBCLASS_WITHOUT_QUESTS; - public static boolean ALT_GAME_SUBCLASS_EVERYWHERE; public static boolean ALLOW_TRANSFORM_WITHOUT_QUEST; public static int FEE_DELETE_TRANSFER_SKILLS; public static int FEE_DELETE_SUBCLASS_SKILLS; @@ -174,6 +173,7 @@ public final class Config public static int MAX_ABNORMAL_STATE_SUCCESS_RATE; public static byte MAX_SUBCLASS; public static byte BASE_SUBCLASS_LEVEL; + public static byte BASE_DUALCLASS_LEVEL; public static byte MAX_SUBCLASS_LEVEL; public static int MAX_PVTSTORESELL_SLOTS_DWARF; public static int MAX_PVTSTORESELL_SLOTS_OTHER; @@ -468,7 +468,6 @@ public final class Config public static boolean HTML_ACTION_CACHE_DEBUG; public static boolean PACKET_HANDLER_DEBUG; public static boolean DEVELOPER; - public static boolean ACCEPT_GEOEDITOR_CONN; public static boolean ALT_DEV_NO_HANDLERS; public static boolean ALT_DEV_NO_QUESTS; public static boolean ALT_DEV_NO_SPAWNS; @@ -1179,9 +1178,8 @@ public final class Config public static int CHS_FAME_FREQUENCY; // GeoData Settings - public static int GEODATA; + public static int PATHFINDING; public static File PATHNODE_DIR; - public static boolean GEODATA_CELLFINDING; public static String PATHFIND_BUFFERS; public static float LOW_WEIGHT; public static float MEDIUM_WEIGHT; @@ -1583,7 +1581,6 @@ public final class Config DIVINE_SP_BOOK_NEEDED = Character.getBoolean("DivineInspirationSpBookNeeded", true); ALT_GAME_SKILL_LEARN = Character.getBoolean("AltGameSkillLearn", false); ALT_GAME_SUBCLASS_WITHOUT_QUESTS = Character.getBoolean("AltSubClassWithoutQuests", false); - ALT_GAME_SUBCLASS_EVERYWHERE = Character.getBoolean("AltSubclassEverywhere", false); RESTORE_SERVITOR_ON_RECONNECT = Character.getBoolean("RestoreServitorOnReconnect", true); RESTORE_PET_ON_RECONNECT = Character.getBoolean("RestorePetOnReconnect", true); ALLOW_TRANSFORM_WITHOUT_QUEST = Character.getBoolean("AltTransformationWithoutQuest", false); @@ -1600,7 +1597,7 @@ public final class Config ALT_VITALITY_HOUR_RESET = Character.getString("AltVitalityHourReset", "06:30:00"); MAX_BONUS_EXP = Character.getDouble("MaxExpBonus", 3.5); MAX_BONUS_SP = Character.getDouble("MaxSpBonus", 3.5); - MAX_RUN_SPEED = Character.getInt("MaxRunSpeed", 250); + MAX_RUN_SPEED = Character.getInt("MaxRunSpeed", 300); MAX_PCRIT_RATE = Character.getInt("MaxPCritRate", 500); MAX_MCRIT_RATE = Character.getInt("MaxMCritRate", 200); MAX_PATK_SPEED = Character.getInt("MaxPAtkSpeed", 1500); @@ -1608,8 +1605,9 @@ public final class Config MAX_EVASION = Character.getInt("MaxEvasion", 250); MIN_ABNORMAL_STATE_SUCCESS_RATE = Character.getInt("MinAbnormalStateSuccessRate", 10); MAX_ABNORMAL_STATE_SUCCESS_RATE = Character.getInt("MaxAbnormalStateSuccessRate", 90); - MAX_SUBCLASS = Character.getByte("MaxSubclass", (byte) 3); + MAX_SUBCLASS = (byte) Math.min(3, Character.getByte("MaxSubclass", (byte) 3)); BASE_SUBCLASS_LEVEL = Character.getByte("BaseSubclassLevel", (byte) 40); + BASE_DUALCLASS_LEVEL = Character.getByte("BaseDualclassLevel", (byte) 85); MAX_SUBCLASS_LEVEL = Character.getByte("MaxSubclassLevel", (byte) 80); MAX_PVTSTORESELL_SLOTS_DWARF = Character.getInt("MaxPvtStoreSellSlotsDwarf", 4); MAX_PVTSTORESELL_SLOTS_OTHER = Character.getInt("MaxPvtStoreSellSlotsOther", 3); @@ -1867,7 +1865,6 @@ public final class Config HTML_ACTION_CACHE_DEBUG = General.getBoolean("HtmlActionCacheDebug", false); PACKET_HANDLER_DEBUG = General.getBoolean("PacketHandlerDebug", false); DEVELOPER = General.getBoolean("Developer", false); - ACCEPT_GEOEDITOR_CONN = General.getBoolean("AcceptGeoeditorConn", false); ALT_DEV_NO_HANDLERS = General.getBoolean("AltDevNoHandlers", false) || Boolean.getBoolean("nohandlers"); ALT_DEV_NO_QUESTS = General.getBoolean("AltDevNoQuests", false) || Boolean.getBoolean("noquests"); ALT_DEV_NO_SPAWNS = General.getBoolean("AltDevNoSpawns", false) || Boolean.getBoolean("nospawns"); @@ -2078,6 +2075,7 @@ public final class Config BOTREPORT_RESETPOINT_HOUR = General.getString("BotReportPointsResetHour", "00:00").split(":"); BOTREPORT_REPORT_DELAY = General.getInt("BotReportDelay", 30) * 60000; BOTREPORT_ALLOW_REPORTS_FROM_SAME_CLAN_MEMBERS = General.getBoolean("AllowReportsFromSameClanMembers", false); + ENABLE_FALLING_DAMAGE = General.getBoolean("EnableFallingDamage", true); // Load FloodProtector L2Properties file final PropertiesParser FloodProtectors = new PropertiesParser(FLOOD_PROTECTOR_FILE); @@ -2974,8 +2972,6 @@ public final class Config final PropertiesParser geoData = new PropertiesParser(GEODATA_FILE); - GEODATA = geoData.getInt("GeoData", 0); - try { PATHNODE_DIR = new File(geoData.getString("PathnodeDirectory", "data/pathnode").replaceAll("\\\\", "/")).getCanonicalFile(); @@ -2986,7 +2982,7 @@ public final class Config PATHNODE_DIR = new File("data/pathnode"); } - GEODATA_CELLFINDING = geoData.getBoolean("CellPathFinding", false); + PATHFINDING = geoData.getInt("PathFinding", 0); PATHFIND_BUFFERS = geoData.getString("PathFindBuffers", "100x6;128x6;192x6;256x4;320x4;384x4;500x2"); LOW_WEIGHT = geoData.getFloat("LowWeight", 0.5f); MEDIUM_WEIGHT = geoData.getFloat("MediumWeight", 2); @@ -3011,9 +3007,6 @@ public final class Config } } } - - String str = General.getString("EnableFallingDamage", "auto"); - ENABLE_FALLING_DAMAGE = "auto".equalsIgnoreCase(str) ? GEODATA > 0 : Boolean.parseBoolean(str); } else if (Server.serverMode == Server.MODE_LOGINSERVER) { @@ -3701,9 +3694,6 @@ public final class Config case "altsubclasswithoutquests": ALT_GAME_SUBCLASS_WITHOUT_QUESTS = Boolean.parseBoolean(pValue); break; - case "altsubclasseverywhere": - ALT_GAME_SUBCLASS_EVERYWHERE = Boolean.parseBoolean(pValue); - break; case "altmemberscanwithdrawfromclanwh": ALT_MEMBERS_CAN_WITHDRAW_FROM_CLANWH = Boolean.parseBoolean(pValue); break; @@ -3992,37 +3982,44 @@ public final class Config public static int getServerTypeId(String[] serverTypes) { - int tType = 0; + int serverType = 0; for (String cType : serverTypes) { switch (cType.trim().toLowerCase()) { - case "Normal": - tType |= 0x01; + case "normal": + serverType |= 0x01; break; - case "Relax": - tType |= 0x02; + case "relax": + serverType |= 0x02; break; - case "Test": - tType |= 0x04; + case "test": + serverType |= 0x04; break; - case "NoLabel": - tType |= 0x08; + case "broad": + serverType |= 0x08; break; - case "Restricted": - tType |= 0x10; + case "restricted": + serverType |= 0x10; break; - case "Event": - tType |= 0x20; + case "event": + serverType |= 0x20; break; - case "Free": - tType |= 0x40; + case "free": + serverType |= 0x40; break; - default: + case "world": + serverType |= 0x100; + break; + case "new": + serverType |= 0x200; + break; + case "classic": + serverType |= 0x400; break; } } - return tType; + return serverType; } public static final class ClassMasterSettings @@ -4225,7 +4222,7 @@ public final class Config return result; } - private static class IPConfigData implements DocumentParser + private static class IPConfigData implements IXmlReader { private static final List _subnets = new ArrayList<>(5); private static final List _hosts = new ArrayList<>(5); diff --git a/trunk/java/com/l2jserver/gameserver/GameServer.java b/trunk/java/com/l2jserver/gameserver/GameServer.java index 2be96a9763..710ea2f82f 100644 --- a/trunk/java/com/l2jserver/gameserver/GameServer.java +++ b/trunk/java/com/l2jserver/gameserver/GameServer.java @@ -38,62 +38,61 @@ import com.l2jserver.L2DatabaseFactory; import com.l2jserver.Server; import com.l2jserver.UPnPService; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.AbilityPointsData; -import com.l2jserver.gameserver.datatables.AdminTable; -import com.l2jserver.gameserver.datatables.AnnouncementsTable; -import com.l2jserver.gameserver.datatables.ArmorSetsData; +import com.l2jserver.gameserver.data.sql.impl.AnnouncementsTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharSummonTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.CrestTable; +import com.l2jserver.gameserver.data.sql.impl.NpcBufferTable; +import com.l2jserver.gameserver.data.sql.impl.OfflineTradersTable; +import com.l2jserver.gameserver.data.sql.impl.SummonSkillsTable; +import com.l2jserver.gameserver.data.sql.impl.TeleportLocationTable; +import com.l2jserver.gameserver.data.xml.impl.AbilityPointsData; +import com.l2jserver.gameserver.data.xml.impl.AdminData; +import com.l2jserver.gameserver.data.xml.impl.ArmorSetsData; +import com.l2jserver.gameserver.data.xml.impl.BeautyShopData; +import com.l2jserver.gameserver.data.xml.impl.BuyListData; +import com.l2jserver.gameserver.data.xml.impl.CategoryData; +import com.l2jserver.gameserver.data.xml.impl.ClassListData; +import com.l2jserver.gameserver.data.xml.impl.DoorData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemHPBonusData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemOptionsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; +import com.l2jserver.gameserver.data.xml.impl.FishData; +import com.l2jserver.gameserver.data.xml.impl.FishingMonstersData; +import com.l2jserver.gameserver.data.xml.impl.FishingRodsData; +import com.l2jserver.gameserver.data.xml.impl.HennaData; +import com.l2jserver.gameserver.data.xml.impl.HitConditionBonusData; +import com.l2jserver.gameserver.data.xml.impl.InitialEquipmentData; +import com.l2jserver.gameserver.data.xml.impl.InitialShortcutData; +import com.l2jserver.gameserver.data.xml.impl.ItemCrystalizationData; +import com.l2jserver.gameserver.data.xml.impl.KarmaData; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; +import com.l2jserver.gameserver.data.xml.impl.OptionData; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; +import com.l2jserver.gameserver.data.xml.impl.PlayerTemplateData; +import com.l2jserver.gameserver.data.xml.impl.PlayerXpPercentLostData; +import com.l2jserver.gameserver.data.xml.impl.RecipeData; +import com.l2jserver.gameserver.data.xml.impl.SecondaryAuthData; +import com.l2jserver.gameserver.data.xml.impl.ShuttleData; +import com.l2jserver.gameserver.data.xml.impl.SiegeScheduleData; +import com.l2jserver.gameserver.data.xml.impl.SkillLearnData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.StaticObjectData; +import com.l2jserver.gameserver.data.xml.impl.TeleportersData; +import com.l2jserver.gameserver.data.xml.impl.TransformData; +import com.l2jserver.gameserver.data.xml.impl.UIData; import com.l2jserver.gameserver.datatables.AugmentationData; -import com.l2jserver.gameserver.datatables.BeautyShopData; import com.l2jserver.gameserver.datatables.BotReportTable; -import com.l2jserver.gameserver.datatables.BuyListData; -import com.l2jserver.gameserver.datatables.CategoryData; -import com.l2jserver.gameserver.datatables.CharNameTable; -import com.l2jserver.gameserver.datatables.CharSummonTable; -import com.l2jserver.gameserver.datatables.CharTemplateTable; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.ClassListData; -import com.l2jserver.gameserver.datatables.CrestTable; -import com.l2jserver.gameserver.datatables.DoorTable; -import com.l2jserver.gameserver.datatables.EnchantItemData; -import com.l2jserver.gameserver.datatables.EnchantItemGroupsData; -import com.l2jserver.gameserver.datatables.EnchantItemHPBonusData; -import com.l2jserver.gameserver.datatables.EnchantItemOptionsData; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; import com.l2jserver.gameserver.datatables.EventDroplist; -import com.l2jserver.gameserver.datatables.ExperienceTable; -import com.l2jserver.gameserver.datatables.FishData; -import com.l2jserver.gameserver.datatables.FishingMonstersData; -import com.l2jserver.gameserver.datatables.FishingRodsData; -import com.l2jserver.gameserver.datatables.HennaData; -import com.l2jserver.gameserver.datatables.HitConditionBonus; -import com.l2jserver.gameserver.datatables.InitialEquipmentData; -import com.l2jserver.gameserver.datatables.InitialShortcutData; -import com.l2jserver.gameserver.datatables.ItemCrystalizationData; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.KarmaData; import com.l2jserver.gameserver.datatables.MerchantPriceConfigTable; -import com.l2jserver.gameserver.datatables.MultisellData; -import com.l2jserver.gameserver.datatables.NpcBufferTable; -import com.l2jserver.gameserver.datatables.NpcData; -import com.l2jserver.gameserver.datatables.OfflineTradersTable; -import com.l2jserver.gameserver.datatables.OptionsData; -import com.l2jserver.gameserver.datatables.PetDataTable; -import com.l2jserver.gameserver.datatables.PlayerXpPercentLostData; -import com.l2jserver.gameserver.datatables.RecipeData; -import com.l2jserver.gameserver.datatables.SecondaryAuthData; -import com.l2jserver.gameserver.datatables.ShuttleData; -import com.l2jserver.gameserver.datatables.SiegeScheduleData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SkillLearnData; -import com.l2jserver.gameserver.datatables.SkillTreesData; import com.l2jserver.gameserver.datatables.SpawnTable; -import com.l2jserver.gameserver.datatables.StaticObjects; -import com.l2jserver.gameserver.datatables.SummonSkillsTable; -import com.l2jserver.gameserver.datatables.TeleportLocationTable; -import com.l2jserver.gameserver.datatables.TeleportersData; -import com.l2jserver.gameserver.datatables.TransformData; -import com.l2jserver.gameserver.datatables.UIData; -import com.l2jserver.gameserver.geoeditorcon.GeoEditorListener; import com.l2jserver.gameserver.handler.EffectHandler; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.instancemanager.AirShipManager; @@ -229,7 +228,7 @@ public class GameServer EnchantItemData.getInstance(); EnchantItemOptionsData.getInstance(); ItemCrystalizationData.getInstance(); - OptionsData.getInstance(); + OptionData.getInstance(); EnchantItemHPBonusData.getInstance(); MerchantPriceConfigTable.getInstance().loadInstances(); BuyListData.getInstance(); @@ -245,13 +244,13 @@ public class GameServer ClassListData.getInstance(); InitialEquipmentData.getInstance(); InitialShortcutData.getInstance(); - ExperienceTable.getInstance(); + ExperienceData.getInstance(); PlayerXpPercentLostData.getInstance(); KarmaData.getInstance(); - HitConditionBonus.getInstance(); - CharTemplateTable.getInstance(); + HitConditionBonusData.getInstance(); + PlayerTemplateData.getInstance(); CharNameTable.getInstance(); - AdminTable.getInstance(); + AdminData.getInstance(); RaidBossPointsManager.getInstance(); PetDataTable.getInstance(); CharSummonTable.getInstance().init(); @@ -272,7 +271,8 @@ public class GameServer printSection("Geodata"); GeoData.getInstance(); - if (Config.GEODATA == 2) + + if (Config.PATHFINDING > 0) { PathFinding.getInstance(); } @@ -281,9 +281,9 @@ public class GameServer SkillLearnData.getInstance(); NpcData.getInstance(); WalkingManager.getInstance(); - StaticObjects.getInstance(); + StaticObjectData.getInstance(); ZoneManager.getInstance(); - DoorTable.getInstance(); + DoorData.getInstance(); ItemAuctionManager.getInstance(); CastleManager.getInstance().loadInstances(); NpcBufferTable.getInstance(); @@ -385,11 +385,6 @@ public class GameServer MailManager.getInstance(); } - if (Config.ACCEPT_GEOEDITOR_CONN) - { - GeoEditorListener.getInstance(); - } - PunishmentManager.getInstance(); Runtime.getRuntime().addShutdownHook(Shutdown.getInstance()); diff --git a/trunk/java/com/l2jserver/gameserver/GeoData.java b/trunk/java/com/l2jserver/gameserver/GeoData.java index 77b92cb215..c69f004866 100644 --- a/trunk/java/com/l2jserver/gameserver/GeoData.java +++ b/trunk/java/com/l2jserver/gameserver/GeoData.java @@ -18,13 +18,13 @@ */ package com.l2jserver.gameserver; -import java.io.FileNotFoundException; +import java.nio.file.Files; import java.nio.file.Path; import java.util.logging.Level; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.Location; @@ -50,12 +50,6 @@ public class GeoData protected GeoData() { - if (Config.GEODATA == 0) - { - LOGGER.info(getClass().getSimpleName() + ": Disabled."); - return; - } - int loadedRegions = 0; try { @@ -74,7 +68,7 @@ public class GeoData loadedRegions++; } } - else if (Config.TRY_LOAD_UNSPECIFIED_REGIONS) + else if (Config.TRY_LOAD_UNSPECIFIED_REGIONS && Files.exists(geoFilePath)) { try { @@ -84,11 +78,7 @@ public class GeoData } catch (Exception e) { - // ignore file not found errors - if (!(e instanceof FileNotFoundException)) - { - LOGGER.log(Level.WARNING, getClass().getSimpleName() + ": Failed to load " + geoFilePath.getFileName() + "!", e); - } + LOGGER.log(Level.WARNING, getClass().getSimpleName() + ": Failed to load " + geoFilePath.getFileName() + "!", e); } } } @@ -121,25 +111,25 @@ public class GeoData public boolean checkNearestNsweAntiCornerCut(int geoX, int geoY, int worldZ, int nswe) { boolean can = true; - if ((nswe & Cell.NSWE_NORTH_EAST) != 0) + if ((nswe & Cell.NSWE_NORTH_EAST) == Cell.NSWE_NORTH_EAST) { // can = canEnterNeighbors(prevX, prevY - 1, prevGeoZ, Direction.EAST) && canEnterNeighbors(prevX + 1, prevY, prevGeoZ, Direction.NORTH); can = checkNearestNswe(geoX, geoY - 1, worldZ, Cell.NSWE_EAST) && checkNearestNswe(geoX + 1, geoY, worldZ, Cell.NSWE_NORTH); } - if (can && ((nswe & Cell.NSWE_NORTH_WEST) != 0)) + if (can && ((nswe & Cell.NSWE_NORTH_WEST) == Cell.NSWE_NORTH_WEST)) { // can = canEnterNeighbors(prevX, prevY - 1, prevGeoZ, Direction.WEST) && canEnterNeighbors(prevX - 1, prevY, prevGeoZ, Direction.NORTH); can = checkNearestNswe(geoX, geoY - 1, worldZ, Cell.NSWE_WEST) && checkNearestNswe(geoX, geoY - 1, worldZ, Cell.NSWE_NORTH); } - if (can && ((nswe & Cell.NSWE_SOUTH_EAST) != 0)) + if (can && ((nswe & Cell.NSWE_SOUTH_EAST) == Cell.NSWE_SOUTH_EAST)) { // can = canEnterNeighbors(prevX, prevY + 1, prevGeoZ, Direction.EAST) && canEnterNeighbors(prevX + 1, prevY, prevGeoZ, Direction.SOUTH); can = checkNearestNswe(geoX, geoY + 1, worldZ, Cell.NSWE_EAST) && checkNearestNswe(geoX + 1, geoY, worldZ, Cell.NSWE_SOUTH); } - if (can && ((nswe & Cell.NSWE_SOUTH_WEST) != 0)) + if (can && ((nswe & Cell.NSWE_SOUTH_WEST) == Cell.NSWE_SOUTH_WEST)) { // can = canEnterNeighbors(prevX, prevY + 1, prevGeoZ, Direction.WEST) && canEnterNeighbors(prevX - 1, prevY, prevGeoZ, Direction.SOUTH); can = checkNearestNswe(geoX, geoY + 1, worldZ, Cell.NSWE_WEST) && checkNearestNswe(geoX - 1, geoY, worldZ, Cell.NSWE_SOUTH); @@ -151,25 +141,25 @@ public class GeoData public boolean checkNearestNsweAntiCornerCut(int geoX, int geoY, int worldZ, int nswe, int zDeltaLimit) { boolean can = true; - if ((nswe & Cell.NSWE_NORTH_EAST) != 0) + if ((nswe & Cell.NSWE_NORTH_EAST) == Cell.NSWE_NORTH_EAST) { // can = canEnterNeighbors(prevX, prevY - 1, prevGeoZ, Direction.EAST) && canEnterNeighbors(prevX + 1, prevY, prevGeoZ, Direction.NORTH); can = checkNearestNswe(geoX, geoY - 1, worldZ, Cell.NSWE_EAST, zDeltaLimit) && checkNearestNswe(geoX + 1, geoY, worldZ, Cell.NSWE_NORTH, zDeltaLimit); } - if (can && ((nswe & Cell.NSWE_NORTH_WEST) != 0)) + if (can && ((nswe & Cell.NSWE_NORTH_WEST) == Cell.NSWE_NORTH_WEST)) { // can = canEnterNeighbors(prevX, prevY - 1, prevGeoZ, Direction.WEST) && canEnterNeighbors(prevX - 1, prevY, prevGeoZ, Direction.NORTH); can = checkNearestNswe(geoX, geoY - 1, worldZ, Cell.NSWE_WEST, zDeltaLimit) && checkNearestNswe(geoX, geoY - 1, worldZ, Cell.NSWE_NORTH, zDeltaLimit); } - if (can && ((nswe & Cell.NSWE_SOUTH_EAST) != 0)) + if (can && ((nswe & Cell.NSWE_SOUTH_EAST) == Cell.NSWE_SOUTH_EAST)) { // can = canEnterNeighbors(prevX, prevY + 1, prevGeoZ, Direction.EAST) && canEnterNeighbors(prevX + 1, prevY, prevGeoZ, Direction.SOUTH); can = checkNearestNswe(geoX, geoY + 1, worldZ, Cell.NSWE_EAST, zDeltaLimit) && checkNearestNswe(geoX + 1, geoY, worldZ, Cell.NSWE_SOUTH, zDeltaLimit); } - if (can && ((nswe & Cell.NSWE_SOUTH_WEST) != 0)) + if (can && ((nswe & Cell.NSWE_SOUTH_WEST) == Cell.NSWE_SOUTH_WEST)) { // can = canEnterNeighbors(prevX, prevY + 1, prevGeoZ, Direction.WEST) && canEnterNeighbors(prevX - 1, prevY, prevGeoZ, Direction.SOUTH); can = checkNearestNswe(geoX, geoY + 1, worldZ, Cell.NSWE_WEST, zDeltaLimit) && checkNearestNswe(geoX - 1, geoY, worldZ, Cell.NSWE_SOUTH, zDeltaLimit); @@ -326,7 +316,7 @@ public class GeoData */ public boolean canSeeTarget(int x, int y, int z, int instanceId, int tx, int ty, int tz) { - if (DoorTable.getInstance().checkIfDoorsBetween(x, y, z, tx, ty, tz, instanceId, true)) + if (DoorData.getInstance().checkIfDoorsBetween(x, y, z, tx, ty, tz, instanceId, true)) { return false; } @@ -442,25 +432,25 @@ public class GeoData boolean canSeeThrough = false; if ((curGeoZ <= maxHeight) && (curGeoZ <= beeCurGeoZ)) { - if ((nswe & Cell.NSWE_NORTH_EAST) != 0) + if ((nswe & Cell.NSWE_NORTH_EAST) == Cell.NSWE_NORTH_EAST) { int northGeoZ = getLosGeoZ(prevX, prevY, prevGeoZ, prevX, prevY - 1, Cell.NSWE_EAST); int eastGeoZ = getLosGeoZ(prevX, prevY, prevGeoZ, prevX + 1, prevY, Cell.NSWE_NORTH); canSeeThrough = (northGeoZ <= maxHeight) && (eastGeoZ <= maxHeight) && (northGeoZ <= getNearestZ(prevX, prevY - 1, beeCurZ)) && (eastGeoZ <= getNearestZ(prevX + 1, prevY, beeCurZ)); } - else if ((nswe & Cell.NSWE_NORTH_WEST) != 0) + else if ((nswe & Cell.NSWE_NORTH_WEST) == Cell.NSWE_NORTH_WEST) { int northGeoZ = getLosGeoZ(prevX, prevY, prevGeoZ, prevX, prevY - 1, Cell.NSWE_WEST); int westGeoZ = getLosGeoZ(prevX, prevY, prevGeoZ, prevX - 1, prevY, Cell.NSWE_NORTH); canSeeThrough = (northGeoZ <= maxHeight) && (westGeoZ <= maxHeight) && (northGeoZ <= getNearestZ(prevX, prevY - 1, beeCurZ)) && (westGeoZ <= getNearestZ(prevX - 1, prevY, beeCurZ)); } - else if ((nswe & Cell.NSWE_SOUTH_EAST) != 0) + else if ((nswe & Cell.NSWE_SOUTH_EAST) == Cell.NSWE_SOUTH_EAST) { int southGeoZ = getLosGeoZ(prevX, prevY, prevGeoZ, prevX, prevY + 1, Cell.NSWE_EAST); int eastGeoZ = getLosGeoZ(prevX, prevY, prevGeoZ, prevX + 1, prevY, Cell.NSWE_SOUTH); canSeeThrough = (southGeoZ <= maxHeight) && (eastGeoZ <= maxHeight) && (southGeoZ <= getNearestZ(prevX, prevY + 1, beeCurZ)) && (eastGeoZ <= getNearestZ(prevX + 1, prevY, beeCurZ)); } - else if ((nswe & Cell.NSWE_SOUTH_WEST) != 0) + else if ((nswe & Cell.NSWE_SOUTH_WEST) == Cell.NSWE_SOUTH_WEST) { int southGeoZ = getLosGeoZ(prevX, prevY, prevGeoZ, prevX, prevY + 1, Cell.NSWE_WEST); int westGeoZ = getLosGeoZ(prevX, prevY, prevGeoZ, prevX - 1, prevY, Cell.NSWE_SOUTH); @@ -507,7 +497,7 @@ public class GeoData int tGeoY = getGeoY(ty); tz = getNearestZ(tGeoX, tGeoY, tz, Z_DELTA_LIMIT); - if (DoorTable.getInstance().checkIfDoorsBetween(x, y, z, tx, ty, tz, instanceId, false)) + if (DoorData.getInstance().checkIfDoorsBetween(x, y, z, tx, ty, tz, instanceId, false)) { return new Location(x, y, getHeight(x, y, z)); } @@ -569,7 +559,7 @@ public class GeoData int tGeoY = getGeoY(toY); toZ = getNearestZ(tGeoX, tGeoY, toZ, Z_DELTA_LIMIT); - if (DoorTable.getInstance().checkIfDoorsBetween(fromX, fromY, fromZ, toX, toY, toZ, instanceId, false)) + if (DoorData.getInstance().checkIfDoorsBetween(fromX, fromY, fromZ, toX, toY, toZ, instanceId, false)) { return false; } diff --git a/trunk/java/com/l2jserver/gameserver/MonsterRace.java b/trunk/java/com/l2jserver/gameserver/MonsterRace.java index 08df62ce04..d4508a4bde 100644 --- a/trunk/java/com/l2jserver/gameserver/MonsterRace.java +++ b/trunk/java/com/l2jserver/gameserver/MonsterRace.java @@ -22,7 +22,7 @@ import java.lang.reflect.Constructor; import java.util.logging.Level; import java.util.logging.Logger; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; diff --git a/trunk/java/com/l2jserver/gameserver/RecipeController.java b/trunk/java/com/l2jserver/gameserver/RecipeController.java index eab3e36c2e..3ff72da505 100644 --- a/trunk/java/com/l2jserver/gameserver/RecipeController.java +++ b/trunk/java/com/l2jserver/gameserver/RecipeController.java @@ -26,8 +26,8 @@ import java.util.logging.Logger; import javolution.util.FastMap; import com.l2jserver.Config; +import com.l2jserver.gameserver.data.xml.impl.RecipeData; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.RecipeData; import com.l2jserver.gameserver.enums.StatType; import com.l2jserver.gameserver.model.L2ManufactureItem; import com.l2jserver.gameserver.model.L2RecipeInstance; diff --git a/trunk/java/com/l2jserver/gameserver/Shutdown.java b/trunk/java/com/l2jserver/gameserver/Shutdown.java index da612203d9..0a2991d1e8 100644 --- a/trunk/java/com/l2jserver/gameserver/Shutdown.java +++ b/trunk/java/com/l2jserver/gameserver/Shutdown.java @@ -24,9 +24,9 @@ import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.UPnPService; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.OfflineTradersTable; import com.l2jserver.gameserver.datatables.BotReportTable; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.OfflineTradersTable; import com.l2jserver.gameserver.instancemanager.CHSiegeManager; import com.l2jserver.gameserver.instancemanager.CastleManorManager; import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager; diff --git a/trunk/java/com/l2jserver/gameserver/ai/AbstractAI.java b/trunk/java/com/l2jserver/gameserver/ai/AbstractAI.java index 520ec73dfb..559871e134 100644 --- a/trunk/java/com/l2jserver/gameserver/ai/AbstractAI.java +++ b/trunk/java/com/l2jserver/gameserver/ai/AbstractAI.java @@ -690,7 +690,12 @@ public abstract class AbstractAI implements Ctrl { if (_actor.isPlayer() && _actor.hasSummon()) { - _actor.getSummon().broadcastPacket(new AutoAttackStart(_actor.getSummon().getObjectId())); + final L2Summon pet = _actor.getPet(); + if (pet != null) + { + pet.broadcastPacket(new AutoAttackStart(pet.getObjectId())); + } + _actor.getServitors().values().forEach(s -> s.broadcastPacket(new AutoAttackStart(s.getObjectId()))); } // Send a Server->Client packet AutoAttackStart to the actor and all L2PcInstance in its _knownPlayers _actor.broadcastPacket(new AutoAttackStart(_actor.getObjectId())); diff --git a/trunk/java/com/l2jserver/gameserver/ai/L2AttackableAI.java b/trunk/java/com/l2jserver/gameserver/ai/L2AttackableAI.java index c075d7c886..3181539817 100644 --- a/trunk/java/com/l2jserver/gameserver/ai/L2AttackableAI.java +++ b/trunk/java/com/l2jserver/gameserver/ai/L2AttackableAI.java @@ -31,8 +31,8 @@ import com.l2jserver.Config; import com.l2jserver.gameserver.GameTimeController; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.NpcData; -import com.l2jserver.gameserver.datatables.TerritoryTable; +import com.l2jserver.gameserver.data.sql.impl.TerritoryTable; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.enums.AISkillScope; import com.l2jserver.gameserver.enums.AIType; import com.l2jserver.gameserver.model.L2Object; @@ -845,7 +845,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable if (!npc.isInsideRadius(newX, newY, 0, collision, false, false)) { int newZ = npc.getZ() + 30; - if ((Config.GEODATA == 0) || GeoData.getInstance().canMove(npc.getX(), npc.getY(), npc.getZ(), newX, newY, newZ, npc.getInstanceId())) + if (GeoData.getInstance().canMove(npc.getX(), npc.getY(), npc.getZ(), newX, newY, newZ, npc.getInstanceId())) { moveTo(newX, newY, newZ); } @@ -885,7 +885,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable posY = posY - 300; } - if ((Config.GEODATA == 0) || GeoData.getInstance().canMove(npc.getX(), npc.getY(), npc.getZ(), posX, posY, posZ, npc.getInstanceId())) + if (GeoData.getInstance().canMove(npc.getX(), npc.getY(), npc.getZ(), posX, posY, posZ, npc.getInstanceId())) { setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(posX, posY, posZ, 0)); } diff --git a/trunk/java/com/l2jserver/gameserver/ai/L2CharacterAI.java b/trunk/java/com/l2jserver/gameserver/ai/L2CharacterAI.java index 7453766dbb..9635f79f93 100644 --- a/trunk/java/com/l2jserver/gameserver/ai/L2CharacterAI.java +++ b/trunk/java/com/l2jserver/gameserver/ai/L2CharacterAI.java @@ -32,7 +32,6 @@ import java.util.List; import javolution.util.FastList; -import com.l2jserver.Config; import com.l2jserver.gameserver.GameTimeController; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ThreadPoolManager; @@ -1190,7 +1189,7 @@ public class L2CharacterAI extends AbstractAI setIntention(AI_INTENTION_ACTIVE); return true; } - if ((_actor != null) && (_skill != null) && _skill.isBad() && (_skill.getAffectRange() > 0) && (Config.GEODATA > 0) && !GeoData.getInstance().canSeeTarget(_actor, target)) + if ((_actor != null) && (_skill != null) && _skill.isBad() && (_skill.getAffectRange() > 0) && !GeoData.getInstance().canSeeTarget(_actor, target)) { setIntention(AI_INTENTION_ACTIVE); return true; diff --git a/trunk/java/com/l2jserver/gameserver/ai/L2SummonAI.java b/trunk/java/com/l2jserver/gameserver/ai/L2SummonAI.java index 55df67150a..41fd9eb8e0 100644 --- a/trunk/java/com/l2jserver/gameserver/ai/L2SummonAI.java +++ b/trunk/java/com/l2jserver/gameserver/ai/L2SummonAI.java @@ -24,7 +24,6 @@ import static com.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; import java.util.concurrent.Future; -import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.model.L2Object; @@ -236,7 +235,7 @@ public class L2SummonAI extends L2PlayableAI implements Runnable final int targetX = ownerX + (int) (AVOID_RADIUS * Math.cos(angle)); final int targetY = ownerY + (int) (AVOID_RADIUS * Math.sin(angle)); - if ((Config.GEODATA == 0) || GeoData.getInstance().canMove(_actor.getX(), _actor.getY(), _actor.getZ(), targetX, targetY, _actor.getZ(), _actor.getInstanceId())) + if (GeoData.getInstance().canMove(_actor.getX(), _actor.getY(), _actor.getZ(), targetX, targetY, _actor.getZ(), _actor.getInstanceId())) { moveTo(targetX, targetY, _actor.getZ()); } diff --git a/trunk/java/com/l2jserver/gameserver/communitybbs/Manager/TopicBBSManager.java b/trunk/java/com/l2jserver/gameserver/communitybbs/Manager/TopicBBSManager.java index 7e1173f4de..660842b66c 100644 --- a/trunk/java/com/l2jserver/gameserver/communitybbs/Manager/TopicBBSManager.java +++ b/trunk/java/com/l2jserver/gameserver/communitybbs/Manager/TopicBBSManager.java @@ -31,7 +31,7 @@ import javolution.util.FastMap; import com.l2jserver.gameserver.communitybbs.BB.Forum; import com.l2jserver.gameserver.communitybbs.BB.Post; import com.l2jserver.gameserver.communitybbs.BB.Topic; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.handler.CommunityBoardHandler; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.util.StringUtil; diff --git a/trunk/java/com/l2jserver/gameserver/datatables/AnnouncementsTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/AnnouncementsTable.java similarity index 94% rename from trunk/java/com/l2jserver/gameserver/datatables/AnnouncementsTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/AnnouncementsTable.java index 2fd7e2ffe3..b1dfafe5ac 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/AnnouncementsTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/AnnouncementsTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.sql.Connection; import java.sql.ResultSet; @@ -37,6 +37,7 @@ import com.l2jserver.gameserver.network.clientpackets.Say2; import com.l2jserver.gameserver.network.serverpackets.CreatureSay; /** + * Loads announcements from database. * @author UnAfraid */ public final class AnnouncementsTable @@ -50,9 +51,6 @@ public final class AnnouncementsTable load(); } - /** - * Loads all announcements from database. - */ private void load() { _announcements.clear(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/CharNameTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/CharNameTable.java similarity index 94% rename from trunk/java/com/l2jserver/gameserver/datatables/CharNameTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/CharNameTable.java index 42ef338cbc..dea1c8c951 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/CharNameTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/CharNameTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.sql.Connection; import java.sql.PreparedStatement; @@ -34,8 +34,8 @@ import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; /** - * This class ... - * @version $Revision: 1.3.2.2.2.1 $ $Date: 2005/03/27 15:29:18 $ + * Loads name and access level for all players. + * @version 2005/03/27 */ public class CharNameTable { diff --git a/trunk/java/com/l2jserver/gameserver/datatables/CharSummonTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/CharSummonTable.java similarity index 75% rename from trunk/java/com/l2jserver/gameserver/datatables/CharSummonTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/CharSummonTable.java index 54df0fbdfa..335936497f 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/CharSummonTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/CharSummonTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.sql.Connection; import java.sql.PreparedStatement; @@ -24,11 +24,15 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; +import com.l2jserver.gameserver.data.xml.impl.NpcData; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; +import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.model.L2PetData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PetInstance; @@ -45,21 +49,21 @@ public class CharSummonTable { private static final Logger LOGGER = Logger.getLogger(CharSummonTable.class.getName()); private static final Map _pets = new ConcurrentHashMap<>(); - private static final Map _servitors = new ConcurrentHashMap<>(); + private static final Map> _servitors = new ConcurrentHashMap<>(); // SQL private static final String INIT_PET = "SELECT ownerId, item_obj_id FROM pets WHERE restore = 'true'"; - private static final String INIT_SUMMONS = "SELECT ownerId, summonSkillId FROM character_summons"; - private static final String LOAD_SUMMON = "SELECT curHp, curMp, time FROM character_summons WHERE ownerId = ? AND summonSkillId = ?"; - private static final String REMOVE_SUMMON = "DELETE FROM character_summons WHERE ownerId = ?"; - private static final String SAVE_SUMMON = "REPLACE INTO character_summons (ownerId,summonSkillId,curHp,curMp,time) VALUES (?,?,?,?,?)"; + private static final String INIT_SUMMONS = "SELECT ownerId, summonId FROM character_summons"; + private static final String LOAD_SUMMON = "SELECT summonSkillId, summonId, curHp, curMp, time FROM character_summons WHERE ownerId = ?"; + private static final String REMOVE_SUMMON = "DELETE FROM character_summons WHERE ownerId = ? and summonId = ?"; + private static final String SAVE_SUMMON = "REPLACE INTO character_summons (ownerId,summonId,summonSkillId,curHp,curMp,time) VALUES (?,?,?,?,?,?)"; public Map getPets() { return _pets; } - public Map getServitors() + public Map> getServitors() { return _servitors; } @@ -74,7 +78,7 @@ public class CharSummonTable { while (rs.next()) { - _servitors.put(rs.getInt("ownerId"), rs.getInt("summonSkillId")); + _servitors.computeIfAbsent(rs.getInt("ownerId"), k -> ConcurrentHashMap.newKeySet()).add(rs.getInt("summonId")); } } catch (Exception e) @@ -101,13 +105,19 @@ public class CharSummonTable } } - public void removeServitor(L2PcInstance activeChar) + public void removeServitor(L2PcInstance activeChar, int summonObjectId) { - _servitors.remove(activeChar.getObjectId()); + _servitors.computeIfPresent(activeChar.getObjectId(), (k, v) -> + { + v.remove(summonObjectId); + return !v.isEmpty() ? v : null; + }); + try (Connection con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement ps = con.prepareStatement(REMOVE_SUMMON)) { ps.setInt(1, activeChar.getObjectId()); + ps.setInt(2, summonObjectId); ps.execute(); } catch (SQLException e) @@ -173,37 +183,34 @@ public class CharSummonTable public void restoreServitor(L2PcInstance activeChar) { - int skillId = _servitors.get(activeChar.getObjectId()); try (Connection con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement ps = con.prepareStatement(LOAD_SUMMON)) { ps.setInt(1, activeChar.getObjectId()); - ps.setInt(2, skillId); try (ResultSet rs = ps.executeQuery()) { Skill skill; - while (rs.next()) { + int summonObjId = rs.getInt("summonId"); + int skillId = rs.getInt("summonSkillId"); int curHp = rs.getInt("curHp"); int curMp = rs.getInt("curMp"); int time = rs.getInt("time"); skill = SkillData.getInstance().getSkill(skillId, activeChar.getSkillLevel(skillId)); - if (skill == null) + if ((skill == null) || !activeChar.hasServitor(summonObjId)) { - removeServitor(activeChar); + removeServitor(activeChar, summonObjId); return; } skill.applyEffects(activeChar, activeChar); - if (activeChar.hasServitor()) - { - final L2ServitorInstance summon = (L2ServitorInstance) activeChar.getSummon(); - summon.setCurrentHp(curHp); - summon.setCurrentMp(curMp); - summon.setLifeTimeRemaining(time); - } + + final L2ServitorInstance summon = (L2ServitorInstance) activeChar.getServitor(summonObjId); + summon.setCurrentHp(curHp); + summon.setCurrentMp(curMp); + summon.setLifeTimeRemaining(time); } } } @@ -220,16 +227,17 @@ public class CharSummonTable return; } - _servitors.put(summon.getOwner().getObjectId(), summon.getReferenceSkill()); + _servitors.computeIfAbsent(summon.getOwner().getObjectId(), k -> ConcurrentHashMap.newKeySet()).add(summon.getObjectId()); try (Connection con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement ps = con.prepareStatement(SAVE_SUMMON)) { ps.setInt(1, summon.getOwner().getObjectId()); - ps.setInt(2, summon.getReferenceSkill()); - ps.setInt(3, (int) Math.round(summon.getCurrentHp())); - ps.setInt(4, (int) Math.round(summon.getCurrentMp())); - ps.setInt(5, summon.getLifeTimeRemaining()); + ps.setInt(2, summon.getObjectId()); + ps.setInt(3, summon.getReferenceSkill()); + ps.setInt(4, (int) Math.round(summon.getCurrentHp())); + ps.setInt(5, (int) Math.round(summon.getCurrentMp())); + ps.setInt(6, summon.getLifeTimeRemaining()); ps.execute(); } catch (Exception e) diff --git a/trunk/java/com/l2jserver/gameserver/datatables/ClanTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/ClanTable.java similarity index 96% rename from trunk/java/com/l2jserver/gameserver/datatables/ClanTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/ClanTable.java index 9116c0eb56..261dfae53c 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/ClanTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/ClanTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.sql.Connection; import java.sql.PreparedStatement; diff --git a/trunk/java/com/l2jserver/gameserver/datatables/CrestTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/CrestTable.java similarity index 95% rename from trunk/java/com/l2jserver/gameserver/datatables/CrestTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/CrestTable.java index ec6c81bdcc..ac9e127695 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/CrestTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/CrestTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.io.File; import java.nio.file.Files; @@ -41,6 +41,7 @@ import com.l2jserver.gameserver.model.L2Crest.CrestType; import com.l2jserver.util.file.filter.BMPFilter; /** + * Loads and saves crests from database. * @author NosBit */ public final class CrestTable diff --git a/trunk/java/com/l2jserver/gameserver/datatables/NpcBufferTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/NpcBufferTable.java similarity index 95% rename from trunk/java/com/l2jserver/gameserver/datatables/NpcBufferTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/NpcBufferTable.java index 50abbe629b..ca103425e4 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/NpcBufferTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/NpcBufferTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.sql.Connection; import java.sql.ResultSet; diff --git a/trunk/java/com/l2jserver/gameserver/datatables/OfflineTradersTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/OfflineTradersTable.java similarity index 96% rename from trunk/java/com/l2jserver/gameserver/datatables/OfflineTradersTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/OfflineTradersTable.java index b948e71c55..29c5ae2e6d 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/OfflineTradersTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/OfflineTradersTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.sql.Connection; import java.sql.PreparedStatement; diff --git a/trunk/java/com/l2jserver/gameserver/datatables/PetNameTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/PetNameTable.java similarity index 90% rename from trunk/java/com/l2jserver/gameserver/datatables/PetNameTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/PetNameTable.java index 018e7c6f09..c28574a896 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/PetNameTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/PetNameTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.sql.Connection; import java.sql.PreparedStatement; @@ -30,6 +30,7 @@ import java.util.regex.PatternSyntaxException; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; public class PetNameTable { @@ -53,7 +54,7 @@ public class PetNameTable cond.append(", "); } - cond.append(PetDataTable.getPetItemsByNpc(petNpcId)); + cond.append(PetDataTable.getInstance().getPetItemsByNpc(petNpcId)); ps.setString(2, cond.toString()); try (ResultSet rs = ps.executeQuery()) { diff --git a/trunk/java/com/l2jserver/gameserver/datatables/SummonEffectsTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/SummonEffectsTable.java similarity index 94% rename from trunk/java/com/l2jserver/gameserver/datatables/SummonEffectsTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/SummonEffectsTable.java index 1c5dd2d8d5..3ba94314e4 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/SummonEffectsTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/SummonEffectsTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.util.HashMap; import java.util.List; diff --git a/trunk/java/com/l2jserver/gameserver/datatables/SummonSkillsTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/SummonSkillsTable.java similarity index 94% rename from trunk/java/com/l2jserver/gameserver/datatables/SummonSkillsTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/SummonSkillsTable.java index d82c5fb199..9a41e71b8f 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/SummonSkillsTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/SummonSkillsTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.sql.Connection; import java.sql.ResultSet; @@ -30,6 +30,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.l2jserver.L2DatabaseFactory; +import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.model.actor.L2Summon; public class SummonSkillsTable diff --git a/trunk/java/com/l2jserver/gameserver/datatables/TeleportLocationTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/TeleportLocationTable.java similarity index 95% rename from trunk/java/com/l2jserver/gameserver/datatables/TeleportLocationTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/TeleportLocationTable.java index a8bedadf0f..73eb635257 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/TeleportLocationTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/TeleportLocationTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.sql.Connection; import java.sql.ResultSet; diff --git a/trunk/java/com/l2jserver/gameserver/datatables/TerritoryTable.java b/trunk/java/com/l2jserver/gameserver/data/sql/impl/TerritoryTable.java similarity index 94% rename from trunk/java/com/l2jserver/gameserver/datatables/TerritoryTable.java rename to trunk/java/com/l2jserver/gameserver/data/sql/impl/TerritoryTable.java index fc27378ab8..72eca3fd1b 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/TerritoryTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/sql/impl/TerritoryTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.sql.impl; import java.sql.Connection; import java.sql.ResultSet; diff --git a/trunk/java/com/l2jserver/gameserver/engines/DocumentParser.java b/trunk/java/com/l2jserver/gameserver/data/xml/IXmlReader.java similarity index 95% rename from trunk/java/com/l2jserver/gameserver/engines/DocumentParser.java rename to trunk/java/com/l2jserver/gameserver/data/xml/IXmlReader.java index 98f00abf65..bede3135c2 100644 --- a/trunk/java/com/l2jserver/gameserver/engines/DocumentParser.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/IXmlReader.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.engines; +package com.l2jserver.gameserver.data.xml; import java.io.File; import java.io.FileFilter; @@ -38,9 +38,9 @@ import com.l2jserver.util.file.filter.XMLFilter; * Abstract class for XML parsers. * @author Zoey76 */ -public interface DocumentParser +public interface IXmlReader { - static final Logger LOGGER = Logger.getLogger(DocumentParser.class.getName()); + static final Logger LOGGER = Logger.getLogger(IXmlReader.class.getName()); static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; diff --git a/trunk/java/com/l2jserver/gameserver/datatables/AbilityPointsData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/AbilityPointsData.java similarity index 91% rename from trunk/java/com/l2jserver/gameserver/datatables/AbilityPointsData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/AbilityPointsData.java index 8e068fde60..07b32aa4bc 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/AbilityPointsData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/AbilityPointsData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; @@ -27,13 +27,13 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.holders.RangeAbilityPointsHolder; /** * @author UnAfraid */ -public class AbilityPointsData implements DocumentParser +public final class AbilityPointsData implements IXmlReader { private final List _points = new ArrayList<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/AdminTable.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/AdminData.java similarity index 89% rename from trunk/java/com/l2jserver/gameserver/datatables/AdminTable.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/AdminData.java index 2911dfbb6d..d109b0e77a 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/AdminTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/AdminData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.HashMap; @@ -31,7 +31,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.L2AccessLevel; import com.l2jserver.gameserver.model.L2AdminCommandAccessRight; import com.l2jserver.gameserver.model.StatsSet; @@ -41,16 +41,17 @@ import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; /** + * Loads administrator access levels and commands. * @author UnAfraid */ -public class AdminTable implements DocumentParser +public final class AdminData implements IXmlReader { - private static final Map _accessLevels = new HashMap<>(); - private static final Map _adminCommandAccessRights = new HashMap<>(); - private static final Map _gmList = new FastMap().shared(); + private final Map _accessLevels = new HashMap<>(); + private final Map _adminCommandAccessRights = new HashMap<>(); + private final Map _gmList = new FastMap().shared(); private int _highestLevel = 0; - protected AdminTable() + protected AdminData() { load(); } @@ -61,9 +62,9 @@ public class AdminTable implements DocumentParser _accessLevels.clear(); _adminCommandAccessRights.clear(); parseDatapackFile("config/accessLevels.xml"); - LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _accessLevels.size() + " Access Levels"); + LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _accessLevels.size() + " Access Levels."); parseDatapackFile("config/adminCommands.xml"); - LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _adminCommandAccessRights.size() + " Access Commands"); + LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _adminCommandAccessRights.size() + " Access Commands."); } @Override @@ -344,13 +345,13 @@ public class AdminTable implements DocumentParser * Gets the single instance of AdminTable. * @return AccessLevels: the one and only instance of this class
*/ - public static AdminTable getInstance() + public static AdminData getInstance() { return SingletonHolder._instance; } private static class SingletonHolder { - protected static final AdminTable _instance = new AdminTable(); + protected static final AdminData _instance = new AdminData(); } } diff --git a/trunk/java/com/l2jserver/gameserver/datatables/ArmorSetsData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ArmorSetsData.java similarity index 91% rename from trunk/java/com/l2jserver/gameserver/datatables/ArmorSetsData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/ArmorSetsData.java index ce4d0250f4..2a95c7517a 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/ArmorSetsData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ArmorSetsData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -25,17 +25,18 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.L2ArmorSet; import com.l2jserver.gameserver.model.holders.ArmorsetSkillHolder; import com.l2jserver.gameserver.model.holders.SkillHolder; /** + * Loads armor set bonuses. * @author godson, Luno, UnAfraid */ -public final class ArmorSetsData implements DocumentParser +public final class ArmorSetsData implements IXmlReader { - private static final Map _armorSets = new HashMap<>(); + private final Map _armorSets = new HashMap<>(); /** * Instantiates a new armor sets data. diff --git a/trunk/java/com/l2jserver/gameserver/datatables/BeautyShopData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/BeautyShopData.java similarity index 93% rename from trunk/java/com/l2jserver/gameserver/datatables/BeautyShopData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/BeautyShopData.java index ca27930042..8a0fe07dd6 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/BeautyShopData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/BeautyShopData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -25,7 +25,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.enums.Sex; import com.l2jserver.gameserver.model.StatsSet; @@ -35,7 +35,7 @@ import com.l2jserver.gameserver.model.beautyshop.BeautyItem; /** * @author Sdw */ -public final class BeautyShopData implements DocumentParser +public final class BeautyShopData implements IXmlReader { private final Map> _beautyList = new HashMap<>(); private final Map _beautyData = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/BuyListData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/BuyListData.java similarity index 92% rename from trunk/java/com/l2jserver/gameserver/datatables/BuyListData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/BuyListData.java index 557c485813..25c48f0b0c 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/BuyListData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/BuyListData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.io.File; import java.io.FileFilter; @@ -33,16 +33,18 @@ import org.w3c.dom.Node; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; +import com.l2jserver.gameserver.datatables.ItemTable; import com.l2jserver.gameserver.model.buylist.L2BuyList; import com.l2jserver.gameserver.model.buylist.Product; import com.l2jserver.gameserver.model.items.L2Item; import com.l2jserver.util.file.filter.NumericNameFilter; /** + * Loads buy lists for NPCs. * @author NosBit */ -public final class BuyListData implements DocumentParser +public final class BuyListData implements IXmlReader { private final Map _buyLists = new HashMap<>(); private static final FileFilter NUMERIC_FILTER = new NumericNameFilter(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/CastleData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/CastleData.java similarity index 92% rename from trunk/java/com/l2jserver/gameserver/datatables/CastleData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/CastleData.java index b419f670a8..1af35262cf 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/CastleData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/CastleData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.Collections; @@ -29,14 +29,14 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.enums.CastleSide; import com.l2jserver.gameserver.model.holders.CastleSpawnHolder; /** * @author St3eT */ -public final class CastleData implements DocumentParser +public final class CastleData implements IXmlReader { private final Map> _castles = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/CategoryData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/CategoryData.java similarity index 83% rename from trunk/java/com/l2jserver/gameserver/datatables/CategoryData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/CategoryData.java index a3ab8149fb..17d59a05f8 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/CategoryData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/CategoryData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.HashSet; @@ -29,14 +29,14 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.enums.CategoryType; /** - * This class holds different categories containing class ids or npc ids. + * Loads the category data with Class or NPC IDs. * @author NosBit, xban1x */ -public final class CategoryData implements DocumentParser +public final class CategoryData implements IXmlReader { private static final Logger LOGGER = Logger.getLogger(CategoryData.class.getName()); @@ -90,10 +90,10 @@ public final class CategoryData implements DocumentParser } /** - * Checks if id is in category. - * @param type The category type. - * @param id The id to be checked. - * @return {@code true} if id is in category, {@code false} if id is not in category or category was not found. + * Checks if ID is in category. + * @param type The category type + * @param id The id to be checked + * @return {@code true} if id is in category, {@code false} if id is not in category or category was not found */ public boolean isInCategory(CategoryType type, int id) { @@ -107,8 +107,9 @@ public final class CategoryData implements DocumentParser } /** + * Gets the category by category type. * @param type The category type - * @return A {@code Set} containing all the ids in category if category is found, {@code null} if category was not found. + * @return A {@code Set} containing all the IDs in category if category is found, {@code null} if category was not found */ public Set getCategoryByType(CategoryType type) { diff --git a/trunk/java/com/l2jserver/gameserver/datatables/ClassListData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ClassListData.java similarity index 83% rename from trunk/java/com/l2jserver/gameserver/datatables/ClassListData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/ClassListData.java index 074f328aaf..f385dfb282 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/ClassListData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ClassListData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -25,18 +25,17 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.base.ClassId; import com.l2jserver.gameserver.model.base.ClassInfo; /** - * This class holds the list of classes and it's info.
- * It's in beta state, so it's expected to change over time. + * Loads the the list of classes and it's info. * @author Zoey76 */ -public final class ClassListData implements DocumentParser +public final class ClassListData implements IXmlReader { - private static final Map _classData = new HashMap<>(); + private final Map _classData = new HashMap<>(); /** * Instantiates a new class list data. @@ -98,7 +97,7 @@ public final class ClassListData implements DocumentParser * @param classId the class Id. * @return the class info related to the given {@code classId}. */ - public ClassInfo getClass(final ClassId classId) + public ClassInfo getClass(ClassId classId) { return _classData.get(classId); } @@ -108,7 +107,7 @@ public final class ClassListData implements DocumentParser * @param classId the class Id as integer. * @return the class info related to the given {@code classId}. */ - public ClassInfo getClass(final int classId) + public ClassInfo getClass(int classId) { final ClassId id = ClassId.getClassId(classId); return (id != null) ? _classData.get(id) : null; diff --git a/trunk/java/com/l2jserver/gameserver/datatables/DoorTable.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/DoorData.java similarity index 93% rename from trunk/java/com/l2jserver/gameserver/datatables/DoorTable.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/DoorData.java index b672a3e3f7..1bffd6ea9a 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/DoorTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/DoorData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.Collection; @@ -30,7 +30,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.instancemanager.InstanceManager; import com.l2jserver.gameserver.instancemanager.MapRegionManager; @@ -40,17 +40,17 @@ import com.l2jserver.gameserver.model.actor.templates.L2DoorTemplate; import com.l2jserver.gameserver.pathfinding.AbstractNodeLoc; /** + * Loads doors. * @author JIV, GodKratos, UnAfraid */ -public class DoorTable implements DocumentParser +public class DoorData implements IXmlReader { private static final Map> _groups = new HashMap<>(); - private final Map _doors = new HashMap<>(); private final Map _templates = new HashMap<>(); private final Map> _regions = new HashMap<>(); - protected DoorTable() + protected DoorData() { load(); } @@ -251,13 +251,13 @@ public class DoorTable implements DocumentParser return false; } - public static DoorTable getInstance() + public static DoorData getInstance() { return SingletonHolder._instance; } private static class SingletonHolder { - protected static final DoorTable _instance = new DoorTable(); + protected static final DoorData _instance = new DoorData(); } } diff --git a/trunk/java/com/l2jserver/gameserver/datatables/EnchantItemData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemData.java similarity index 89% rename from trunk/java/com/l2jserver/gameserver/datatables/EnchantItemData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemData.java index ddea5986f0..b0de38e285 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/EnchantItemData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -26,20 +26,20 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.items.enchant.EnchantScroll; import com.l2jserver.gameserver.model.items.enchant.EnchantSupportItem; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; /** - * This class holds the Enchant Item information. + * Loads item enchant data. * @author UnAfraid */ -public class EnchantItemData implements DocumentParser +public class EnchantItemData implements IXmlReader { - public static final Map _scrolls = new HashMap<>(); - public static final Map _supports = new HashMap<>(); + private final Map _scrolls = new HashMap<>(); + private final Map _supports = new HashMap<>(); /** * Instantiates a new enchant item data. diff --git a/trunk/java/com/l2jserver/gameserver/datatables/EnchantItemGroupsData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemGroupsData.java similarity index 93% rename from trunk/java/com/l2jserver/gameserver/datatables/EnchantItemGroupsData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemGroupsData.java index b80342a77e..faf4157c36 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/EnchantItemGroupsData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemGroupsData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -26,7 +26,8 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; +import com.l2jserver.gameserver.datatables.ItemTable; import com.l2jserver.gameserver.model.holders.RangeChanceHolder; import com.l2jserver.gameserver.model.items.L2Item; import com.l2jserver.gameserver.model.items.enchant.EnchantItemGroup; @@ -37,7 +38,7 @@ import com.l2jserver.gameserver.util.Util; /** * @author UnAfraid */ -public final class EnchantItemGroupsData implements DocumentParser +public final class EnchantItemGroupsData implements IXmlReader { private final Map _itemGroups = new HashMap<>(); private final Map _scrollGroups = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/EnchantItemHPBonusData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemHPBonusData.java similarity index 92% rename from trunk/java/com/l2jserver/gameserver/datatables/EnchantItemHPBonusData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemHPBonusData.java index f0744084a8..6025cb7771 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/EnchantItemHPBonusData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemHPBonusData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.Collection; @@ -27,7 +27,8 @@ import java.util.Map; import org.w3c.dom.Document; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; +import com.l2jserver.gameserver.datatables.ItemTable; import com.l2jserver.gameserver.enums.StatFunction; import com.l2jserver.gameserver.model.items.L2Item; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; @@ -39,7 +40,7 @@ import com.l2jserver.gameserver.model.stats.functions.FuncTemplate; * This class holds the Enchant HP Bonus Data. * @author MrPoke, Zoey76 */ -public class EnchantItemHPBonusData implements DocumentParser +public class EnchantItemHPBonusData implements IXmlReader { private final Map> _armorHPBonuses = new EnumMap<>(CrystalType.class); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/EnchantItemOptionsData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemOptionsData.java similarity index 92% rename from trunk/java/com/l2jserver/gameserver/datatables/EnchantItemOptionsData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemOptionsData.java index 0145eeb2f7..0e994d8d5c 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/EnchantItemOptionsData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantItemOptionsData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -25,7 +25,7 @@ import java.util.logging.Level; import org.w3c.dom.Document; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.model.options.EnchantOptions; import com.l2jserver.gameserver.util.Util; @@ -33,7 +33,7 @@ import com.l2jserver.gameserver.util.Util; /** * @author UnAfraid */ -public class EnchantItemOptionsData implements DocumentParser +public class EnchantItemOptionsData implements IXmlReader { private final Map> _data = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/EnchantSkillGroupsData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantSkillGroupsData.java similarity index 94% rename from trunk/java/com/l2jserver/gameserver/datatables/EnchantSkillGroupsData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantSkillGroupsData.java index e57b7e3173..dba3983c8f 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/EnchantSkillGroupsData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/EnchantSkillGroupsData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -27,7 +27,7 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.l2jserver.Config; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.L2EnchantSkillGroup; import com.l2jserver.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder; import com.l2jserver.gameserver.model.L2EnchantSkillLearn; @@ -39,7 +39,7 @@ import com.l2jserver.gameserver.model.skills.Skill; * This class holds the Enchant Groups information. * @author Micr0 */ -public class EnchantSkillGroupsData implements DocumentParser +public class EnchantSkillGroupsData implements IXmlReader { public static final int NORMAL_ENCHANT_COST_MULTIPLIER = Config.NORMAL_ENCHANT_COST_MULTIPLIER; public static final int SAFE_ENCHANT_COST_MULTIPLIER = Config.SAFE_ENCHANT_COST_MULTIPLIER; diff --git a/trunk/java/com/l2jserver/gameserver/datatables/ExperienceTable.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ExperienceData.java similarity index 86% rename from trunk/java/com/l2jserver/gameserver/datatables/ExperienceTable.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/ExperienceData.java index fc86cf2a59..13802b6c01 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/ExperienceTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ExperienceData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -25,13 +25,13 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; /** * This class holds the Experience points for each level for players and pets. * @author mrTJO */ -public final class ExperienceTable implements DocumentParser +public final class ExperienceData implements IXmlReader { private final Map _expTable = new HashMap<>(); @@ -41,7 +41,7 @@ public final class ExperienceTable implements DocumentParser /** * Instantiates a new experience table. */ - protected ExperienceTable() + protected ExperienceData() { load(); } @@ -108,13 +108,13 @@ public final class ExperienceTable implements DocumentParser * Gets the single instance of ExperienceTable. * @return single instance of ExperienceTable */ - public static ExperienceTable getInstance() + public static ExperienceData getInstance() { return SingletonHolder._instance; } private static class SingletonHolder { - protected static final ExperienceTable _instance = new ExperienceTable(); + protected static final ExperienceData _instance = new ExperienceData(); } } diff --git a/trunk/java/com/l2jserver/gameserver/datatables/FishData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/FishData.java similarity index 87% rename from trunk/java/com/l2jserver/gameserver/datatables/FishData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/FishData.java index df1ce7ffca..9b26b4c974 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/FishData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/FishData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.HashMap; @@ -27,7 +27,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.fishing.L2Fish; @@ -35,11 +35,11 @@ import com.l2jserver.gameserver.model.fishing.L2Fish; * This class holds the Fish information. * @author nonom */ -public final class FishData implements DocumentParser +public final class FishData implements IXmlReader { - private static final Map _fishNormal = new HashMap<>(); - private static final Map _fishEasy = new HashMap<>(); - private static final Map _fishHard = new HashMap<>(); + private final Map _fishNormal = new HashMap<>(); + private final Map _fishEasy = new HashMap<>(); + private final Map _fishHard = new HashMap<>(); /** * Instantiates a new fish data. diff --git a/trunk/java/com/l2jserver/gameserver/datatables/FishingMonstersData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/FishingMonstersData.java similarity index 89% rename from trunk/java/com/l2jserver/gameserver/datatables/FishingMonstersData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/FishingMonstersData.java index 14711ee0a3..c634f70122 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/FishingMonstersData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/FishingMonstersData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -25,7 +25,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.fishing.L2FishingMonster; @@ -33,9 +33,9 @@ import com.l2jserver.gameserver.model.fishing.L2FishingMonster; * This class holds the Fishing Monsters information. * @author nonom */ -public final class FishingMonstersData implements DocumentParser +public final class FishingMonstersData implements IXmlReader { - private static final Map _fishingMonstersData = new HashMap<>(); + private final Map _fishingMonstersData = new HashMap<>(); /** * Instantiates a new fishing monsters data. diff --git a/trunk/java/com/l2jserver/gameserver/datatables/FishingRodsData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/FishingRodsData.java similarity index 88% rename from trunk/java/com/l2jserver/gameserver/datatables/FishingRodsData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/FishingRodsData.java index 57171bd36b..e729e35760 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/FishingRodsData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/FishingRodsData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -25,7 +25,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.fishing.L2FishingRod; @@ -33,9 +33,9 @@ import com.l2jserver.gameserver.model.fishing.L2FishingRod; * This class holds the Fishing Rods information. * @author nonom */ -public final class FishingRodsData implements DocumentParser +public final class FishingRodsData implements IXmlReader { - private static final Map _fishingRods = new HashMap<>(); + private final Map _fishingRods = new HashMap<>(); /** * Instantiates a new fishing rods data. diff --git a/trunk/java/com/l2jserver/gameserver/datatables/HennaData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/HennaData.java similarity index 91% rename from trunk/java/com/l2jserver/gameserver/datatables/HennaData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/HennaData.java index ac6d71dd7b..1377a93d3f 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/HennaData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/HennaData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.HashMap; @@ -27,7 +27,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.base.ClassId; import com.l2jserver.gameserver.model.items.L2Henna; @@ -39,9 +39,9 @@ import com.l2jserver.gameserver.model.items.L2Henna; * Allowed classes to wear each henna. * @author Zoey76 */ -public final class HennaData implements DocumentParser +public final class HennaData implements IXmlReader { - private static final Map _hennaList = new HashMap<>(); + private final Map _hennaList = new HashMap<>(); /** * Instantiates a new henna data. diff --git a/trunk/java/com/l2jserver/gameserver/datatables/HitConditionBonus.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/HitConditionBonusData.java similarity index 84% rename from trunk/java/com/l2jserver/gameserver/datatables/HitConditionBonus.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/HitConditionBonusData.java index 1a62cead0c..6ad985bc3f 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/HitConditionBonus.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/HitConditionBonusData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; @@ -24,14 +24,14 @@ import org.w3c.dom.Node; import com.l2jserver.Config; import com.l2jserver.gameserver.GameTimeController; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.actor.L2Character; /** * This class load, holds and calculates the hit condition bonuses. * @author Nik */ -public final class HitConditionBonus implements DocumentParser +public final class HitConditionBonusData implements IXmlReader { private int frontBonus = 0; private int sideBonus = 0; @@ -44,7 +44,7 @@ public final class HitConditionBonus implements DocumentParser /** * Instantiates a new hit condition bonus. */ - protected HitConditionBonus() + protected HitConditionBonusData() { load(); } @@ -69,34 +69,46 @@ public final class HitConditionBonus implements DocumentParser @Override public void parseDocument(Document doc) { - final Node n = doc.getFirstChild(); - NamedNodeMap attrs; - for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling()) + for (Node d = doc.getFirstChild().getFirstChild(); d != null; d = d.getNextSibling()) { - attrs = d.getAttributes(); + NamedNodeMap attrs = d.getAttributes(); switch (d.getNodeName()) { case "front": + { frontBonus = parseInteger(attrs, "val"); break; + } case "side": + { sideBonus = parseInteger(attrs, "val"); break; + } case "back": + { backBonus = parseInteger(attrs, "val"); break; + } case "high": + { highBonus = parseInteger(attrs, "val"); break; + } case "low": + { lowBonus = parseInteger(attrs, "val"); break; + } case "dark": + { darkBonus = parseInteger(attrs, "val"); break; + } case "rain": + { rainBonus = parseInteger(attrs, "val"); break; + } } } } @@ -150,13 +162,13 @@ public final class HitConditionBonus implements DocumentParser * Gets the single instance of HitConditionBonus. * @return single instance of HitConditionBonus */ - public static HitConditionBonus getInstance() + public static HitConditionBonusData getInstance() { return SingletonHolder._instance; } private static class SingletonHolder { - protected static final HitConditionBonus _instance = new HitConditionBonus(); + protected static final HitConditionBonusData _instance = new HitConditionBonusData(); } } \ No newline at end of file diff --git a/trunk/java/com/l2jserver/gameserver/datatables/InitialEquipmentData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/InitialEquipmentData.java similarity index 92% rename from trunk/java/com/l2jserver/gameserver/datatables/InitialEquipmentData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/InitialEquipmentData.java index 6c8af4a71a..ccd67c4d5e 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/InitialEquipmentData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/InitialEquipmentData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.HashMap; @@ -28,7 +28,7 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.l2jserver.Config; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.base.ClassId; import com.l2jserver.gameserver.model.items.PcItemTemplate; @@ -38,11 +38,11 @@ import com.l2jserver.gameserver.model.items.PcItemTemplate; * What items get each newly created character and if this item is equipped upon creation (Requires the item to be equippable). * @author Zoey76 */ -public final class InitialEquipmentData implements DocumentParser +public final class InitialEquipmentData implements IXmlReader { + private final Map> _initialEquipmentList = new HashMap<>(); private static final String NORMAL = "data/stats/initialEquipment.xml"; private static final String EVENT = "data/stats/initialEquipmentEvent.xml"; - private final Map> _initialEquipmentList = new HashMap<>(); /** * Instantiates a new initial equipment data. diff --git a/trunk/java/com/l2jserver/gameserver/datatables/InitialShortcutData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/InitialShortcutData.java similarity index 94% rename from trunk/java/com/l2jserver/gameserver/datatables/InitialShortcutData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/InitialShortcutData.java index bd667b25b1..4426161f52 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/InitialShortcutData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/InitialShortcutData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.HashMap; @@ -27,7 +27,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.enums.MacroType; import com.l2jserver.gameserver.enums.ShortcutType; import com.l2jserver.gameserver.model.Macro; @@ -43,7 +43,7 @@ import com.l2jserver.gameserver.network.serverpackets.ShortCutRegister; * What shortcuts get each newly created character. * @author Zoey76 */ -public final class InitialShortcutData implements DocumentParser +public final class InitialShortcutData implements IXmlReader { private final Map> _initialShortcutData = new HashMap<>(); private final List _initialGlobalShortcutList = new ArrayList<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/ItemCrystalizationData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ItemCrystalizationData.java similarity index 91% rename from trunk/java/com/l2jserver/gameserver/datatables/ItemCrystalizationData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/ItemCrystalizationData.java index b4dbccb744..0182970298 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/ItemCrystalizationData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ItemCrystalizationData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -26,14 +26,14 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.CrystalizationData; import com.l2jserver.gameserver.model.holders.ItemChanceHolder; /** * @author UnAfraid */ -public class ItemCrystalizationData implements DocumentParser +public final class ItemCrystalizationData implements IXmlReader { private final Map _items = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/KarmaData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/KarmaData.java similarity index 90% rename from trunk/java/com/l2jserver/gameserver/datatables/KarmaData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/KarmaData.java index 504f24e1bd..7e5e798728 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/KarmaData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/KarmaData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -26,12 +26,12 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; /** * @author UnAfraid */ -public class KarmaData implements DocumentParser +public class KarmaData implements IXmlReader { private final Map _karmaTable = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/MultisellData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/MultisellData.java similarity index 95% rename from trunk/java/com/l2jserver/gameserver/datatables/MultisellData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/MultisellData.java index d635125c86..687c3845ce 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/MultisellData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/MultisellData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.io.File; import java.io.FileFilter; @@ -31,7 +31,7 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.l2jserver.Config; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -46,18 +46,18 @@ import com.l2jserver.gameserver.network.serverpackets.UserInfo; import com.l2jserver.gameserver.util.Util; import com.l2jserver.util.file.filter.NumericNameFilter; -public final class MultisellData implements DocumentParser +public final class MultisellData implements IXmlReader { - public static final int PAGE_SIZE = 40; + private final Map _entries = new HashMap<>(); + public static final int PAGE_SIZE = 40; + // Special IDs. public static final int PC_BANG_POINTS = -100; public static final int CLAN_REPUTATION = -200; public static final int FAME = -300; - + // Misc private static final FileFilter NUMERIC_FILTER = new NumericNameFilter(); - private final Map _entries = new HashMap<>(); - protected MultisellData() { load(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/NpcData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/NpcData.java similarity index 96% rename from trunk/java/com/l2jserver/gameserver/datatables/NpcData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/NpcData.java index 0750f1c8e9..8cbfb5d244 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/NpcData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/NpcData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; @@ -36,7 +36,8 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.l2jserver.Config; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; +import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.enums.AISkillScope; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; @@ -55,7 +56,7 @@ import com.l2jserver.gameserver.util.Util; * NPC data parser. * @author NosBit */ -public class NpcData implements DocumentParser +public class NpcData implements IXmlReader { private final Map _npcs = new ConcurrentHashMap<>(); private final Map _clans = new ConcurrentHashMap<>(); @@ -806,7 +807,7 @@ public class NpcData implements DocumentParser * Once Spawn System gets reworked delete this class
* @author Zealar */ - private final class MinionData implements DocumentParser + private final class MinionData implements IXmlReader { public final Map> _tempMinions = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/OptionsData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/OptionData.java similarity index 87% rename from trunk/java/com/l2jserver/gameserver/datatables/OptionsData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/OptionData.java index 79e2a5fb10..3435f90a43 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/OptionsData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/OptionData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -26,7 +26,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.options.Options; import com.l2jserver.gameserver.model.options.OptionsSkillHolder; @@ -37,11 +37,11 @@ import com.l2jserver.gameserver.model.stats.functions.FuncTemplate; /** * @author UnAfraid */ -public class OptionsData implements DocumentParser +public class OptionData implements IXmlReader { - private final Map _data = new HashMap<>(); + private final Map _optionData = new HashMap<>(); - protected OptionsData() + protected OptionData() { load(); } @@ -49,9 +49,9 @@ public class OptionsData implements DocumentParser @Override public synchronized void load() { - _data.clear(); + _optionData.clear(); parseDatapackDirectory("data/stats/options", false); - LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _data.size() + " Options."); + LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _optionData.size() + " Options."); } @Override @@ -123,7 +123,7 @@ public class OptionsData implements DocumentParser } } } - _data.put(op.getId(), op); + _optionData.put(op.getId(), op); } } } @@ -145,20 +145,20 @@ public class OptionsData implements DocumentParser public Options getOptions(int id) { - return _data.get(id); + return _optionData.get(id); } /** * Gets the single instance of OptionsData. * @return single instance of OptionsData */ - public static final OptionsData getInstance() + public static final OptionData getInstance() { return SingletonHolder._instance; } private static class SingletonHolder { - protected static final OptionsData _instance = new OptionsData(); + protected static final OptionData _instance = new OptionData(); } } diff --git a/trunk/java/com/l2jserver/gameserver/datatables/PetDataTable.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/PetDataTable.java similarity index 92% rename from trunk/java/com/l2jserver/gameserver/datatables/PetDataTable.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/PetDataTable.java index ee83bef306..a4240f0b9f 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/PetDataTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/PetDataTable.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -25,7 +25,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.enums.MountType; import com.l2jserver.gameserver.model.L2PetData; import com.l2jserver.gameserver.model.L2PetLevelData; @@ -36,9 +36,9 @@ import com.l2jserver.gameserver.model.StatsSet; * TODO: load and use all pet parameters. * @author Zoey76 (rework) */ -public final class PetDataTable implements DocumentParser +public final class PetDataTable implements IXmlReader { - private static final Map _pets = new HashMap<>(); + private final Map _pets = new HashMap<>(); /** * Instantiates a new pet data table. @@ -212,7 +212,7 @@ public final class PetDataTable implements DocumentParser * @param npcId the NPC ID to get its summoning item * @return summoning item for the given NPC ID */ - public static int getPetItemsByNpc(int npcId) + public int getPetItemsByNpc(int npcId) { return _pets.get(npcId).getItemId(); } diff --git a/trunk/java/com/l2jserver/gameserver/datatables/CharTemplateTable.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/PlayerTemplateData.java similarity index 79% rename from trunk/java/com/l2jserver/gameserver/datatables/CharTemplateTable.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/PlayerTemplateData.java index 2958724c10..09d2695793 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/CharTemplateTable.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/PlayerTemplateData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.HashMap; @@ -28,25 +28,25 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.templates.L2PcTemplate; import com.l2jserver.gameserver.model.base.ClassId; /** - * This will be reworked Soon(tm). + * Loads player's base stats. * @author Forsaiken, Zoey76, GKR */ -public final class CharTemplateTable implements DocumentParser +public final class PlayerTemplateData implements IXmlReader { - private static final Logger LOGGER = Logger.getLogger(CharTemplateTable.class.getName()); + private static final Logger LOGGER = Logger.getLogger(PlayerTemplateData.class.getName()); - private static final Map _charTemplates = new HashMap<>(); + private final Map _playerTemplates = new HashMap<>(); private int _dataCount = 0; - protected CharTemplateTable() + protected PlayerTemplateData() { load(); } @@ -54,9 +54,9 @@ public final class CharTemplateTable implements DocumentParser @Override public void load() { - _charTemplates.clear(); + _playerTemplates.clear(); parseDatapackDirectory("data/stats/chars/baseStats", false); - LOGGER.info(getClass().getSimpleName() + ": Loaded " + _charTemplates.size() + " character templates."); + LOGGER.info(getClass().getSimpleName() + ": Loaded " + _playerTemplates.size() + " character templates."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _dataCount + " level up gain records."); } @@ -142,7 +142,7 @@ public final class CharTemplateTable implements DocumentParser set.set("basePDef", (set.getInt("basePDefchest", 0) + set.getInt("basePDeflegs", 0) + set.getInt("basePDefhead", 0) + set.getInt("basePDeffeet", 0) + set.getInt("basePDefgloves", 0) + set.getInt("basePDefunderwear", 0) + set.getInt("basePDefcloak", 0))); set.set("baseMDef", (set.getInt("baseMDefrear", 0) + set.getInt("baseMDeflear", 0) + set.getInt("baseMDefrfinger", 0) + set.getInt("baseMDefrfinger", 0) + set.getInt("baseMDefneck", 0))); - _charTemplates.put(ClassId.getClassId(classId), new L2PcTemplate(set, creationPoints)); + _playerTemplates.put(ClassId.getClassId(classId), new L2PcTemplate(set, creationPoints)); } else if ("lvlUpgainData".equalsIgnoreCase(d.getNodeName())) { @@ -157,9 +157,9 @@ public final class CharTemplateTable implements DocumentParser { String nodeName = valNode.getNodeName(); - if ((nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _charTemplates.containsKey(ClassId.getClassId(classId))) + if ((nodeName.startsWith("hp") || nodeName.startsWith("mp") || nodeName.startsWith("cp")) && _playerTemplates.containsKey(ClassId.getClassId(classId))) { - _charTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); + _playerTemplates.get(ClassId.getClassId(classId)).setUpgainValue(nodeName, level, Double.parseDouble(valNode.getTextContent())); _dataCount++; } } @@ -171,23 +171,23 @@ public final class CharTemplateTable implements DocumentParser } } - public L2PcTemplate getTemplate(final ClassId classId) + public L2PcTemplate getTemplate(ClassId classId) { - return _charTemplates.get(classId); + return _playerTemplates.get(classId); } - public L2PcTemplate getTemplate(final int classId) + public L2PcTemplate getTemplate(int classId) { - return _charTemplates.get(ClassId.getClassId(classId)); + return _playerTemplates.get(ClassId.getClassId(classId)); } - public static final CharTemplateTable getInstance() + public static final PlayerTemplateData getInstance() { return SingletonHolder._instance; } private static class SingletonHolder { - protected static final CharTemplateTable _instance = new CharTemplateTable(); + protected static final PlayerTemplateData _instance = new PlayerTemplateData(); } } diff --git a/trunk/java/com/l2jserver/gameserver/datatables/PlayerXpPercentLostData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/PlayerXpPercentLostData.java similarity index 87% rename from trunk/java/com/l2jserver/gameserver/datatables/PlayerXpPercentLostData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/PlayerXpPercentLostData.java index 876e1b6982..f669fb20ad 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/PlayerXpPercentLostData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/PlayerXpPercentLostData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.Arrays; @@ -24,15 +24,15 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; /** * This class holds the Player Xp Percent Lost Data for each level for players. * @author Zealar */ -public final class PlayerXpPercentLostData implements DocumentParser +public final class PlayerXpPercentLostData implements IXmlReader { - private final int _maxlevel = ExperienceTable.getInstance().getMaxLevel(); + private final int _maxlevel = ExperienceData.getInstance().getMaxLevel(); private final double[] _playerXpPercentLost = new double[_maxlevel + 1]; protected PlayerXpPercentLostData() diff --git a/trunk/java/com/l2jserver/gameserver/datatables/RecipeData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/RecipeData.java similarity index 94% rename from trunk/java/com/l2jserver/gameserver/datatables/RecipeData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/RecipeData.java index 0d8f08dd7a..1074ce032b 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/RecipeData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/RecipeData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.HashMap; @@ -27,7 +27,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.L2RecipeInstance; import com.l2jserver.gameserver.model.L2RecipeList; import com.l2jserver.gameserver.model.L2RecipeStatInstance; @@ -38,9 +38,9 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; * The Class RecipeData. * @author Zoey76 */ -public class RecipeData implements DocumentParser +public class RecipeData implements IXmlReader { - private static final Map _recipes = new HashMap<>(); + private final Map _recipes = new HashMap<>(); /** * Instantiates a new recipe data. diff --git a/trunk/java/com/l2jserver/gameserver/datatables/SecondaryAuthData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/SecondaryAuthData.java similarity index 92% rename from trunk/java/com/l2jserver/gameserver/datatables/SecondaryAuthData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/SecondaryAuthData.java index 235ed305b8..0ffe07fe9c 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/SecondaryAuthData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/SecondaryAuthData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.io.File; import java.util.HashSet; @@ -26,18 +26,18 @@ import java.util.logging.Level; import org.w3c.dom.Document; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; /** * @author NosBit */ -public class SecondaryAuthData implements DocumentParser +public class SecondaryAuthData implements IXmlReader { + private final Set _forbiddenPasswords = new HashSet<>(); private boolean _enabled = false; private int _maxAttempts = 5; private int _banTime = 480; private String _recoveryLink = ""; - private final Set _forbiddenPasswords = new HashSet<>(); protected SecondaryAuthData() { diff --git a/trunk/java/com/l2jserver/gameserver/datatables/ShuttleData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ShuttleData.java similarity index 94% rename from trunk/java/com/l2jserver/gameserver/datatables/ShuttleData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/ShuttleData.java index ea37782617..cc5a93db97 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/ShuttleData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ShuttleData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.HashMap; @@ -28,7 +28,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.StatsSet; @@ -42,7 +42,7 @@ import com.l2jserver.gameserver.model.shuttle.L2ShuttleStop; /** * @author UnAfraid */ -public final class ShuttleData implements DocumentParser +public final class ShuttleData implements IXmlReader { private final Map _shuttles = new HashMap<>(); private final Map _shuttleInstances = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/SiegeScheduleData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/SiegeScheduleData.java similarity index 91% rename from trunk/java/com/l2jserver/gameserver/datatables/SiegeScheduleData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/SiegeScheduleData.java index 17c94db7a3..96186438ef 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/SiegeScheduleData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/SiegeScheduleData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.Calendar; @@ -27,7 +27,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.SiegeScheduleDate; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.util.Util; @@ -35,7 +35,7 @@ import com.l2jserver.gameserver.util.Util; /** * @author UnAfraid */ -public class SiegeScheduleData implements DocumentParser +public class SiegeScheduleData implements IXmlReader { private final List _scheduleData = new ArrayList<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/SkillLearnData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/SkillLearnData.java similarity index 91% rename from trunk/java/com/l2jserver/gameserver/datatables/SkillLearnData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/SkillLearnData.java index 5a60173c22..e14b6e1313 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/SkillLearnData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/SkillLearnData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.HashMap; @@ -26,14 +26,14 @@ import java.util.Map; import org.w3c.dom.Document; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.base.ClassId; /** * Holds all skill learn data for all npcs. * @author xban1x */ -public final class SkillLearnData implements DocumentParser +public final class SkillLearnData implements IXmlReader { private final Map> _skillLearn = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/SkillTreesData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/SkillTreesData.java similarity index 93% rename from trunk/java/com/l2jserver/gameserver/datatables/SkillTreesData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/SkillTreesData.java index aa4b32fc2a..d23fd28b72 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/SkillTreesData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/SkillTreesData.java @@ -16,13 +16,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -34,7 +35,9 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.l2jserver.Config; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; +import com.l2jserver.gameserver.datatables.SkillData; +import com.l2jserver.gameserver.enums.CategoryType; import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.enums.SubclassType; import com.l2jserver.gameserver.model.L2Clan; @@ -74,7 +77,7 @@ import com.l2jserver.gameserver.model.skills.Skill; * For XML schema please refer to skillTrees.xsd in datapack in xsd folder and for parameters documentation refer to documentation.txt in skillTrees folder.
* @author Zoey76 */ -public final class SkillTreesData implements DocumentParser +public final class SkillTreesData implements IXmlReader { // ClassId, FastMap of Skill Hash Code, L2SkillLearn private static final Map> _classSkillTrees = new HashMap<>(); @@ -97,6 +100,8 @@ public final class SkillTreesData implements DocumentParser private static final Map _heroSkillTree = new HashMap<>(); private static final Map _gameMasterSkillTree = new HashMap<>(); private static final Map _gameMasterAuraSkillTree = new HashMap<>(); + // Remove skill tree + private static final Map> _removeSkillCache = new HashMap<>(); // Checker, sorted arrays of hash codes private Map _skillsByClassIdHashCodes; // Occupation skills @@ -248,7 +253,9 @@ public final class SkillTreesData implements DocumentParser skillLearn.addSubclassConditions(parseInteger(attrs, "slot"), parseInteger(attrs, "lvl")); break; case "removeSkill": - skillLearn.addRemoveSkills(parseInteger(attrs, "id")); + final int removeSkillId = parseInteger(attrs, "id"); + skillLearn.addRemoveSkills(removeSkillId); + _removeSkillCache.computeIfAbsent(classId, k -> new HashSet<>()).add(removeSkillId); break; } } @@ -427,10 +434,6 @@ public final class SkillTreesData implements DocumentParser */ public Map getTransferSkillTree(ClassId classId) { - if (classId.level() >= 3) - { - return getTransferSkillTree(classId.getParent()); - } return _transferSkillTrees.get(classId); } @@ -655,9 +658,18 @@ public final class SkillTreesData implements DocumentParser return result; } - for (L2SkillLearn skill : skills.values()) + final boolean isAwaken = player.isInCategory(CategoryType.AWAKEN_GROUP); + + for (Entry entry : skills.entrySet()) { - if (((skill.getSkillId() == CommonSkill.DIVINE_INSPIRATION.getId()) && (!Config.AUTO_LEARN_DIVINE_INSPIRATION && includeAutoGet) && !player.isGM()) || (!includeAutoGet && skill.isAutoGet()) || (!includeByFs && skill.isLearnedByFS())) + final L2SkillLearn skill = entry.getValue(); + + if (((skill.getSkillId() == CommonSkill.DIVINE_INSPIRATION.getId()) && (!Config.AUTO_LEARN_DIVINE_INSPIRATION && includeAutoGet) && !player.isGM()) || (!includeAutoGet && skill.isAutoGet()) || (!includeByFs && skill.isLearnedByFS()) || isRemoveSkill(classId, skill.getSkillId())) + { + continue; + } + + if (isAwaken && !isCurrentClassSkillNoParent(classId, entry.getKey())) { continue; } @@ -877,12 +889,7 @@ public final class SkillTreesData implements DocumentParser public List getAvailableTransferSkills(L2PcInstance player) { final List result = new ArrayList<>(); - ClassId classId = player.getClassId(); - // If new classes are implemented over 3rd class, a different way should be implemented. - if (classId.level() == 3) - { - classId = classId.getParent(); - } + final ClassId classId = player.getClassId(); if (!_transferSkillTrees.containsKey(classId)) { @@ -1208,13 +1215,9 @@ public final class SkillTreesData implements DocumentParser */ public L2SkillLearn getTransferSkill(int id, int lvl, ClassId classId) { - if (classId.getParent() != null) + if (_transferSkillTrees.get(classId) != null) { - final ClassId parentId = classId.getParent(); - if (_transferSkillTrees.get(parentId) != null) - { - return _transferSkillTrees.get(parentId).get(SkillData.getSkillHashCode(id, lvl)); - } + return _transferSkillTrees.get(classId).get(SkillData.getSkillHashCode(id, lvl)); } return null; } @@ -1330,7 +1333,7 @@ public final class SkillTreesData implements DocumentParser { continue; } - if (minLevelForNewSkill == skill.getGetLevel()) + if (minLevelForNewSkill <= skill.getGetLevel()) { final Skill oldSkill = player.getKnownSkill(skill.getSkillId()); if (oldSkill != null) @@ -1350,6 +1353,20 @@ public final class SkillTreesData implements DocumentParser return result; } + public void cleanSkillUponAwakening(L2PcInstance player) + { + for (Skill skill : player.getAllSkills()) + { + final int maxLvl = SkillData.getInstance().getMaxLevel(skill.getId()); + final int hashCode = SkillData.getSkillHashCode(skill.getId(), maxLvl); + + if (!isCurrentClassSkillNoParent(player.getClassId(), hashCode) && !isRemoveSkill(player.getClassId(), skill.getId())) + { + player.removeSkill(skill, true, true); + } + } + } + /** * Checks if is hero skill. * @param skillId the Id of the skill to check @@ -1422,6 +1439,16 @@ public final class SkillTreesData implements DocumentParser return _subClassChangeSkillTree.containsKey(SkillData.getSkillHashCode(skillId, skillLevel)); } + public boolean isRemoveSkill(ClassId classId, int skillId) + { + return _removeSkillCache.getOrDefault(classId, Collections.emptySet()).contains(skillId); + } + + public boolean isCurrentClassSkillNoParent(ClassId classId, Integer hashCode) + { + return _classSkillTrees.getOrDefault(classId, Collections.emptyMap()).containsKey(hashCode); + } + /** * Adds the skills. * @param gmchar the player to add the Game Master skills diff --git a/trunk/java/com/l2jserver/gameserver/datatables/StaticObjects.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/StaticObjectData.java similarity index 85% rename from trunk/java/com/l2jserver/gameserver/datatables/StaticObjects.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/StaticObjectData.java index 6108e6a606..3f54167e33 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/StaticObjects.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/StaticObjectData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.Collection; import java.util.HashMap; @@ -26,7 +26,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.instance.L2StaticObjectInstance; @@ -36,14 +36,14 @@ import com.l2jserver.gameserver.model.actor.templates.L2CharTemplate; * This class loads and holds all static object data. * @author UnAfraid */ -public final class StaticObjects implements DocumentParser +public final class StaticObjectData implements IXmlReader { - private static final Map _staticObjects = new HashMap<>(); + private final Map _staticObjects = new HashMap<>(); /** * Instantiates a new static objects. */ - protected StaticObjects() + protected StaticObjectData() { load(); } @@ -111,13 +111,13 @@ public final class StaticObjects implements DocumentParser * Gets the single instance of StaticObjects. * @return single instance of StaticObjects */ - public static StaticObjects getInstance() + public static StaticObjectData getInstance() { return SingletonHolder._instance; } private static class SingletonHolder { - protected static final StaticObjects _instance = new StaticObjects(); + protected static final StaticObjectData _instance = new StaticObjectData(); } } diff --git a/trunk/java/com/l2jserver/gameserver/datatables/TeleportersData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/TeleportersData.java similarity index 92% rename from trunk/java/com/l2jserver/gameserver/datatables/TeleportersData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/TeleportersData.java index f4c5e3448e..4e9fcfff30 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/TeleportersData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/TeleportersData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -26,7 +26,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.teleporter.TeleportHolder; import com.l2jserver.gameserver.model.teleporter.TeleportLocation; @@ -35,7 +35,7 @@ import com.l2jserver.gameserver.model.teleporter.TeleportType; /** * @author UnAfraid */ -public class TeleportersData implements DocumentParser +public class TeleportersData implements IXmlReader { private final Map _teleporters = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/TransformData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/TransformData.java similarity index 94% rename from trunk/java/com/l2jserver/gameserver/datatables/TransformData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/TransformData.java index 56e7667784..35151a628b 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/TransformData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/TransformData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.HashMap; import java.util.Map; @@ -26,7 +26,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.transform.Transform; @@ -40,7 +40,7 @@ import com.l2jserver.gameserver.network.serverpackets.ExBasicActionList; /** * @author UnAfraid */ -public final class TransformData implements DocumentParser +public final class TransformData implements IXmlReader { private final Map _transformData = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/UIData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/UIData.java similarity index 92% rename from trunk/java/com/l2jserver/gameserver/datatables/UIData.java rename to trunk/java/com/l2jserver/gameserver/data/xml/impl/UIData.java index e9baf70438..885944977f 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/UIData.java +++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/UIData.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jserver.gameserver.datatables; +package com.l2jserver.gameserver.data.xml.impl; import java.util.ArrayList; import java.util.HashMap; @@ -27,14 +27,14 @@ import java.util.logging.Logger; import org.w3c.dom.Document; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.ActionKey; /** * UI Data parser. * @author Zoey76 */ -public class UIData implements DocumentParser +public class UIData implements IXmlReader { private static final Logger LOGGER = Logger.getLogger(UIData.class.getName()); diff --git a/trunk/java/com/l2jserver/gameserver/datatables/AugmentationData.java b/trunk/java/com/l2jserver/gameserver/datatables/AugmentationData.java index 4888426dca..baa59c8f83 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/AugmentationData.java +++ b/trunk/java/com/l2jserver/gameserver/datatables/AugmentationData.java @@ -33,6 +33,7 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.l2jserver.Config; +import com.l2jserver.gameserver.data.xml.impl.OptionData; import com.l2jserver.gameserver.model.L2Augmentation; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.items.L2Item; @@ -42,11 +43,12 @@ import com.l2jserver.gameserver.network.clientpackets.AbstractRefinePacket; import com.l2jserver.util.Rnd; /** - * This class manages the augmentation data and can also create new augmentations. + * Loads augmentation bonuses and skills. * @author durgus, Gigiikun, Sandro, UnAfraid */ public class AugmentationData { + // Zoey76: TODO: Implement using IXmlReader. private static final Logger LOGGER = Logger.getLogger(AugmentationData.class.getName()); // stats @@ -974,7 +976,7 @@ public class AugmentationData { // second augmentation (skill) stat34 = base + Rnd.get(skillsLength); - op = OptionsData.getInstance().getOptions(stat34); + op = OptionData.getInstance().getOptions(stat34); } if ((op == null) || (!op.hasActiveSkill() && !op.hasPassiveSkill() && !op.hasActivationSkills())) diff --git a/trunk/java/com/l2jserver/gameserver/datatables/BotReportTable.java b/trunk/java/com/l2jserver/gameserver/datatables/BotReportTable.java index dc78fec2bf..d8a2c36aca 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/BotReportTable.java +++ b/trunk/java/com/l2jserver/gameserver/datatables/BotReportTable.java @@ -53,6 +53,7 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage; */ public final class BotReportTable { + // Zoey76: TODO: Split XML parsing from SQL operations, use IXmlReader instead of SAXParser. private static final Logger LOGGER = Logger.getLogger(BotReportTable.class.getName()); private static final int COLUMN_BOT_ID = 1; diff --git a/trunk/java/com/l2jserver/gameserver/datatables/ItemTable.java b/trunk/java/com/l2jserver/gameserver/datatables/ItemTable.java index db61dd6339..6755b89d88 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/ItemTable.java +++ b/trunk/java/com/l2jserver/gameserver/datatables/ItemTable.java @@ -34,6 +34,7 @@ import javolution.util.FastMap; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemHPBonusData; import com.l2jserver.gameserver.engines.DocumentEngine; import com.l2jserver.gameserver.enums.ItemLocation; import com.l2jserver.gameserver.idfactory.IdFactory; @@ -298,24 +299,6 @@ public class ItemTable return createItem(process, itemId, count, actor, null); } - /** - * Returns a dummy item.
- * Concept :
- * Dummy item is created by setting the ID of the object in the world at null value - * @param itemId : int designating the item - * @return L2ItemInstance designating the dummy item created - */ - public L2ItemInstance createDummyItem(int itemId) - { - L2Item item = getTemplate(itemId); - if (item == null) - { - return null; - } - L2ItemInstance temp = new L2ItemInstance(0, item); - return temp; - } - /** * Destroys the L2ItemInstance.
* Actions : diff --git a/trunk/java/com/l2jserver/gameserver/datatables/MerchantPriceConfigTable.java b/trunk/java/com/l2jserver/gameserver/datatables/MerchantPriceConfigTable.java index f25bde361f..645366c061 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/MerchantPriceConfigTable.java +++ b/trunk/java/com/l2jserver/gameserver/datatables/MerchantPriceConfigTable.java @@ -44,6 +44,7 @@ import com.l2jserver.gameserver.model.entity.Castle; */ public class MerchantPriceConfigTable implements InstanceListManager { + // Zoey76: TODO: Implement using IXmlReader. private static Logger LOGGER = Logger.getLogger(MerchantPriceConfigTable.class.getName()); public static MerchantPriceConfigTable getInstance() diff --git a/trunk/java/com/l2jserver/gameserver/datatables/SkillData.java b/trunk/java/com/l2jserver/gameserver/datatables/SkillData.java index 4d9d6f9b29..3bc847f2eb 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/SkillData.java +++ b/trunk/java/com/l2jserver/gameserver/datatables/SkillData.java @@ -28,6 +28,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.l2jserver.Config; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.engines.DocumentEngine; import com.l2jserver.gameserver.model.skills.CommonSkill; import com.l2jserver.gameserver.model.skills.Skill; @@ -183,4 +184,4 @@ public final class SkillData { protected static final SkillData _instance = new SkillData(); } -} \ No newline at end of file +} diff --git a/trunk/java/com/l2jserver/gameserver/datatables/SpawnTable.java b/trunk/java/com/l2jserver/gameserver/datatables/SpawnTable.java index e748c76658..9a3ba60f18 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/SpawnTable.java +++ b/trunk/java/com/l2jserver/gameserver/datatables/SpawnTable.java @@ -39,7 +39,8 @@ import org.w3c.dom.Node; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.instancemanager.DayNightSpawnManager; import com.l2jserver.gameserver.instancemanager.ZoneManager; import com.l2jserver.gameserver.model.L2Spawn; @@ -50,7 +51,7 @@ import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; * Spawn data retriever. * @author Zoey76 */ -public final class SpawnTable implements DocumentParser +public final class SpawnTable implements IXmlReader { private static final Logger LOGGER = Logger.getLogger(SpawnTable.class.getName()); // SQL diff --git a/trunk/java/com/l2jserver/gameserver/engines/DocumentBase.java b/trunk/java/com/l2jserver/gameserver/engines/DocumentBase.java index 3f7e17d9d6..78e9615f74 100644 --- a/trunk/java/com/l2jserver/gameserver/engines/DocumentBase.java +++ b/trunk/java/com/l2jserver/gameserver/engines/DocumentBase.java @@ -61,7 +61,8 @@ import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanCreateBase; import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanEscape; import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanRefuelAirship; import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanResurrect; -import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanSummon; +import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanSummonPet; +import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanSummonServitor; import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanSummonSiegeGolem; import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanSweep; import com.l2jserver.gameserver.model.conditions.ConditionPlayerCanSwitchSubclass; @@ -79,6 +80,7 @@ import com.l2jserver.gameserver.model.conditions.ConditionPlayerGrade; import com.l2jserver.gameserver.model.conditions.ConditionPlayerHasCastle; import com.l2jserver.gameserver.model.conditions.ConditionPlayerHasClanHall; import com.l2jserver.gameserver.model.conditions.ConditionPlayerHasFort; +import com.l2jserver.gameserver.model.conditions.ConditionPlayerHasFreeSummonPoints; import com.l2jserver.gameserver.model.conditions.ConditionPlayerHasPet; import com.l2jserver.gameserver.model.conditions.ConditionPlayerHp; import com.l2jserver.gameserver.model.conditions.ConditionPlayerImmobile; @@ -847,9 +849,19 @@ public abstract class DocumentBase cond = joinAnd(cond, new ConditionPlayerCanResurrect(Boolean.parseBoolean(a.getNodeValue()))); break; } - case "cansummon": + case "cansummonpet": { - cond = joinAnd(cond, new ConditionPlayerCanSummon(Boolean.parseBoolean(a.getNodeValue()))); + cond = joinAnd(cond, new ConditionPlayerCanSummonPet(Boolean.parseBoolean(a.getNodeValue()))); + break; + } + case "cansummonservitor": + { + cond = joinAnd(cond, new ConditionPlayerCanSummonServitor(Boolean.parseBoolean(a.getNodeValue()))); + break; + } + case "hasfreesummonpoints": + { + cond = joinAnd(cond, new ConditionPlayerHasFreeSummonPoints(Integer.parseInt(a.getNodeValue()))); break; } case "cansummonsiegegolem": diff --git a/trunk/java/com/l2jserver/gameserver/engines/skills/DocumentSkill.java b/trunk/java/com/l2jserver/gameserver/engines/skills/DocumentSkill.java index 6c263127a1..14e40e073c 100644 --- a/trunk/java/com/l2jserver/gameserver/engines/skills/DocumentSkill.java +++ b/trunk/java/com/l2jserver/gameserver/engines/skills/DocumentSkill.java @@ -28,7 +28,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; import com.l2jserver.gameserver.engines.DocumentBase; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.conditions.Condition; diff --git a/trunk/java/com/l2jserver/gameserver/enums/MountType.java b/trunk/java/com/l2jserver/gameserver/enums/MountType.java index 3a89b2c127..b9cbcfbfe6 100644 --- a/trunk/java/com/l2jserver/gameserver/enums/MountType.java +++ b/trunk/java/com/l2jserver/gameserver/enums/MountType.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.enums; -import com.l2jserver.gameserver.datatables.CategoryData; +import com.l2jserver.gameserver.data.xml.impl.CategoryData; /** * @author UnAfraid diff --git a/trunk/java/com/l2jserver/gameserver/geoeditorcon/GeoEditorListener.java b/trunk/java/com/l2jserver/gameserver/geoeditorcon/GeoEditorListener.java deleted file mode 100644 index ebbe778840..0000000000 --- a/trunk/java/com/l2jserver/gameserver/geoeditorcon/GeoEditorListener.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2004-2015 L2J Server - * - * This file is part of L2J Server. - * - * L2J Server is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * L2J Server is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jserver.gameserver.geoeditorcon; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author Dezmond - */ -public class GeoEditorListener extends Thread -{ - private static GeoEditorListener _instance; - private static final int PORT = 9011; - private static final Logger _log = Logger.getLogger(GeoEditorListener.class.getName()); - private final ServerSocket _serverSocket; - private GeoEditorThread _geoEditor; - - public static GeoEditorListener getInstance() - { - synchronized (GeoEditorListener.class) - { - if (_instance == null) - { - try - { - _instance = new GeoEditorListener(); - _instance.start(); - _log.info("GeoEditorListener Initialized."); - } - catch (IOException e) - { - _log.log(Level.SEVERE, "Error creating geoeditor listener! " + e.getMessage(), e); - System.exit(1); - } - } - } - return _instance; - } - - private GeoEditorListener() throws IOException - { - _serverSocket = new ServerSocket(PORT); - } - - public GeoEditorThread getThread() - { - return _geoEditor; - } - - public String getStatus() - { - if ((_geoEditor != null) && _geoEditor.isWorking()) - { - return "Geoeditor connected."; - } - return "Geoeditor not connected."; - } - - @Override - public void run() - { - try (Socket connection = _serverSocket.accept()) - { - while (!isInterrupted()) - { - if ((_geoEditor != null) && _geoEditor.isWorking()) - { - _log.warning("Geoeditor already connected!"); - connection.close(); - continue; - } - _log.info("Received geoeditor connection from: " + connection.getInetAddress().getHostAddress()); - _geoEditor = new GeoEditorThread(connection); - _geoEditor.start(); - } - } - catch (Exception e) - { - _log.log(Level.WARNING, "GeoEditorListener: " + e.getMessage(), e); - } - finally - { - try - { - _serverSocket.close(); - } - catch (Exception e) - { - _log.log(Level.WARNING, "GeoEditorListener: " + e.getMessage(), e); - } - _log.warning("GeoEditorListener Closed!"); - } - } -} diff --git a/trunk/java/com/l2jserver/gameserver/geoeditorcon/GeoEditorThread.java b/trunk/java/com/l2jserver/gameserver/geoeditorcon/GeoEditorThread.java deleted file mode 100644 index 8c109f96f6..0000000000 --- a/trunk/java/com/l2jserver/gameserver/geoeditorcon/GeoEditorThread.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (C) 2004-2015 L2J Server - * - * This file is part of L2J Server. - * - * L2J Server is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * L2J Server is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jserver.gameserver.geoeditorcon; - -import java.io.IOException; -import java.io.OutputStream; -import java.net.Socket; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javolution.util.FastList; - -import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; - -/** - * @author Luno, Dezmond - */ -public class GeoEditorThread extends Thread -{ - private static Logger _log = Logger.getLogger(GeoEditorThread.class.getName()); - - private boolean _working = false; - - private int _mode = 0; // 0 - don't send coords, 1 - send each - - // validateposition from client, 2 - send in intervals of _sendDelay ms. - private int _sendDelay = 1000; // default - once in second - - private final Socket _geSocket; - - private OutputStream _out; - - private final FastList _gms; - - public GeoEditorThread(Socket ge) - { - _geSocket = ge; - _working = true; - _gms = new FastList<>(); - } - - @Override - public void interrupt() - { - try - { - _geSocket.close(); - } - catch (Exception e) - { - } - super.interrupt(); - } - - @Override - public void run() - { - try - { - _out = _geSocket.getOutputStream(); - int timer = 0; - - while (_working) - { - if (!isConnected()) - { - _working = false; - } - - if ((_mode == 2) && (timer > _sendDelay)) - { - for (L2PcInstance gm : _gms) - { - if (!gm.getClient().getConnection().isClosed()) - { - sendGmPosition(gm); - } - else - { - _gms.remove(gm); - } - } - timer = 0; - } - - try - { - sleep(100); - if (_mode == 2) - { - timer += 100; - } - } - catch (Exception e) - { - } - } - } - catch (Exception e) - { - _log.log(Level.WARNING, "GeoEditor disconnected. " + e.getMessage(), e); - } - finally - { - try - { - _geSocket.close(); - } - catch (Exception e) - { - } - _working = false; - } - } - - public void sendGmPosition(int gx, int gy, short z) - { - if (!isConnected()) - { - return; - } - try - { - synchronized (_out) - { - writeC(0x0b); // length 11 bytes! - writeC(0x01); // Cmd = save cell; - writeD(gx); // Global coord X; - writeD(gy); // Global coord Y; - writeH(z); // Coord Z; - _out.flush(); - } - } - catch (Exception e) - { - _log.log(Level.WARNING, "GeoEditor disconnected. " + e.getMessage(), e); - _working = false; - } - finally - { - try - { - _geSocket.close(); - } - catch (Exception ex) - { - } - _working = false; - } - } - - public void sendGmPosition(L2PcInstance _gm) - { - sendGmPosition(_gm.getX(), _gm.getY(), (short) _gm.getZ()); - } - - public void sendPing() - { - if (!isConnected()) - { - return; - } - try - { - synchronized (_out) - { - writeC(0x01); // length 1 byte! - writeC(0x02); // Cmd = ping (dummy packet for connection - // test); - _out.flush(); - } - } - catch (Exception e) - { - _log.log(Level.WARNING, "GeoEditor disconnected. " + e.getMessage(), e); - _working = false; - } - finally - { - try - { - _geSocket.close(); - } - catch (Exception ex) - { - } - _working = false; - } - } - - private void writeD(int value) throws IOException - { - _out.write(value & 0xff); - _out.write((value >> 8) & 0xff); - _out.write((value >> 16) & 0xff); - _out.write((value >> 24) & 0xff); - } - - private void writeH(int value) throws IOException - { - _out.write(value & 0xff); - _out.write((value >> 8) & 0xff); - } - - private void writeC(int value) throws IOException - { - _out.write(value & 0xff); - } - - public void setMode(int value) - { - _mode = value; - } - - public void setTimer(int value) - { - if (value < 500) - { - _sendDelay = 500; // maximum - 2 times per second! - } - else if (value > 60000) - { - _sendDelay = 60000; // Minimum - 1 time per minute. - } - else - { - _sendDelay = value; - } - } - - public void addGM(L2PcInstance gm) - { - if (!_gms.contains(gm)) - { - _gms.add(gm); - } - } - - public void removeGM(L2PcInstance gm) - { - if (_gms.contains(gm)) - { - _gms.remove(gm); - } - } - - public boolean isSend(L2PcInstance gm) - { - if ((_mode == 1) && _gms.contains(gm)) - { - return true; - } - return false; - } - - private boolean isConnected() - { - return _geSocket.isConnected() && !_geSocket.isClosed(); - } - - public boolean isWorking() - { - sendPing(); - return _working; - } - - public int getMode() - { - return _mode; - } -} diff --git a/trunk/java/com/l2jserver/gameserver/idfactory/IdFactory.java b/trunk/java/com/l2jserver/gameserver/idfactory/IdFactory.java index cd58a61beb..6c9842e10a 100644 --- a/trunk/java/com/l2jserver/gameserver/idfactory/IdFactory.java +++ b/trunk/java/com/l2jserver/gameserver/idfactory/IdFactory.java @@ -107,7 +107,8 @@ public abstract class IdFactory "SELECT ally_id FROM clan_data WHERE ally_id >= ? AND ally_id < ?", "SELECT leader_id FROM clan_data WHERE leader_id >= ? AND leader_id < ?", "SELECT item_obj_id FROM pets WHERE item_obj_id >= ? AND item_obj_id < ?", - "SELECT object_id FROM itemsonground WHERE object_id >= ? AND object_id < ?" + "SELECT object_id FROM itemsonground WHERE object_id >= ? AND object_id < ?", + "SELECT summonId FROM characters_summons WHERE summonId >= ? AND summonId < ?" }; //@formatter:off diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/CastleManorManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/CastleManorManager.java index 5fb6b2792c..7b5e38ea93 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/CastleManorManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/CastleManorManager.java @@ -40,7 +40,7 @@ import org.w3c.dom.Node; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.enums.ManorMode; import com.l2jserver.gameserver.model.CropProcure; import com.l2jserver.gameserver.model.L2Clan; @@ -58,7 +58,7 @@ import com.l2jserver.util.Rnd; * Castle manor system. * @author malyelfik */ -public final class CastleManorManager implements DocumentParser, IStorable +public final class CastleManorManager implements IXmlReader, IStorable { // SQL queries private static final String INSERT_PRODUCT = "INSERT INTO castle_manor_production VALUES (?, ?, ?, ?, ?, ?)"; diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/ClanHallManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/ClanHallManager.java index 4f47a4b5f5..f396f0768b 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/ClanHallManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/ClanHallManager.java @@ -28,7 +28,7 @@ import java.util.logging.Logger; import javolution.util.FastMap; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.StatsSet; diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/FortSiegeGuardManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/FortSiegeGuardManager.java index 344047d7d4..172494f980 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/FortSiegeGuardManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/FortSiegeGuardManager.java @@ -28,7 +28,7 @@ import javolution.util.FastList; import javolution.util.FastMap; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.entity.Fort; diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/FourSepulchersManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/FourSepulchersManager.java index 000a1d9d34..72d6529e63 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/FourSepulchersManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/FourSepulchersManager.java @@ -37,8 +37,8 @@ import javolution.util.FastMap; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.DoorTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.DoorData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SpawnTable; import com.l2jserver.gameserver.instancemanager.tasks.FourSepulchersChangeAttackTimeTask; import com.l2jserver.gameserver.instancemanager.tasks.FourSepulchersChangeCoolDownTimeTask; @@ -1501,7 +1501,7 @@ public final class FourSepulchersManager { try { - L2DoorInstance door = DoorTable.getInstance().getDoor(doorId); + L2DoorInstance door = DoorData.getInstance().getDoor(doorId); if (door != null) { door.closeMe(); diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/GrandBossManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/GrandBossManager.java index d848da6fac..cd8283ef77 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/GrandBossManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/GrandBossManager.java @@ -37,7 +37,7 @@ import javolution.util.FastMap; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.instancemanager.tasks.GrandBossManagerStoreTask; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.Location; diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/InstanceManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/InstanceManager.java index a67bd1945a..d2b93b3906 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/InstanceManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/InstanceManager.java @@ -32,7 +32,7 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.Instance; import com.l2jserver.gameserver.model.instancezone.InstanceWorld; @@ -40,7 +40,7 @@ import com.l2jserver.gameserver.model.instancezone.InstanceWorld; /** * @author evill33t, GodKratos */ -public final class InstanceManager implements DocumentParser +public final class InstanceManager implements IXmlReader { private static final Map _instanceList = new FastMap<>(); private final Map _instanceWorlds = new FastMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/MapRegionManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/MapRegionManager.java index 3fe4b62c01..e0bee1e412 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/MapRegionManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/MapRegionManager.java @@ -27,7 +27,7 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.l2jserver.Config; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.L2MapRegion; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.Location; @@ -46,7 +46,7 @@ import com.l2jserver.gameserver.model.zone.type.L2RespawnZone; /** * @author Nyaran */ -public final class MapRegionManager implements DocumentParser +public final class MapRegionManager implements IXmlReader { private static final Map _regions = new HashMap<>(); private static final String defaultRespawn = "talking_island_town"; diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/MercTicketManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/MercTicketManager.java index f8f110a6fb..9f418ff415 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/MercTicketManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/MercTicketManager.java @@ -29,7 +29,7 @@ import java.util.logging.Logger; import javolution.util.FastList; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.enums.ItemLocation; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.L2World; diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/PetitionManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/PetitionManager.java index a911b02a64..c32acc0433 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/PetitionManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/PetitionManager.java @@ -25,7 +25,7 @@ import java.util.Map; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.enums.PetitionState; import com.l2jserver.gameserver.model.Petition; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -425,7 +425,7 @@ public final class PetitionManager // Notify all GMs that a new petition has been submitted. final String msgContent = petitioner.getName() + " has submitted a new petition."; // (ID: " + newPetitionId + ")."; - AdminTable.getInstance().broadcastToGMs(new CreatureSay(petitioner.getObjectId(), Say2.HERO_VOICE, "Petition System", msgContent)); + AdminData.getInstance().broadcastToGMs(new CreatureSay(petitioner.getObjectId(), Say2.HERO_VOICE, "Petition System", msgContent)); return newPetitionId; } diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/RaidBossSpawnManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/RaidBossSpawnManager.java index 285482dac6..5de4c4adbe 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/RaidBossSpawnManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/RaidBossSpawnManager.java @@ -33,7 +33,7 @@ import javolution.util.FastMap; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SpawnTable; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.StatsSet; diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/SiegeGuardManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/SiegeGuardManager.java index 81ac956462..916ca2b3df 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/SiegeGuardManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/SiegeGuardManager.java @@ -28,7 +28,7 @@ import java.util.logging.Logger; import javolution.util.FastList; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/WalkingManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/WalkingManager.java index f0e84936c0..b10fdaadb9 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/WalkingManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/WalkingManager.java @@ -29,7 +29,7 @@ import org.w3c.dom.Node; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.instancemanager.tasks.StartMovingTask; import com.l2jserver.gameserver.model.L2NpcWalkerNode; import com.l2jserver.gameserver.model.L2WalkRoute; @@ -50,7 +50,7 @@ import com.l2jserver.gameserver.util.Broadcast; * This class manages walking monsters. * @author GKR */ -public final class WalkingManager implements DocumentParser +public final class WalkingManager implements IXmlReader { // Repeat style: // 0 - go back diff --git a/trunk/java/com/l2jserver/gameserver/instancemanager/ZoneManager.java b/trunk/java/com/l2jserver/gameserver/instancemanager/ZoneManager.java index 19b5f09a19..361f2569b6 100644 --- a/trunk/java/com/l2jserver/gameserver/instancemanager/ZoneManager.java +++ b/trunk/java/com/l2jserver/gameserver/instancemanager/ZoneManager.java @@ -32,7 +32,7 @@ import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; -import com.l2jserver.gameserver.engines.DocumentParser; +import com.l2jserver.gameserver.data.xml.IXmlReader; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.L2WorldRegion; @@ -54,7 +54,7 @@ import com.l2jserver.gameserver.model.zone.type.NpcSpawnTerritory; * This class manages the zones * @author durgus */ -public final class ZoneManager implements DocumentParser +public final class ZoneManager implements IXmlReader { private static final Map _settings = new HashMap<>(); diff --git a/trunk/java/com/l2jserver/gameserver/model/AutoSpawnHandler.java b/trunk/java/com/l2jserver/gameserver/model/AutoSpawnHandler.java index 4c01926d22..6fabbb4e15 100644 --- a/trunk/java/com/l2jserver/gameserver/model/AutoSpawnHandler.java +++ b/trunk/java/com/l2jserver/gameserver/model/AutoSpawnHandler.java @@ -34,7 +34,7 @@ import javolution.util.FastMap; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SpawnTable; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.instancemanager.MapRegionManager; diff --git a/trunk/java/com/l2jserver/gameserver/model/BlockList.java b/trunk/java/com/l2jserver/gameserver/model/BlockList.java index 27d355b184..c955202250 100644 --- a/trunk/java/com/l2jserver/gameserver/model/BlockList.java +++ b/trunk/java/com/l2jserver/gameserver/model/BlockList.java @@ -30,7 +30,7 @@ import java.util.logging.Logger; import javolution.util.FastMap; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.BlockListPacket; diff --git a/trunk/java/com/l2jserver/gameserver/model/CursedWeapon.java b/trunk/java/com/l2jserver/gameserver/model/CursedWeapon.java index f42dc92097..d2a02616ba 100644 --- a/trunk/java/com/l2jserver/gameserver/model/CursedWeapon.java +++ b/trunk/java/com/l2jserver/gameserver/model/CursedWeapon.java @@ -28,8 +28,8 @@ import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; +import com.l2jserver.gameserver.data.xml.impl.TransformData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.TransformData; import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager; import com.l2jserver.gameserver.model.L2Party.messageType; import com.l2jserver.gameserver.model.actor.L2Attackable; diff --git a/trunk/java/com/l2jserver/gameserver/model/L2AccessLevel.java b/trunk/java/com/l2jserver/gameserver/model/L2AccessLevel.java index e1ea3bde87..58b7c44717 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2AccessLevel.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2AccessLevel.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.model; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; /** * @author HorridoJoho @@ -222,7 +222,7 @@ public class L2AccessLevel return false; } - _childsAccessLevel = AdminTable.getInstance().getAccessLevel(_child); + _childsAccessLevel = AdminData.getInstance().getAccessLevel(_child); } return ((_childsAccessLevel.getLevel() == accessLevel.getLevel()) || _childsAccessLevel.hasChildAccess(accessLevel)); } diff --git a/trunk/java/com/l2jserver/gameserver/model/L2AdminCommandAccessRight.java b/trunk/java/com/l2jserver/gameserver/model/L2AdminCommandAccessRight.java index e0ea4351c0..7a9f0b9d3e 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2AdminCommandAccessRight.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2AdminCommandAccessRight.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.model; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; /** * @author HorridoJoho @@ -57,7 +57,7 @@ public class L2AdminCommandAccessRight */ public boolean hasAccess(L2AccessLevel characterAccessLevel) { - L2AccessLevel accessLevel = AdminTable.getInstance().getAccessLevel(_accessLevel); + L2AccessLevel accessLevel = AdminData.getInstance().getAccessLevel(_accessLevel); return ((accessLevel.getLevel() == characterAccessLevel.getLevel()) || characterAccessLevel.hasChildAccess(accessLevel)); } diff --git a/trunk/java/com/l2jserver/gameserver/model/L2Augmentation.java b/trunk/java/com/l2jserver/gameserver/model/L2Augmentation.java index 7949aabb1f..976fd2e4b4 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2Augmentation.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2Augmentation.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import com.l2jserver.gameserver.datatables.OptionsData; +import com.l2jserver.gameserver.data.xml.impl.OptionData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.options.Options; @@ -57,7 +57,7 @@ public final class L2Augmentation for (int stat : stats) { - Options op = OptionsData.getInstance().getOptions(stat); + Options op = OptionData.getInstance().getOptions(stat); if (op != null) { _options.add(op); diff --git a/trunk/java/com/l2jserver/gameserver/model/L2Clan.java b/trunk/java/com/l2jserver/gameserver/model/L2Clan.java index 2319e203bd..b70dd85463 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2Clan.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2Clan.java @@ -36,9 +36,9 @@ import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.communitybbs.BB.Forum; import com.l2jserver.gameserver.communitybbs.Manager.ForumsBBSManager; -import com.l2jserver.gameserver.datatables.CharNameTable; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.CrestTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.CrestTable; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.enums.UserInfoType; import com.l2jserver.gameserver.instancemanager.CastleManager; diff --git a/trunk/java/com/l2jserver/gameserver/model/L2ContactList.java b/trunk/java/com/l2jserver/gameserver/model/L2ContactList.java index 33920b15e0..15bfc3ecb8 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2ContactList.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2ContactList.java @@ -28,7 +28,7 @@ import java.util.logging.Logger; import javolution.util.FastList; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; diff --git a/trunk/java/com/l2jserver/gameserver/model/L2EnchantSkillLearn.java b/trunk/java/com/l2jserver/gameserver/model/L2EnchantSkillLearn.java index f26a4f815b..e3c4dbd71a 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2EnchantSkillLearn.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2EnchantSkillLearn.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.model; import java.util.Set; import java.util.TreeMap; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; import com.l2jserver.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder; public final class L2EnchantSkillLearn diff --git a/trunk/java/com/l2jserver/gameserver/model/L2GroupSpawn.java b/trunk/java/com/l2jserver/gameserver/model/L2GroupSpawn.java index 3e19a4c38c..e7d9eee6ca 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2GroupSpawn.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2GroupSpawn.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.model; import java.util.logging.Level; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.TerritoryTable; +import com.l2jserver.gameserver.data.sql.impl.TerritoryTable; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2ControllableMobInstance; diff --git a/trunk/java/com/l2jserver/gameserver/model/L2ManufactureItem.java b/trunk/java/com/l2jserver/gameserver/model/L2ManufactureItem.java index 9285753cc4..79f80e6433 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2ManufactureItem.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2ManufactureItem.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.model; -import com.l2jserver.gameserver.datatables.RecipeData; +import com.l2jserver.gameserver.data.xml.impl.RecipeData; public class L2ManufactureItem { diff --git a/trunk/java/com/l2jserver/gameserver/model/L2Object.java b/trunk/java/com/l2jserver/gameserver/model/L2Object.java index 041970f9fc..3dfe896a46 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2Object.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2Object.java @@ -33,6 +33,7 @@ import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.instancemanager.InstanceManager; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.knownlist.ObjectKnownList; import com.l2jserver.gameserver.model.actor.poly.ObjectPoly; @@ -834,10 +835,12 @@ public abstract class L2Object extends ListenersContainer implements IIdentifiab sendInstanceUpdate(newI, false); } } - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - player.getSummon().setInstanceId(instanceId); + pet.setInstanceId(instanceId); } + player.getServitors().values().forEach(s -> s.setInstanceId(instanceId)); } else if (isNpc()) { @@ -1017,4 +1020,4 @@ public abstract class L2Object extends ListenersContainer implements IIdentifiab { return (getClass().getSimpleName() + ":" + getName() + "[" + getObjectId() + "]"); } -} \ No newline at end of file +} diff --git a/trunk/java/com/l2jserver/gameserver/model/L2Party.java b/trunk/java/com/l2jserver/gameserver/model/L2Party.java index 9794c98a4e..a12405ba84 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2Party.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2Party.java @@ -299,9 +299,14 @@ public class L2Party extends AbstractPlayerGroup // sends pets/summons of party members for (L2PcInstance pMember : getMembers()) { - if ((pMember != null) && pMember.hasSummon()) + if (pMember != null) { - player.sendPacket(new ExPartyPetWindowAdd(pMember.getSummon())); + final L2Summon pet = pMember.getPet(); + if (pet != null) + { + player.sendPacket(new ExPartyPetWindowAdd(pet)); + } + pMember.getServitors().values().forEach(s -> player.sendPacket(new ExPartyPetWindowAdd(s))); } } @@ -319,11 +324,14 @@ public class L2Party extends AbstractPlayerGroup // broadcastToPartyMembers(player, new PartyMemberPosition(this)); // if member has pet/summon add it to other as well - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - broadcastPacket(new ExPartyPetWindowAdd(player.getSummon())); + broadcastPacket(new ExPartyPetWindowAdd(pet)); } + player.getServitors().values().forEach(s -> broadcastPacket(new ExPartyPetWindowAdd(s))); + // add player to party, adjust party level getMembers().add(player); if (player.getLevel() > _partyLvl) @@ -338,12 +346,13 @@ public class L2Party extends AbstractPlayerGroup if (member != null) { member.updateEffectIcons(true); // update party icons only - summon = member.getSummon(); + summon = member.getPet(); member.broadcastUserInfo(); if (summon != null) { summon.updateEffectIcons(); } + member.getServitors().values().forEach(L2Summon::updateEffectIcons); } } @@ -519,10 +528,12 @@ public class L2Party extends AbstractPlayerGroup player.sendPacket(PartySmallWindowDeleteAll.STATIC_PACKET); player.setParty(null); broadcastPacket(new PartySmallWindowDelete(player)); - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - broadcastPacket(new ExPartyPetWindowDelete(player.getSummon())); + broadcastPacket(new ExPartyPetWindowDelete(pet)); } + player.getServitors().values().forEach(s -> player.sendPacket(new ExPartyPetWindowDelete(s))); // Close the CCInfoWindow if (isInCommandChannel()) @@ -827,7 +838,13 @@ public class L2Party extends AbstractPlayerGroup if (validMembers.contains(member)) { // The servitor penalty - final float penalty = member.hasServitor() ? ((L2ServitorInstance) member.getSummon()).getExpMultiplier() : 1; + float penalty = 1; + + final L2Summon summon = member.getServitors().values().stream().filter(s -> ((L2ServitorInstance) s).getExpMultiplier() > 1).findFirst().orElse(null); + if (summon != null) + { + penalty = ((L2ServitorInstance) summon).getExpMultiplier(); + } final double sqLevel = member.getLevel() * member.getLevel(); final double preCalculation = (sqLevel / sqLevelSum) * penalty; diff --git a/trunk/java/com/l2jserver/gameserver/model/L2SkillLearn.java b/trunk/java/com/l2jserver/gameserver/model/L2SkillLearn.java index 3c6b667af7..61fc01c960 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2SkillLearn.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2SkillLearn.java @@ -50,7 +50,7 @@ public final class L2SkillLearn private final List _subClassLvlNumber = new ArrayList<>(); private final boolean _learnedByNpc; private final boolean _learnedByFS; - private final Set _removeSkills = new HashSet<>(); + private final Set _removeSkills = new HashSet<>(1); public class SubClassData { diff --git a/trunk/java/com/l2jserver/gameserver/model/L2Spawn.java b/trunk/java/com/l2jserver/gameserver/model/L2Spawn.java index 545aef2b5e..a0c155357c 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2Spawn.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2Spawn.java @@ -30,8 +30,8 @@ import javolution.util.FastList; import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ThreadPoolManager; +import com.l2jserver.gameserver.data.sql.impl.TerritoryTable; import com.l2jserver.gameserver.datatables.NpcPersonalAIData; -import com.l2jserver.gameserver.datatables.TerritoryTable; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Npc; @@ -606,7 +606,7 @@ public class L2Spawn implements IPositionable, IIdentifiable, INamable isQuestMonster = true; } - if (mob.isMonster() && !isQuestMonster && !mob.isWalker() && (Config.GEODATA > 0) && GeoData.getInstance().canSeeTarget(newlocx, newlocy, newlocz, randX, randY, newlocz) && (getInstanceId() == 0) && !getTemplate().isUndying() && !mob.isRaid() && !mob.isRaidMinion() && !Config.MOBS_LIST_NOT_RANDOM.contains(mob.getId())) + if (mob.isMonster() && !isQuestMonster && !mob.isWalker() && GeoData.getInstance().canSeeTarget(newlocx, newlocy, newlocz, randX, randY, newlocz) && (getInstanceId() == 0) && !getTemplate().isUndying() && !mob.isRaid() && !mob.isRaidMinion() && !Config.MOBS_LIST_NOT_RANDOM.contains(mob.getId())) { newlocx = randX; newlocy = randY; diff --git a/trunk/java/com/l2jserver/gameserver/model/L2World.java b/trunk/java/com/l2jserver/gameserver/model/L2World.java index 1729074750..31706124bd 100644 --- a/trunk/java/com/l2jserver/gameserver/model/L2World.java +++ b/trunk/java/com/l2jserver/gameserver/model/L2World.java @@ -29,8 +29,8 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.model.actor.L2Playable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PetInstance; @@ -161,7 +161,7 @@ public final class L2World public List getAllGMs() { - return AdminTable.getInstance().getAllGms(true); + return AdminData.getInstance().getAllGms(true); } public Collection getPlayers() diff --git a/trunk/java/com/l2jserver/gameserver/model/TradeList.java b/trunk/java/com/l2jserver/gameserver/model/TradeList.java index 6b03743c14..4317b7c1fe 100644 --- a/trunk/java/com/l2jserver/gameserver/model/TradeList.java +++ b/trunk/java/com/l2jserver/gameserver/model/TradeList.java @@ -34,6 +34,7 @@ import com.l2jserver.gameserver.model.itemcontainer.PcInventory; import com.l2jserver.gameserver.model.items.L2Item; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.ExAdenaInvenCount; import com.l2jserver.gameserver.network.serverpackets.ExUserInfoInvenWeight; import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate; import com.l2jserver.gameserver.network.serverpackets.ItemList; @@ -657,7 +658,9 @@ public class TradeList // Update current load as well _owner.sendPacket(new ExUserInfoInvenWeight(_owner)); + _owner.sendPacket(new ExAdenaInvenCount(_owner)); _partner.sendPacket(new ExUserInfoInvenWeight(_partner)); + _partner.sendPacket(new ExAdenaInvenCount(_partner)); success = true; } diff --git a/trunk/java/com/l2jserver/gameserver/model/UIKeysSettings.java b/trunk/java/com/l2jserver/gameserver/model/UIKeysSettings.java index 0d9920357a..a2dd95968c 100644 --- a/trunk/java/com/l2jserver/gameserver/model/UIKeysSettings.java +++ b/trunk/java/com/l2jserver/gameserver/model/UIKeysSettings.java @@ -28,7 +28,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.UIData; +import com.l2jserver.gameserver.data.xml.impl.UIData; /** * UI Keys Settings class. diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/L2Attackable.java b/trunk/java/com/l2jserver/gameserver/model/actor/L2Attackable.java index 5422ab8e67..de5ddb7429 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/L2Attackable.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/L2Attackable.java @@ -21,6 +21,7 @@ package com.l2jserver.gameserver.model.actor; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; @@ -89,8 +90,7 @@ public class L2Attackable extends L2Npc private int _seederObjId = 0; private ItemHolder _harvestItem; // Spoil - private boolean _isSpoil = false; - private int _isSpoiledBy = 0; + private int _spoilerObjectId; private ItemHolder[] _sweepItems; // Over-hit private boolean _overhit; @@ -473,7 +473,14 @@ public class L2Attackable extends L2Npc // Penalty applied to the attacker's XP // If this attacker have servitor, get Exp Penalty applied for the servitor. - final float penalty = attacker.hasServitor() ? ((L2ServitorInstance) attacker.getSummon()).getExpMultiplier() : 1; + float penalty = 1; + + Optional summon = attacker.getServitors().values().stream().filter(s -> ((L2ServitorInstance) s).getExpMultiplier() > 1).findFirst(); + if (summon.isPresent()) + { + penalty = ((L2ServitorInstance) summon.get()).getExpMultiplier(); + + } // If there's NO party in progress if (attackerParty == null) @@ -992,7 +999,7 @@ public class L2Attackable extends L2Npc CursedWeaponsManager.getInstance().checkDrop(this, player); - if (isSpoil()) + if (isSpoiled()) { List sweepItems = npcTemplate.calculateDrops(DropListScope.CORPSE, this, player); if ((sweepItems != null) && !sweepItems.isEmpty()) @@ -1162,7 +1169,7 @@ public class L2Attackable extends L2Npc { for (ItemHolder item : _sweepItems) { - lootItems.add(ItemTable.getInstance().createDummyItem(item.getId()).getItem()); + lootItems.add(ItemTable.getInstance().getTemplate(item.getId())); } } return lootItems; @@ -1215,7 +1222,7 @@ public class L2Attackable extends L2Npc */ public boolean checkSpoilOwner(L2PcInstance sweeper, boolean sendMessage) { - if ((sweeper.getObjectId() != getIsSpoiledBy()) && !sweeper.isInLooterParty(getIsSpoiledBy())) + if ((sweeper.getObjectId() != getSpoilerObjectId()) && !sweeper.isInLooterParty(getSpoilerObjectId())) { if (sendMessage) { @@ -1425,7 +1432,7 @@ public class L2Attackable extends L2Npc { super.onSpawn(); // Clear mob spoil, seed - setSpoil(false); + setSpoilerObjectId(0); // Clear all aggro char from list clearAggroList(); // Clear Harvester reward @@ -1453,30 +1460,30 @@ public class L2Attackable extends L2Npc } /** - * @return True if this L2NpcInstance has drops that can be sweeped. + * Checks if its spoiled. + * @return {@code true} if its spoiled, {@code false} otherwise */ - public boolean isSpoil() + public boolean isSpoiled() { - return _isSpoil; + return _spoilerObjectId != 0; } /** - * Set the spoil state of this L2NpcInstance. - * @param isSpoil + * Gets the spoiler object ID. + * @return the spoiler object ID if its spoiled, 0 otherwise */ - public void setSpoil(boolean isSpoil) + public final int getSpoilerObjectId() { - _isSpoil = isSpoil; + return _spoilerObjectId; } - public final int getIsSpoiledBy() + /** + * Sets the spoiler object ID. + * @param spoilerObjectId spoilerObjectId the spoiler object ID + */ + public final void setSpoilerObjectId(int spoilerObjectId) { - return _isSpoiledBy; - } - - public final void setIsSpoiledBy(int value) - { - _isSpoiledBy = value; + _spoilerObjectId = spoilerObjectId; } /** diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/L2Character.java b/trunk/java/com/l2jserver/gameserver/model/actor/L2Character.java index 657bfa2770..fc2ee10477 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/L2Character.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/L2Character.java @@ -52,8 +52,8 @@ import com.l2jserver.gameserver.ai.CtrlEvent; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.ai.L2AttackableAI; import com.l2jserver.gameserver.ai.L2CharacterAI; -import com.l2jserver.gameserver.datatables.CategoryData; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.CategoryData; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.datatables.ItemTable; import com.l2jserver.gameserver.enums.CategoryType; import com.l2jserver.gameserver.enums.InstanceType; @@ -1141,7 +1141,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe if (player != null) { AttackStanceTaskManager.getInstance().addAttackStanceTask(player); - if (player.getSummon() != target) + if ((player.getPet() != target) && !player.hasServitor(target.getObjectId())) { player.updatePvPStatus(target); } @@ -1677,7 +1677,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe switch (skill.getTargetType()) { case AREA_SUMMON: // We need it to correct facing - target = getSummon(); + target = getServitors().values().stream().findFirst().orElse(getPet()); break; case AURA: case AURA_CORPSE_MOB: @@ -2867,7 +2867,20 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe /** * @return the summon */ - public L2Summon getSummon() + public L2Summon getPet() + { + return null; + } + + /** + * @return the summon + */ + public Map getServitors() + { + return Collections.emptyMap(); + } + + public L2Summon getServitor(int objectId) { return null; } @@ -2877,7 +2890,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe */ public final boolean hasSummon() { - return getSummon() != null; + return (getPet() != null) || !getServitors().isEmpty(); } /** @@ -2885,15 +2898,25 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe */ public final boolean hasPet() { - return hasSummon() && getSummon().isPet(); + return getPet() != null; + } + + public final boolean hasServitor(int objectId) + { + return getServitors().containsKey(objectId); } /** * @return {@code true} if the character has a servitor, {@code false} otherwise */ - public final boolean hasServitor() + public final boolean hasServitors() { - return hasSummon() && getSummon().isServitor(); + return !getServitors().isEmpty(); + } + + public void removeServitor(int objectId) + { + getServitors().remove(objectId); } public final boolean isRooted() @@ -3939,9 +3962,9 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe broadcastPacket(su); } } - if ((getSummon() != null) && isAffected(EffectFlag.SERVITOR_SHARE)) + if (hasServitors() && isAffected(EffectFlag.SERVITOR_SHARE)) { - getSummon().broadcastStatusUpdate(); + getServitors().values().forEach(L2Summon::broadcastStatusUpdate); } } else if (isNpc()) @@ -4223,7 +4246,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe final boolean isFloating = isFlying() || isInsideZone(ZoneId.WATER); // Z coordinate will follow geodata or client values - if ((Config.GEODATA > 0) && (Config.COORD_SYNCHRONIZE == 2) && !isFloating && !m.disregardingGeodata && ((GameTimeController.getInstance().getGameTicks() % 10) == 0 // once a second to reduce possible cpu load + if ((Config.COORD_SYNCHRONIZE == 2) && !isFloating && !m.disregardingGeodata && ((GameTimeController.getInstance().getGameTicks() % 10) == 0 // once a second to reduce possible cpu load ) && GeoData.getInstance().hasGeo(xPrev, yPrev)) { int geoHeight = GeoData.getInstance().getSpawnHeight(xPrev, yPrev, zPrev); @@ -4499,7 +4522,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe // make water move short and use no geodata checks for swimming chars // distance in a click can easily be over 3000 - if ((Config.GEODATA > 0) && isInsideZone(ZoneId.WATER) && (distance > 700)) + if (isInsideZone(ZoneId.WATER) && (distance > 700)) { double divider = 700 / distance; x = curX + (int) (divider * dx); @@ -4567,7 +4590,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe m.onGeodataPathIndex = -1; // Initialize not on geodata path m.disregardingGeodata = false; - if ((Config.GEODATA > 0) && !isFlying() // flying chars not checked - even canSeeTarget doesn't work yet + if (!isFlying() // flying chars not checked - even canSeeTarget doesn't work yet && (!isInsideZone(ZoneId.WATER) || isInsideZone(ZoneId.SIEGE))) // swimming also not checked unless in siege zone - but distance is limited { final boolean isInVehicle = isPlayer() && (getActingPlayer().getVehicle() != null); @@ -4584,9 +4607,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe int gty = (originalY - L2World.MAP_MIN_Y) >> 4; // Movement checks: - // when geodata == 2, for all characters except mobs returning home (could be changed later to teleport if pathfinding fails) - // when geodata == 1, for L2Playable and L2RiftInvaderInstance only - if (((Config.GEODATA == 2) && !(isAttackable() && ((L2Attackable) this).isReturningToSpawnPoint())) || (isPlayer() && !(isInVehicle && (distance > 1500))) || (isSummon() && !(getAI().getIntention() == AI_INTENTION_FOLLOW)) // assuming intention_follow only when following owner + // when PATHFINDING > 0, for all characters except mobs returning home (could be changed later to teleport if pathfinding fails) + if (((Config.PATHFINDING > 0) && (!(isAttackable() && ((L2Attackable) this).isReturningToSpawnPoint()))) || (isPlayer() && !(isInVehicle && (distance > 1500))) || (isSummon() && !(getAI().getIntention() == AI_INTENTION_FOLLOW)) // assuming intention_follow only when following owner || isAfraid()) { if (isOnGeodataPath()) @@ -4637,7 +4659,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe // Pathfinding checks. Only when geodata setting is 2, the LoS check gives shorter result // than the original movement was and the LoS gives a shorter distance than 2000 // This way of detecting need for pathfinding could be changed. - if ((Config.GEODATA == 2) && ((originalDistance - distance) > 30) && (distance < 2000) && !isAfraid()) + if ((Config.PATHFINDING > 0) && ((originalDistance - distance) > 30) && (distance < 2000) && !isAfraid()) { // Path calculation // Overrides previous movement check @@ -4679,7 +4701,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe z = m.geoPath.get(m.onGeodataPathIndex).getZ(); // check for doors in the route - if (DoorTable.getInstance().checkIfDoorsBetween(curX, curY, curZ, x, y, z, getInstanceId())) + if (DoorData.getInstance().checkIfDoorsBetween(curX, curY, curZ, x, y, z, getInstanceId())) { m.geoPath = null; getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); @@ -4687,7 +4709,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe } for (int i = 0; i < (m.geoPath.size() - 1); i++) { - if (DoorTable.getInstance().checkIfDoorsBetween(m.geoPath.get(i), m.geoPath.get(i + 1), getInstanceId())) + if (DoorData.getInstance().checkIfDoorsBetween(m.geoPath.get(i), m.geoPath.get(i + 1), getInstanceId())) { m.geoPath = null; getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); @@ -4705,7 +4727,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe } } // If no distance to go through, the movement is canceled - if ((distance < 1) && ((Config.GEODATA == 2) || isPlayable())) + if ((distance < 1) && ((Config.PATHFINDING > 0) || isPlayable())) { if (isSummon()) { @@ -5588,7 +5610,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe _skiprange++; continue; } - if ((escapeRange > 0) && (Config.GEODATA > 0) && !GeoData.getInstance().canSeeTarget(this, target)) + if ((escapeRange > 0) && !GeoData.getInstance().canSeeTarget(this, target)) { _skipgeo++; continue; @@ -5996,7 +6018,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe // attack of the own pet does not flag player // triggering trap not flag trap owner - if ((player.getSummon() != target) && !isTrap() && !((skill.getEffectPoint() == 0) && (skill.getAffectRange() > 0))) + if ((player.getPet() != target) && !player.hasServitor(target.getObjectId()) && !isTrap() && !((skill.getEffectPoint() == 0) && (skill.getAffectRange() > 0))) { player.updatePvPStatus((L2Character) target); } @@ -6058,9 +6080,19 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe if (player.hasSummon()) { - if ((targets.length == 1) && Util.contains(targets, player.getSummon())) + if (targets.length == 1) { - skillEffectPoint = 0; + if (Util.contains(targets, player.getPet())) + { + skillEffectPoint = 0; + } + for (L2Summon servitor : player.getServitors().values()) + { + if (Util.contains(targets, servitor)) + { + skillEffectPoint = 0; + } + } } } @@ -6073,7 +6105,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe { if ((npcTarget == skillTarget) || (npcMob == skillTarget)) { - L2Character originalCaster = isSummon() ? getSummon() : player; + L2Character originalCaster = isSummon() ? this : player; attackable.addDamageHate(originalCaster, 0, (skillEffectPoint * 150) / (attackable.getLevel() + 7)); } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/L2Npc.java b/trunk/java/com/l2jserver/gameserver/model/actor/L2Npc.java index d23ce5c644..a2d917db44 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/L2Npc.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/L2Npc.java @@ -91,6 +91,7 @@ import com.l2jserver.gameserver.network.serverpackets.ExChangeNpcState; import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse; import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; import com.l2jserver.gameserver.network.serverpackets.NpcInfo; +import com.l2jserver.gameserver.network.serverpackets.NpcInfoAbnormalVisualEffect; import com.l2jserver.gameserver.network.serverpackets.ServerObjectInfo; import com.l2jserver.gameserver.network.serverpackets.SocialAction; import com.l2jserver.gameserver.taskmanager.DecayTaskManager; @@ -566,7 +567,7 @@ public class L2Npc extends L2Character } else { - player.sendPacket(new NpcInfo(this)); + player.sendPacket(new NpcInfoAbnormalVisualEffect(this)); } } } @@ -1723,6 +1724,17 @@ public class L2Npc extends L2Character } } + /** + * Sends an event to a given object. + * @param eventName the event name + * @param receiver the receiver + * @param reference the reference + */ + public void sendScriptEvent(String eventName, L2Object receiver, L2Object reference) + { + EventDispatcher.getInstance().notifyEventAsync(new OnNpcEventReceived(eventName, this, (L2Npc) receiver, reference), receiver); + } + /** * Gets point in range between radiusMin and radiusMax from this NPC * @param radiusMin miminal range from NPC (not closer than) diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/L2Summon.java b/trunk/java/com/l2jserver/gameserver/model/actor/L2Summon.java index 41ab41d94f..38f4b4760c 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/L2Summon.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/L2Summon.java @@ -22,7 +22,7 @@ import com.l2jserver.Config; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.ai.L2CharacterAI; import com.l2jserver.gameserver.ai.L2SummonAI; -import com.l2jserver.gameserver.datatables.ExperienceTable; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; import com.l2jserver.gameserver.datatables.ItemTable; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.enums.Race; @@ -53,17 +53,18 @@ import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.model.skills.targets.L2TargetType; import com.l2jserver.gameserver.model.zone.ZoneId; import com.l2jserver.gameserver.network.SystemMessageId; -import com.l2jserver.gameserver.network.serverpackets.AbstractNpcInfo.SummonInfo; import com.l2jserver.gameserver.network.serverpackets.ActionFailed; import com.l2jserver.gameserver.network.serverpackets.ExPartyPetWindowAdd; import com.l2jserver.gameserver.network.serverpackets.ExPartyPetWindowDelete; import com.l2jserver.gameserver.network.serverpackets.ExPartyPetWindowUpdate; +import com.l2jserver.gameserver.network.serverpackets.ExPetInfo; import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; import com.l2jserver.gameserver.network.serverpackets.PetDelete; import com.l2jserver.gameserver.network.serverpackets.PetInfo; import com.l2jserver.gameserver.network.serverpackets.PetItemList; import com.l2jserver.gameserver.network.serverpackets.PetStatusUpdate; import com.l2jserver.gameserver.network.serverpackets.RelationChanged; +import com.l2jserver.gameserver.network.serverpackets.SummonInfo; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.gameserver.network.serverpackets.TeleportToLocation; import com.l2jserver.gameserver.taskmanager.DecayTaskManager; @@ -78,6 +79,7 @@ public abstract class L2Summon extends L2Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _shotsMask = 0; + private int _summonPoints = 0; // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -218,7 +220,14 @@ public abstract class L2Summon extends L2Playable { for (L2PcInstance player : getKnownList().getKnownPlayers().values()) { - player.sendPacket(new SummonInfo(this, player, 1)); + if (isPet()) + { + player.sendPacket(new ExPetInfo(this, player, 1)); + } + else + { + player.sendPacket(new SummonInfo(this, player, 1)); + } } } @@ -232,20 +241,20 @@ public abstract class L2Summon extends L2Playable public long getExpForThisLevel() { - if (getLevel() >= ExperienceTable.getInstance().getMaxPetLevel()) + if (getLevel() >= ExperienceData.getInstance().getMaxPetLevel()) { return 0; } - return ExperienceTable.getInstance().getExpForLevel(getLevel()); + return ExperienceData.getInstance().getExpForLevel(getLevel()); } public long getExpForNextLevel() { - if (getLevel() >= (ExperienceTable.getInstance().getMaxPetLevel() - 1)) + if (getLevel() >= (ExperienceData.getInstance().getMaxPetLevel() - 1)) { return 0; } - return ExperienceTable.getInstance().getExpForLevel(getLevel() + 1); + return ExperienceData.getInstance().getExpForLevel(getLevel() + 1); } @Override @@ -435,7 +444,14 @@ public abstract class L2Summon extends L2Playable storeEffect(true); if (owner != null) { - owner.setPet(null); + if (isPet()) + { + owner.setPet(null); + } + else + { + owner.removeServitor(getObjectId()); + } } // Stop AI tasks @@ -898,7 +914,15 @@ public abstract class L2Summon extends L2Playable { continue; } - player.sendPacket(new SummonInfo(this, player, val)); + if (isPet()) + { + player.sendPacket(new ExPetInfo(this, player, val)); + } + else + { + player.sendPacket(new SummonInfo(this, player, val)); + } + } } @@ -923,7 +947,7 @@ public abstract class L2Summon extends L2Playable // Check if the L2PcInstance is the owner of the Pet if (activeChar == getOwner()) { - activeChar.sendPacket(new PetInfo(this, 0)); + activeChar.sendPacket(new PetInfo(this, 1)); // The PetInfo packet wipes the PartySpelled (list of active spells' icons). Re-add them updateEffectIcons(true); if (isPet()) @@ -933,7 +957,14 @@ public abstract class L2Summon extends L2Playable } else { - activeChar.sendPacket(new SummonInfo(this, activeChar, 0)); + if (isPet()) + { + activeChar.sendPacket(new ExPetInfo(this, activeChar, 0)); + } + else + { + activeChar.sendPacket(new SummonInfo(this, activeChar, 0)); + } } } @@ -1111,12 +1142,6 @@ public abstract class L2Summon extends L2Playable return true; } - @Override - public L2Summon getSummon() - { - return this; - } - @Override public boolean isChargedShot(ShotType type) { @@ -1232,4 +1257,14 @@ public abstract class L2Summon extends L2Playable } return formId; } + + public void setSummonPoints(int summonPoints) + { + _summonPoints = summonPoints; + } + + public int getSummonPoints() + { + return _summonPoints; + } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2BabyPetInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2BabyPetInstance.java index d295c4d84f..9a515aa7ca 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2BabyPetInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2BabyPetInstance.java @@ -24,7 +24,7 @@ import java.util.concurrent.Future; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.PetDataTable; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.enums.CategoryType; import com.l2jserver.gameserver.enums.InstanceType; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ChestInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ChestInstance.java index dddd8dbde8..d18fab26c9 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ChestInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ChestInstance.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.model.actor.instance; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClanHallDoormenInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClanHallDoormenInstance.java index 30b6fb7bf0..69d0474334 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClanHallDoormenInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClanHallDoormenInstance.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.model.actor.instance; import java.util.Arrays; import java.util.StringTokenizer; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.instancemanager.ClanHallManager; import com.l2jserver.gameserver.model.L2Clan; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClanHallManagerInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClanHallManagerInstance.java index b70fc91585..5150ce3310 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClanHallManagerInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClanHallManagerInstance.java @@ -23,8 +23,8 @@ import java.util.StringTokenizer; import com.l2jserver.Config; import com.l2jserver.gameserver.cache.HtmCache; +import com.l2jserver.gameserver.data.sql.impl.TeleportLocationTable; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.TeleportLocationTable; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.instancemanager.CHSiegeManager; import com.l2jserver.gameserver.instancemanager.ClanHallManager; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClassMasterInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClassMasterInstance.java index 6d8371543c..7a912e0b43 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClassMasterInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ClassMasterInstance.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.model.actor.instance; import com.l2jserver.Config; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.ClassListData; +import com.l2jserver.gameserver.data.xml.impl.ClassListData; import com.l2jserver.gameserver.datatables.ItemTable; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2CubicInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2CubicInstance.java index 82c13947dc..575c488674 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2CubicInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2CubicInstance.java @@ -34,6 +34,7 @@ import com.l2jserver.gameserver.model.L2Party; import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.tasks.cubics.CubicAction; import com.l2jserver.gameserver.model.actor.tasks.cubics.CubicDisappear; import com.l2jserver.gameserver.model.actor.tasks.cubics.CubicHeal; @@ -367,7 +368,8 @@ public final class L2CubicInstance implements IIdentifiable return; } // test owners target if it is valid then use it - if ((ownerTarget instanceof L2Character) && (ownerTarget != _owner.getSummon()) && (ownerTarget != _owner)) + final L2Summon pet = _owner.getPet(); + if (ownerTarget.isCharacter() && (ownerTarget != pet) && !_owner.hasServitor(ownerTarget.getObjectId()) && (ownerTarget != _owner)) { // target mob which has aggro on you or your summon if (ownerTarget instanceof L2Attackable) @@ -379,11 +381,19 @@ public final class L2CubicInstance implements IIdentifiable } if (_owner.hasSummon()) { - if ((((L2Attackable) ownerTarget).getAggroList().get(_owner.getSummon()) != null) && !((L2Attackable) ownerTarget).isDead()) + if ((((L2Attackable) ownerTarget).getAggroList().get(pet) != null) && !((L2Attackable) ownerTarget).isDead()) { _target = (L2Character) ownerTarget; return; } + for (L2Summon servitor : _owner.getServitors().values()) + { + if ((((L2Attackable) ownerTarget).getAggroList().get(servitor) != null) && !((L2Attackable) ownerTarget).isDead()) + { + _target = (L2Character) ownerTarget; + return; + } + } } } @@ -730,27 +740,40 @@ public final class L2CubicInstance implements IIdentifiable } } } - if (partyMember.getSummon() != null) + final L2Summon pet = partyMember.getPet(); + if (pet != null) { - if (partyMember.getSummon().isDead()) - { - continue; - } - - // If party member's pet not dead, check if it is in cast range of heal cubic. - if (!isInCubicRange(_owner, partyMember.getSummon())) + if (pet.isDead() || !isInCubicRange(_owner, pet)) { continue; } // member's pet is in cubic casting range, check if he need heal and if he have // the lowest HP - if (partyMember.getSummon().getCurrentHp() < partyMember.getSummon().getMaxHp()) + if (pet.getCurrentHp() < pet.getMaxHp()) { - if (percentleft > (partyMember.getSummon().getCurrentHp() / partyMember.getSummon().getMaxHp())) + if (percentleft > (pet.getCurrentHp() / pet.getMaxHp())) { - percentleft = (partyMember.getSummon().getCurrentHp() / partyMember.getSummon().getMaxHp()); - target = partyMember.getSummon(); + percentleft = (pet.getCurrentHp() / pet.getMaxHp()); + target = pet; + } + } + } + for (L2Summon s : partyMember.getServitors().values()) + { + if (s.isDead() || !isInCubicRange(_owner, s)) + { + continue; + } + + // member's pet is in cubic casting range, check if he need heal and if he have + // the lowest HP + if (s.getCurrentHp() < s.getMaxHp()) + { + if (percentleft > (s.getCurrentHp() / s.getMaxHp())) + { + percentleft = (s.getCurrentHp() / s.getMaxHp()); + target = s; } } } @@ -763,11 +786,19 @@ public final class L2CubicInstance implements IIdentifiable percentleft = (_owner.getCurrentHp() / _owner.getMaxHp()); target = _owner; } - if (_owner.hasSummon()) + for (L2Summon summon : _owner.getServitors().values()) { - if (!_owner.getSummon().isDead() && (_owner.getSummon().getCurrentHp() < _owner.getSummon().getMaxHp()) && (percentleft > (_owner.getSummon().getCurrentHp() / _owner.getSummon().getMaxHp())) && isInCubicRange(_owner, _owner.getSummon())) + if (!summon.isDead() && (summon.getCurrentHp() < summon.getMaxHp()) && (percentleft > (summon.getCurrentHp() / summon.getMaxHp())) && isInCubicRange(_owner, summon)) { - target = _owner.getSummon(); + target = summon; + } + } + final L2Summon pet = _owner.getPet(); + if (pet != null) + { + if (!pet.isDead() && (pet.getCurrentHp() < pet.getMaxHp()) && (percentleft > (pet.getCurrentHp() / pet.getMaxHp())) && isInCubicRange(_owner, pet)) + { + target = _owner.getPet(); } } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2DoorInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2DoorInstance.java index 72a95322de..eb39e923c8 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2DoorInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2DoorInstance.java @@ -28,7 +28,7 @@ import javolution.util.FastList; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.L2CharacterAI; import com.l2jserver.gameserver.ai.L2DoorAI; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.instancemanager.CastleManager; @@ -95,7 +95,7 @@ public class L2DoorInstance extends L2Character if (getGroupName() != null) { - DoorTable.addDoorGroup(getGroupName(), getId()); + DoorData.addDoorGroup(getGroupName(), getId()); } if (isOpenableByTime()) @@ -535,7 +535,7 @@ public class L2DoorInstance extends L2Character private void manageGroupOpen(boolean open, String groupName) { - Set set = DoorTable.getDoorsByGroup(groupName); + Set set = DoorData.getDoorsByGroup(groupName); L2DoorInstance first = null; for (Integer id : set) { @@ -741,7 +741,7 @@ public class L2DoorInstance extends L2Character { if (getInstanceId() == 0) { - return DoorTable.getInstance().getDoor(doorId); + return DoorData.getInstance().getDoor(doorId); } Instance inst = InstanceManager.getInstance().getInstance(getInstanceId()); diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2DoormenInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2DoormenInstance.java index 3b51bf7941..ec6425f50a 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2DoormenInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2DoormenInstance.java @@ -20,8 +20,8 @@ package com.l2jserver.gameserver.model.actor.instance; import java.util.StringTokenizer; -import com.l2jserver.gameserver.datatables.DoorTable; -import com.l2jserver.gameserver.datatables.TeleportLocationTable; +import com.l2jserver.gameserver.data.sql.impl.TeleportLocationTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.model.L2TeleportLocation; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; @@ -120,7 +120,7 @@ public class L2DoormenInstance extends L2NpcInstance while (st.hasMoreTokens()) { - DoorTable.getInstance().getDoor(Integer.parseInt(st.nextToken())).openMe(); + DoorData.getInstance().getDoor(Integer.parseInt(st.nextToken())).openMe(); } } @@ -131,7 +131,7 @@ public class L2DoormenInstance extends L2NpcInstance while (st.hasMoreTokens()) { - DoorTable.getInstance().getDoor(Integer.parseInt(st.nextToken())).closeMe(); + DoorData.getInstance().getDoor(Integer.parseInt(st.nextToken())).closeMe(); } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FishermanInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FishermanInstance.java index 093a012124..2dad8bb4ec 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FishermanInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FishermanInstance.java @@ -20,17 +20,13 @@ package com.l2jserver.gameserver.model.actor.instance; import java.util.List; -import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.enums.InstanceType; -import com.l2jserver.gameserver.instancemanager.FishingChampionshipManager; import com.l2jserver.gameserver.model.L2SkillLearn; -import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.base.AcquireSkillType; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.ExAcquirableSkillListByClass; -import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; public final class L2FishermanInstance extends L2MerchantInstance @@ -65,35 +61,6 @@ public final class L2FishermanInstance extends L2MerchantInstance { showFishSkillList(player); } - else if (command.startsWith("FishingChampionship")) - { - if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED) - { - FishingChampionshipManager.getInstance().showChampScreen(player, this); - } - else - { - sendHtml(player, this, "no_fish_event001.htm"); - } - } - else if (command.startsWith("FishingReward")) - { - if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED) - { - if (FishingChampionshipManager.getInstance().isWinner(player.getName())) - { - FishingChampionshipManager.getInstance().getReward(player); - } - else - { - sendHtml(player, this, "no_fish_event_reward001.htm"); - } - } - else - { - sendHtml(player, this, "no_fish_event001.htm"); - } - } else { super.onBypassFeedback(player, command); @@ -123,11 +90,4 @@ public final class L2FishermanInstance extends L2MerchantInstance player.sendPacket(new ExAcquirableSkillListByClass(skills, AcquireSkillType.FISHING)); } } - - private static void sendHtml(L2PcInstance player, L2Npc npc, String htmlName) - { - final NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId()); - html.setFile(player.getHtmlPrefix(), "data/html/fisherman/championship/" + htmlName); - player.sendPacket(html); - } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FortLogisticsInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FortLogisticsInstance.java index 2491ad1b9f..bfa077518f 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FortLogisticsInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FortLogisticsInstance.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.model.actor.instance; import java.util.StringTokenizer; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FortManagerInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FortManagerInstance.java index efce6da991..83c71610aa 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FortManagerInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2FortManagerInstance.java @@ -23,8 +23,8 @@ import java.util.StringTokenizer; import com.l2jserver.Config; import com.l2jserver.gameserver.cache.HtmCache; +import com.l2jserver.gameserver.data.sql.impl.TeleportLocationTable; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.TeleportLocationTable; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.model.ClanPrivilege; import com.l2jserver.gameserver.model.L2TeleportLocation; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2MerchantInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2MerchantInstance.java index 46aeb444ce..7e9e7418e9 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2MerchantInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2MerchantInstance.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.model.actor.instance; -import com.l2jserver.gameserver.datatables.BuyListData; +import com.l2jserver.gameserver.data.xml.impl.BuyListData; import com.l2jserver.gameserver.datatables.MerchantPriceConfigTable; import com.l2jserver.gameserver.datatables.MerchantPriceConfigTable.MerchantPriceConfig; import com.l2jserver.gameserver.enums.InstanceType; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2NpcInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2NpcInstance.java index 82fe468d82..3f0b42dd4c 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2NpcInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2NpcInstance.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.Map; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.L2Npc; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java index cb53a20ded..0bc64d0687 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java @@ -37,6 +37,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.Future; import java.util.concurrent.ScheduledFuture; @@ -63,23 +64,23 @@ import com.l2jserver.gameserver.ai.L2SummonAI; import com.l2jserver.gameserver.cache.WarehouseCacheManager; import com.l2jserver.gameserver.communitybbs.BB.Forum; import com.l2jserver.gameserver.communitybbs.Manager.ForumsBBSManager; -import com.l2jserver.gameserver.datatables.AdminTable; -import com.l2jserver.gameserver.datatables.CharNameTable; -import com.l2jserver.gameserver.datatables.CharSummonTable; -import com.l2jserver.gameserver.datatables.CharTemplateTable; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.ClassListData; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; -import com.l2jserver.gameserver.datatables.ExperienceTable; -import com.l2jserver.gameserver.datatables.FishData; -import com.l2jserver.gameserver.datatables.HennaData; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharSummonTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; +import com.l2jserver.gameserver.data.xml.impl.ClassListData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; +import com.l2jserver.gameserver.data.xml.impl.FishData; +import com.l2jserver.gameserver.data.xml.impl.HennaData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; +import com.l2jserver.gameserver.data.xml.impl.PlayerTemplateData; +import com.l2jserver.gameserver.data.xml.impl.PlayerXpPercentLostData; +import com.l2jserver.gameserver.data.xml.impl.RecipeData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.NpcData; -import com.l2jserver.gameserver.datatables.PetDataTable; -import com.l2jserver.gameserver.datatables.PlayerXpPercentLostData; -import com.l2jserver.gameserver.datatables.RecipeData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SkillTreesData; import com.l2jserver.gameserver.enums.CastleSide; import com.l2jserver.gameserver.enums.CategoryType; import com.l2jserver.gameserver.enums.HtmlActionScope; @@ -640,8 +641,10 @@ public final class L2PcInstance extends L2Playable private int _hennaLUC; private int _hennaCHA; - /** The L2Summon of the L2PcInstance */ - private L2Summon _summon = null; + /** The Pet of the L2PcInstance */ + private L2Summon _pet = null; + /** Servitors of the L2PcInstance */ + private volatile Map _servitors = null; /** The L2Decoy of the L2PcInstance */ private L2Decoy _decoy = null; /** The L2Trap of the L2PcInstance */ @@ -1192,7 +1195,7 @@ public final class L2PcInstance extends L2Playable */ public final L2PcTemplate getBaseTemplate() { - return CharTemplateTable.getInstance().getTemplate(_baseClass); + return PlayerTemplateData.getInstance().getTemplate(_baseClass); } /** @@ -1209,7 +1212,7 @@ public final class L2PcInstance extends L2Playable */ public void setTemplate(ClassId newclass) { - super.setTemplate(CharTemplateTable.getInstance().getTemplate(newclass)); + super.setTemplate(PlayerTemplateData.getInstance().getTemplate(newclass)); } @Override @@ -1730,17 +1733,48 @@ public final class L2PcInstance extends L2Playable // If this player has a pet update the pets pvp flag as well if (hasSummon()) { - sendPacket(new RelationChanged(getSummon(), getRelation(this), false)); + final RelationChanged rc = new RelationChanged(); + final L2Summon pet = getPet(); + if (pet != null) + { + rc.addRelation(pet, getRelation(this), false); + } + if (hasServitors()) + { + getServitors().values().forEach(s -> rc.addRelation(s, getRelation(this), false)); + } + sendPacket(rc); } - Collection plrs = getKnownList().getKnownPlayers().values(); + final Collection plrs = getKnownList().getKnownPlayers().values(); - for (L2PcInstance target : plrs) + for (L2PcInstance player : plrs) { - target.sendPacket(new RelationChanged(this, getRelation(target), isAutoAttackable(target))); - if (hasSummon()) + if ((player == null) || !isVisibleFor(player)) { - target.sendPacket(new RelationChanged(getSummon(), getRelation(target), isAutoAttackable(target))); + continue; + } + + final int relation = getRelation(player); + Integer oldrelation = getKnownList().getKnownRelations().get(player.getObjectId()); + if ((oldrelation == null) || (oldrelation != relation)) + { + final RelationChanged rc = new RelationChanged(); + rc.addRelation(this, relation, isAutoAttackable(player)); + if (hasSummon()) + { + final L2Summon pet = getPet(); + if (pet != null) + { + rc.addRelation(pet, relation, isAutoAttackable(player)); + } + if (hasServitors()) + { + getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable(player))); + } + } + player.sendPacket(rc); + getKnownList().getKnownRelations().put(player.getObjectId(), relation); } } } @@ -2675,6 +2709,14 @@ public final class L2PcInstance extends L2Playable Skill skill; for (L2SkillLearn s : autoGetSkills) { + final int maxLvl = SkillData.getInstance().getMaxLevel(s.getSkillId()); + final int hashCode = SkillData.getSkillHashCode(s.getSkillId(), maxLvl); + + if (SkillTreesData.getInstance().isCurrentClassSkillNoParent(getClassId(), hashCode) || SkillTreesData.getInstance().isRemoveSkill(getClassId(), s.getSkillId())) + { + continue; + } + skill = st.getSkill(s.getSkillId(), s.getSkillLevel()); if (skill != null) { @@ -2711,7 +2753,7 @@ public final class L2PcInstance extends L2Playable { return getTemplate().getRace(); } - return CharTemplateTable.getInstance().getTemplate(_baseClass).getRace(); + return PlayerTemplateData.getInstance().getTemplate(_baseClass).getRace(); } public L2Radar getRadar() @@ -3341,18 +3383,14 @@ public final class L2PcInstance extends L2Playable { if (count > 0) { - L2ItemInstance item = null; - if (ItemTable.getInstance().getTemplate(itemId) != null) - { - item = ItemTable.getInstance().createDummyItem(itemId); - } - else + final L2Item item = ItemTable.getInstance().getTemplate(itemId); + if (item == null) { _log.log(Level.SEVERE, "Item doesn't exist so cannot be added. Item ID: " + itemId); return null; } // Sends message to client if requested - if (sendMessage && ((!isCastingNow() && item.getItem().hasExImmediateEffect()) || !item.getItem().hasExImmediateEffect())) + if (sendMessage && ((!isCastingNow() && item.hasExImmediateEffect()) || !item.hasExImmediateEffect())) { if (count > 1) { @@ -3389,9 +3427,9 @@ public final class L2PcInstance extends L2Playable } // Auto-use herbs. - if (item.getItem().hasExImmediateEffect()) + if (item.hasExImmediateEffect()) { - final IItemHandler handler = ItemHandler.getInstance().getHandler(item.getEtcItem()); + final IItemHandler handler = ItemHandler.getInstance().getHandler(item instanceof L2EtcItem ? (L2EtcItem) item : null); if (handler == null) { _log.warning("No item handler registered for Herb ID " + item.getId() + "!"); @@ -3415,14 +3453,6 @@ public final class L2PcInstance extends L2Playable { CursedWeaponsManager.getInstance().activate(this, createdItem); } - else if (FortSiegeManager.getInstance().isCombat(createdItem.getId())) - { - if (FortSiegeManager.getInstance().activateCombatFlag(this, item)) - { - Fort fort = FortManager.getInstance().getFort(this); - fort.getSiege().announceToPlayer(SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_ACQUIRED_THE_FLAG), getName()); - } - } return createdItem; } } @@ -3969,7 +3999,8 @@ public final class L2PcInstance extends L2Playable } // Pet is summoned and not the item that summoned the pet AND not the buggle from strider you're mounting - if ((hasSummon() && (getSummon().getControlObjectId() == objectId)) || (getMountObjectID() == objectId)) + final L2Summon pet = getPet(); + if (((pet != null) && (pet.getControlObjectId() == objectId)) || (getMountObjectID() == objectId)) { if (Config.DEBUG) { @@ -4338,18 +4369,26 @@ public final class L2PcInstance extends L2Playable continue; } player.sendPacket(mov); - if (mov instanceof CharInfo) + final int relation = getRelation(player); + Integer oldrelation = getKnownList().getKnownRelations().get(player.getObjectId()); + if ((oldrelation == null) || (oldrelation != relation)) { - int relation = getRelation(player); - Integer oldrelation = getKnownList().getKnownRelations().get(player.getObjectId()); - if ((oldrelation != null) && (oldrelation != relation)) + final RelationChanged rc = new RelationChanged(); + rc.addRelation(this, relation, isAutoAttackable(player)); + if (hasSummon()) { - player.sendPacket(new RelationChanged(this, relation, isAutoAttackable(player))); - if (hasSummon()) + final L2Summon pet = getPet(); + if (pet != null) { - player.sendPacket(new RelationChanged(getSummon(), relation, isAutoAttackable(player))); + rc.addRelation(pet, relation, isAutoAttackable(player)); + } + if (hasServitors()) + { + getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable(player))); } } + player.sendPacket(rc); + getKnownList().getKnownRelations().put(player.getObjectId(), relation); } } } @@ -4364,28 +4403,36 @@ public final class L2PcInstance extends L2Playable mov.setInvisible(isInvisible()); - Collection plrs = getKnownList().getKnownPlayers().values(); + final Collection plrs = getKnownList().getKnownPlayersInRadius(radiusInKnownlist); for (L2PcInstance player : plrs) { - if (player == null) + if ((player == null) || !isVisibleFor(player)) { continue; } - if (isInsideRadius(player, radiusInKnownlist, false, false)) + player.sendPacket(mov); + if (mov instanceof CharInfo) { - player.sendPacket(mov); - if (mov instanceof CharInfo) + final int relation = getRelation(player); + Integer oldrelation = getKnownList().getKnownRelations().get(player.getObjectId()); + if ((oldrelation == null) || (oldrelation != relation)) { - int relation = getRelation(player); - Integer oldrelation = getKnownList().getKnownRelations().get(player.getObjectId()); - if ((oldrelation != null) && (oldrelation != relation)) + final RelationChanged rc = new RelationChanged(); + rc.addRelation(this, relation, isAutoAttackable(player)); + if (hasSummon()) { - player.sendPacket(new RelationChanged(this, relation, isAutoAttackable(player))); - if (hasSummon()) + final L2Summon pet = getPet(); + if (pet != null) { - player.sendPacket(new RelationChanged(getSummon(), relation, isAutoAttackable(player))); + rc.addRelation(pet, relation, isAutoAttackable(player)); + } + if (hasServitors()) + { + getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable(player))); } } + player.sendPacket(rc); + getKnownList().getKnownRelations().put(player.getObjectId(), relation); } } } @@ -4851,6 +4898,7 @@ public final class L2PcInstance extends L2Playable transformation.onTransform(this); sendSkillList(); sendPacket(new SkillCoolTime(this)); + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); broadcastUserInfo(); // Notify to scripts @@ -5452,6 +5500,8 @@ public final class L2PcInstance extends L2Playable int itemDropPercent = 0; + final L2Summon pet = getPet(); + for (L2ItemInstance itemDrop : getInventory().getItems()) { // Don't drop @@ -5459,7 +5509,7 @@ public final class L2PcInstance extends L2Playable itemDrop.isTimeLimitedItem() || // Dont drop Time Limited Items !itemDrop.isDropable() || (itemDrop.getId() == Inventory.ADENA_ID) || // Adena (itemDrop.getItem().getType2() == L2Item.TYPE2_QUEST) || // Quest Items - (hasSummon() && (getSummon().getControlObjectId() == itemDrop.getId())) || // Control Item of active pet + ((pet != null) && (pet.getControlObjectId() == itemDrop.getId())) || // Control Item of active pet (Arrays.binarySearch(Config.KARMA_LIST_NONDROPPABLE_ITEMS, itemDrop.getId()) >= 0) || // Item listed in the non droppable item list (Arrays.binarySearch(Config.KARMA_LIST_NONDROPPABLE_PET_ITEMS, itemDrop.getId()) >= 0 // Item listed in the non droppable pet item list )) @@ -5746,13 +5796,13 @@ public final class L2PcInstance extends L2Playable long lostExp = 0; if (!L2Event.isParticipant(this)) { - if (lvl < ExperienceTable.getInstance().getMaxLevel()) + if (lvl < ExperienceData.getInstance().getMaxLevel()) { lostExp = Math.round(((getStat().getExpForLevel(lvl + 1) - getStat().getExpForLevel(lvl)) * percentLost) / 100); } else { - lostExp = Math.round(((getStat().getExpForLevel(ExperienceTable.getInstance().getMaxLevel()) - getStat().getExpForLevel(ExperienceTable.getInstance().getMaxLevel() - 1)) * percentLost) / 100); + lostExp = Math.round(((getStat().getExpForLevel(ExperienceData.getInstance().getMaxLevel()) - getStat().getExpForLevel(ExperienceData.getInstance().getMaxLevel() - 1)) * percentLost) / 100); } } @@ -5806,9 +5856,26 @@ public final class L2PcInstance extends L2Playable } @Override - public L2Summon getSummon() + public L2Summon getPet() { - return _summon; + return _pet; + } + + @Override + public Map getServitors() + { + return _servitors == null ? Collections.emptyMap() : _servitors; + } + + public L2Summon getAnyServitor() + { + return getServitors().values().stream().findAny().orElse(null); + } + + @Override + public L2Summon getServitor(int objectId) + { + return getServitors().get(objectId); } /** @@ -5829,11 +5896,26 @@ public final class L2PcInstance extends L2Playable /** * Set the L2Summon of the L2PcInstance. - * @param summon + * @param pet */ - public void setPet(L2Summon summon) + public void setPet(L2Summon pet) { - _summon = summon; + _pet = pet; + } + + public void addServitor(L2Summon servitor) + { + if (_servitors == null) + { + synchronized (this) + { + if (_servitors == null) + { + _servitors = new ConcurrentHashMap<>(1); + } + } + } + _servitors.put(servitor.getObjectId(), servitor); } /** @@ -6697,7 +6779,7 @@ public final class L2PcInstance extends L2Playable */ public void setAccessLevel(int level, boolean broadcast) { - _accessLevel = AdminTable.getInstance().getAccessLevel(level); + _accessLevel = AdminData.getInstance().getAccessLevel(level); getAppearance().setNameColor(_accessLevel.getNameColor()); getAppearance().setTitleColor(_accessLevel.getTitleColor()); @@ -6708,7 +6790,7 @@ public final class L2PcInstance extends L2Playable CharNameTable.getInstance().addName(this); - if (!AdminTable.getInstance().hasAccessLevel(level)) + if (!AdminData.getInstance().hasAccessLevel(level)) { _log.warning("Tryed to set unregistered access level " + level + " for " + toString() + ". Setting access level without privileges!"); } @@ -6731,7 +6813,7 @@ public final class L2PcInstance extends L2Playable { if (Config.EVERYBODY_HAS_ADMIN_RIGHTS) { - return AdminTable.getInstance().getMasterAccessLevel(); + return AdminData.getInstance().getMasterAccessLevel(); } else if (_accessLevel == null) { @@ -6769,13 +6851,35 @@ public final class L2PcInstance extends L2Playable StatusUpdate su = new StatusUpdate(this); su.addAttribute(StatusUpdate.PVP_FLAG, getKarma()); sendPacket(su); - Collection plrs = getKnownList().getKnownPlayers().values(); + + final Collection plrs = getKnownList().getKnownPlayers().values(); for (L2PcInstance player : plrs) { - player.sendPacket(new RelationChanged(this, getRelation(player), isAutoAttackable(player))); - if (hasSummon()) + if ((player == null) || !isVisibleFor(player)) { - player.sendPacket(new RelationChanged(getSummon(), getRelation(player), isAutoAttackable(player))); + continue; + } + + final int relation = getRelation(player); + Integer oldrelation = getKnownList().getKnownRelations().get(player.getObjectId()); + if ((oldrelation == null) || (oldrelation != relation)) + { + final RelationChanged rc = new RelationChanged(); + rc.addRelation(this, relation, isAutoAttackable(player)); + if (hasSummon()) + { + final L2Summon pet = getPet(); + if (pet != null) + { + rc.addRelation(pet, relation, isAutoAttackable(player)); + } + if (hasServitors()) + { + getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable(player))); + } + } + player.sendPacket(rc); + getKnownList().getKnownRelations().put(player.getObjectId(), relation); } } } @@ -6789,13 +6893,34 @@ public final class L2PcInstance extends L2Playable su.addAttribute(StatusUpdate.KARMA, getKarma()); sendPacket(su); - Collection plrs = getKnownList().getKnownPlayers().values(); + final Collection plrs = getKnownList().getKnownPlayers().values(); for (L2PcInstance player : plrs) { - player.sendPacket(new RelationChanged(this, getRelation(player), isAutoAttackable(player))); - if (hasSummon()) + if ((player == null) || !isVisibleFor(player)) { - player.sendPacket(new RelationChanged(getSummon(), getRelation(player), isAutoAttackable(player))); + continue; + } + + final int relation = getRelation(player); + Integer oldrelation = getKnownList().getKnownRelations().get(player.getObjectId()); + if ((oldrelation == null) || (oldrelation != relation)) + { + final RelationChanged rc = new RelationChanged(); + rc.addRelation(this, relation, isAutoAttackable(player)); + if (hasSummon()) + { + final L2Summon pet = getPet(); + if (pet != null) + { + rc.addRelation(pet, relation, isAutoAttackable(player)); + } + if (hasServitors()) + { + getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable(player))); + } + } + player.sendPacket(rc); + getKnownList().getKnownRelations().put(player.getObjectId(), relation); } } } @@ -6917,7 +7042,7 @@ public final class L2PcInstance extends L2Playable { final int activeClassId = rset.getInt("classid"); final boolean female = rset.getInt("sex") != Sex.MALE.ordinal(); - final L2PcTemplate template = CharTemplateTable.getInstance().getTemplate(activeClassId); + final L2PcTemplate template = PlayerTemplateData.getInstance().getTemplate(activeClassId); PcAppearance app = new PcAppearance(rset.getByte("face"), rset.getByte("hairColor"), rset.getByte("hairStyle"), female); player = new L2PcInstance(objectId, template, rset.getString("account_name"), app); @@ -6928,7 +7053,7 @@ public final class L2PcInstance extends L2Playable player.getStat().setExp(rset.getLong("exp")); player.setExpBeforeDeath(rset.getLong("expBeforeDeath")); player.getStat().setLevel(rset.getByte("level")); - player.getStat().setSp(rset.getInt("sp")); + player.getStat().setSp(rset.getLong("sp")); player.setWantsPeace(rset.getInt("wantspeace")); @@ -7136,9 +7261,18 @@ public final class L2PcInstance extends L2Playable // Restore pet if exists in the world player.setPet(L2World.getInstance().getPet(player.getObjectId())); - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - player.getSummon().setOwner(player); + pet.setOwner(player); + } + + if (player.hasServitors()) + { + for (L2Summon summon : player.getServitors().values()) + { + summon.setOwner(player); + } } // Update the overloaded status of the L2PcInstance @@ -7240,11 +7374,11 @@ public final class L2PcInstance extends L2Playable { SubClass subClass = new SubClass(); subClass.setClassId(rset.getInt("class_id")); + subClass.setIsDualClass(rset.getBoolean("dual_class")); subClass.setLevel(rset.getByte("level")); subClass.setExp(rset.getLong("exp")); subClass.setSp(rset.getLong("sp")); subClass.setClassIndex(rset.getInt("class_index")); - subClass.setIsDualClass(rset.getBoolean("dual_class")); // Enforce the correct indexing of _subClasses against their class indexes. player.getSubClasses().put(subClass.getClassIndex(), subClass); @@ -7559,9 +7693,9 @@ public final class L2PcInstance extends L2Playable statement.setLong(2, subClass.getSp()); statement.setInt(3, subClass.getLevel()); statement.setInt(4, subClass.getClassId()); - statement.setInt(5, getObjectId()); - statement.setInt(6, subClass.getClassIndex()); - statement.setBoolean(7, subClass.isDualClass()); + statement.setBoolean(5, subClass.isDualClass()); + statement.setInt(6, getObjectId()); + statement.setInt(7, subClass.getClassIndex()); statement.execute(); statement.clearParameters(); } @@ -8403,7 +8537,7 @@ public final class L2PcInstance extends L2Playable } // Check if the attacker isn't the L2PcInstance Pet - if ((attacker == this) || (attacker == getSummon())) + if ((attacker == this) || (attacker == getPet()) || attacker.hasServitor(attacker.getObjectId())) { return false; } @@ -8720,9 +8854,11 @@ public final class L2PcInstance extends L2Playable target = this; break; case PET: + target = getPet(); + break; case SERVITOR: case SUMMON: - target = getSummon(); + target = getServitors().values().stream().findFirst().orElse(null); break; default: target = getTarget(); @@ -9005,7 +9141,7 @@ public final class L2PcInstance extends L2Playable } } - if ((skill.getFlyType() == FlyType.CHARGE) && (Config.GEODATA > 0) && !GeoData.getInstance().canMove(this, target)) + if ((skill.getFlyType() == FlyType.CHARGE) && !GeoData.getInstance().canMove(this, target)) { sendPacket(SystemMessageId.THE_TARGET_IS_LOCATED_WHERE_YOU_CANNOT_CHARGE); return false; @@ -9658,9 +9794,15 @@ public final class L2PcInstance extends L2Playable public void enterOlympiadObserverMode(Location loc, int id) { - if (hasSummon()) + final L2Summon pet = getPet(); + if (pet != null) { - getSummon().unSummon(this); + pet.unSummon(this); + } + + if (hasServitors()) + { + getServitors().values().forEach(s -> s.unSummon(this)); } // Remove Hide. @@ -10096,7 +10238,7 @@ public final class L2PcInstance extends L2Playable _noble = val; sendSkillList(); - if (val && (getLevel() == ExperienceTable.getInstance().getMaxLevel())) + if (val && (getLevel() == ExperienceData.getInstance().getMaxLevel())) { sendPacket(new ExAcquireAPSkillList(this)); } @@ -10123,9 +10265,14 @@ public final class L2PcInstance extends L2Playable { super.setTeam(team); broadcastUserInfo(); - if (hasSummon()) + final L2Summon pet = getPet(); + if (pet != null) { - getSummon().broadcastStatusUpdate(); + pet.broadcastStatusUpdate(); + } + if (hasServitors()) + { + getServitors().values().forEach(L2Summon::broadcastStatusUpdate); } } @@ -10200,9 +10347,10 @@ public final class L2PcInstance extends L2Playable * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * @param classId * @param classIndex + * @param isDualClass * @return boolean subclassAdded */ - public boolean addSubClass(int classId, int classIndex) + public boolean addSubClass(int classId, int classIndex, boolean isDualClass) { if (!_subclassLock.tryLock()) { @@ -10223,9 +10371,15 @@ public final class L2PcInstance extends L2Playable // Note: Never change _classIndex in any method other than setActiveClass(). - SubClass newClass = new SubClass(); + final SubClass newClass = new SubClass(); newClass.setClassId(classId); newClass.setClassIndex(classIndex); + if (isDualClass) + { + newClass.setIsDualClass(true); + newClass.setExp(ExperienceData.getInstance().getExpForLevel(Config.BASE_DUALCLASS_LEVEL)); + newClass.setLevel(Config.BASE_DUALCLASS_LEVEL); + } try (Connection con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement statement = con.prepareStatement(ADD_CHAR_SUBCLASS)) @@ -10254,12 +10408,12 @@ public final class L2PcInstance extends L2Playable final Map prevSkillList = new HashMap<>(); for (L2SkillLearn skillInfo : skillTree.values()) { - if (skillInfo.getGetLevel() <= 40) + if (skillInfo.getGetLevel() <= newClass.getLevel()) { - Skill prevSkill = prevSkillList.get(skillInfo.getSkillId()); - Skill newSkill = SkillData.getInstance().getSkill(skillInfo.getSkillId(), skillInfo.getSkillLevel()); + final Skill prevSkill = prevSkillList.get(skillInfo.getSkillId()); + final Skill newSkill = SkillData.getInstance().getSkill(skillInfo.getSkillId(), skillInfo.getSkillLevel()); - if ((prevSkill != null) && (prevSkill.getLevel() > newSkill.getLevel())) + if (((prevSkill != null) && (prevSkill.getLevel() > newSkill.getLevel())) || SkillTreesData.getInstance().isRemoveSkill(subTemplate, skillInfo.getSkillId())) { continue; } @@ -10282,9 +10436,10 @@ public final class L2PcInstance extends L2Playable * 3. Upon Exception, revert the player to their BaseClass to avoid further problems. * @param classIndex the class index to delete * @param newClassId the new class Id + * @param isDualClass is subclass dualclass * @return {@code true} if the sub-class was modified, {@code false} otherwise */ - public boolean modifySubClass(int classIndex, int newClassId) + public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { if (!_subclassLock.tryLock()) { @@ -10340,7 +10495,7 @@ public final class L2PcInstance extends L2Playable _subclassLock.unlock(); } - return addSubClass(newClassId, classIndex); + return addSubClass(newClassId, classIndex, isDualClass); } public boolean isSubClassActive() @@ -10400,7 +10555,7 @@ public final class L2PcInstance extends L2Playable { _activeClass = classId; - final L2PcTemplate pcTemplate = CharTemplateTable.getInstance().getTemplate(classId); + final L2PcTemplate pcTemplate = PlayerTemplateData.getInstance().getTemplate(classId); if (pcTemplate == null) { _log.severe("Missing template for classId: " + classId); @@ -10464,9 +10619,9 @@ public final class L2PcInstance extends L2Playable _charges.set(0); stopChargeTask(); - if (hasServitor()) + if (hasServitors()) { - getSummon().unSummon(this); + getServitors().values().forEach(s -> s.unSummon(this)); } if (classIndex == 0) @@ -10811,32 +10966,34 @@ public final class L2PcInstance extends L2Playable } return; } - if ((Pet && hasPet() && getSummon().isDead()) || (!Pet && isDead())) + final L2Summon pet = getPet(); + if ((Pet && (pet != null) && pet.isDead()) || (!Pet && isDead())) { _reviveRequested = 1; - int restoreExp = 0; - _revivePower = Formulas.calculateSkillResurrectRestorePercent(power, reviver); - restoreExp = (int) Math.round(((getExpBeforeDeath() - getExp()) * _revivePower) / 100); _revivePet = Pet; if (hasCharmOfCourage()) { - ConfirmDlg dlg = new ConfirmDlg(SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()); + final ConfirmDlg dlg = new ConfirmDlg(SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()); dlg.addTime(60000); sendPacket(dlg); return; } + + final long restoreExp = Math.round(((getExpBeforeDeath() - getExp()) * _revivePower) / 100); ConfirmDlg dlg = new ConfirmDlg(SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()); dlg.addPcName(reviver); - dlg.addString(Integer.toString(restoreExp)); + dlg.addLong(restoreExp); + dlg.addInt(power); sendPacket(dlg); } } public void reviveAnswer(int answer) { - if ((_reviveRequested != 1) || (!isDead() && !_revivePet) || (_revivePet && hasPet() && !getSummon().isDead())) + final L2Summon pet = getPet(); + if ((_reviveRequested != 1) || (!isDead() && !_revivePet) || (_revivePet && (pet != null) && !pet.isDead())) { return; } @@ -10854,15 +11011,15 @@ public final class L2PcInstance extends L2Playable doRevive(); } } - else if (hasPet()) + else if (pet != null) { if (_revivePower != 0) { - getSummon().doRevive(_revivePower); + pet.doRevive(_revivePower); } else { - getSummon().doRevive(); + pet.doRevive(); } } } @@ -10970,16 +11127,25 @@ public final class L2PcInstance extends L2Playable } // Modify the position of the pet if necessary - final L2Summon summon = getSummon(); - if (summon != null) + final L2Summon pet = getPet(); + if (pet != null) { - summon.setFollowStatus(false); - summon.teleToLocation(getLocation(), false); - ((L2SummonAI) summon.getAI()).setStartFollowController(true); - summon.setFollowStatus(true); - summon.updateAndBroadcastStatus(0); + pet.setFollowStatus(false); + pet.teleToLocation(getLocation(), false); + ((L2SummonAI) pet.getAI()).setStartFollowController(true); + pet.setFollowStatus(true); + pet.updateAndBroadcastStatus(0); } + getServitors().values().forEach(s -> + { + s.setFollowStatus(false); + s.teleToLocation(getLocation(), false); + ((L2SummonAI) s.getAI()).setStartFollowController(true); + s.setFollowStatus(true); + s.updateAndBroadcastStatus(0); + }); + TvTEvent.onTeleported(this); } @@ -11212,7 +11378,8 @@ public final class L2PcInstance extends L2Playable } // Pet is summoned and not the item that summoned the pet AND not the buggle from strider you're mounting - if ((hasSummon() && (getSummon().getControlObjectId() == objectId)) || (getMountObjectID() == objectId)) + final L2Summon pet = getPet(); + if (((pet != null) && (pet.getControlObjectId() == objectId)) || (getMountObjectID() == objectId)) { if (Config.DEBUG) { @@ -11551,14 +11718,24 @@ public final class L2PcInstance extends L2Playable { try { - getSummon().setRestoreSummon(true); - - getSummon().unSummon(this); - // Dead pet wasn't unsummoned, broadcast npcinfo changes (pet will be without owner name - means owner offline) - if (hasSummon()) + L2Summon pet = getPet(); + if (pet != null) { - getSummon().broadcastNpcInfo(0); + pet.setRestoreSummon(true); + pet.unSummon(this); + // Dead pet wasn't unsummoned, broadcast npcinfo changes (pet will be without owner name - means owner offline) + pet = getPet(); + if (pet != null) + { + pet.broadcastNpcInfo(0); + } } + + getServitors().values().forEach(s -> + { + s.setRestoreSummon(true); + s.unSummon(this); + }); } catch (Exception e) { @@ -11596,7 +11773,7 @@ public final class L2PcInstance extends L2Playable { try { - AdminTable.getInstance().deleteGm(this); + AdminData.getInstance().deleteGm(this); } catch (Exception e) { @@ -11639,10 +11816,11 @@ public final class L2PcInstance extends L2Playable final int x = loc.getX() + Rnd.get(-30, 30); final int y = loc.getY() + Rnd.get(-30, 30); setXYZInvisible(x, y, loc.getZ()); - if (hasSummon()) // dead pet + final L2Summon pet = getPet(); + if (pet != null) // dead pet { - getSummon().teleToLocation(loc, true); - getSummon().setInstanceId(0); + pet.teleToLocation(loc, true); + pet.setInstanceId(0); } } } @@ -12766,10 +12944,11 @@ public final class L2PcInstance extends L2Playable { return; } - if (hasSummon()) + if (hasPet()) { - setCurrentFeed(((L2PetInstance) getSummon()).getCurrentFed()); - _controlItemId = getSummon().getControlObjectId(); + final L2Summon pet = getPet(); + setCurrentFeed(((L2PetInstance) pet).getCurrentFed()); + _controlItemId = pet.getControlObjectId(); sendPacket(new SetupGauge(3, (getCurrentFeed() * 10000) / getFeedConsume(), (getMaxFeed() * 10000) / getFeedConsume())); if (!isDead()) { @@ -13239,77 +13418,58 @@ public final class L2PcInstance extends L2Playable setXYZ(getBoat().getLocation()); activeChar.sendPacket(new CharInfo(this)); - int relation1 = getRelation(activeChar); - int relation2 = activeChar.getRelation(this); - Integer oldrelation = getKnownList().getKnownRelations().get(activeChar.getObjectId()); - if ((oldrelation != null) && (oldrelation != relation1)) - { - activeChar.sendPacket(new RelationChanged(this, relation1, isAutoAttackable(activeChar))); - if (hasSummon()) - { - activeChar.sendPacket(new RelationChanged(getSummon(), relation1, isAutoAttackable(activeChar))); - } - } - oldrelation = activeChar.getKnownList().getKnownRelations().get(getObjectId()); - if ((oldrelation != null) && (oldrelation != relation2)) - { - sendPacket(new RelationChanged(activeChar, relation2, activeChar.isAutoAttackable(this))); - if (activeChar.hasSummon()) - { - sendPacket(new RelationChanged(activeChar.getSummon(), relation2, activeChar.isAutoAttackable(this))); - } - } activeChar.sendPacket(new GetOnVehicle(getObjectId(), getBoat().getObjectId(), getInVehiclePosition())); } else if (isInAirShip()) { setXYZ(getAirShip().getLocation()); activeChar.sendPacket(new CharInfo(this)); - int relation1 = getRelation(activeChar); - int relation2 = activeChar.getRelation(this); - Integer oldrelation = getKnownList().getKnownRelations().get(activeChar.getObjectId()); - if ((oldrelation != null) && (oldrelation != relation1)) - { - activeChar.sendPacket(new RelationChanged(this, relation1, isAutoAttackable(activeChar))); - if (hasSummon()) - { - activeChar.sendPacket(new RelationChanged(getSummon(), relation1, isAutoAttackable(activeChar))); - } - } - oldrelation = activeChar.getKnownList().getKnownRelations().get(getObjectId()); - if ((oldrelation != null) && (oldrelation != relation2)) - { - sendPacket(new RelationChanged(activeChar, relation2, activeChar.isAutoAttackable(this))); - if (activeChar.hasSummon()) - { - sendPacket(new RelationChanged(activeChar.getSummon(), relation2, activeChar.isAutoAttackable(this))); - } - } activeChar.sendPacket(new ExGetOnAirShip(this, getAirShip())); } else { activeChar.sendPacket(new CharInfo(this)); - int relation1 = getRelation(activeChar); - int relation2 = activeChar.getRelation(this); - Integer oldrelation = getKnownList().getKnownRelations().get(activeChar.getObjectId()); - if ((oldrelation != null) && (oldrelation != relation1)) + } + + int relation1 = getRelation(activeChar); + int relation2 = activeChar.getRelation(this); + Integer oldrelation = getKnownList().getKnownRelations().get(activeChar.getObjectId()); + if ((oldrelation != null) && (oldrelation != relation1)) + { + final RelationChanged rc = new RelationChanged(); + rc.addRelation(this, relation1, isAutoAttackable(activeChar)); + if (hasSummon()) { - activeChar.sendPacket(new RelationChanged(this, relation1, isAutoAttackable(activeChar))); - if (hasSummon()) + final L2Summon pet = getPet(); + if (pet != null) { - activeChar.sendPacket(new RelationChanged(getSummon(), relation1, isAutoAttackable(activeChar))); + rc.addRelation(pet, relation1, isAutoAttackable(activeChar)); + } + if (hasServitors()) + { + getServitors().values().forEach(s -> rc.addRelation(s, relation1, isAutoAttackable(activeChar))); } } - oldrelation = activeChar.getKnownList().getKnownRelations().get(getObjectId()); - if ((oldrelation != null) && (oldrelation != relation2)) + activeChar.sendPacket(rc); + } + oldrelation = activeChar.getKnownList().getKnownRelations().get(getObjectId()); + if ((oldrelation != null) && (oldrelation != relation2)) + { + final RelationChanged rc = new RelationChanged(); + rc.addRelation(activeChar, relation2, activeChar.isAutoAttackable(this)); + if (activeChar.hasSummon()) { - sendPacket(new RelationChanged(activeChar, relation2, activeChar.isAutoAttackable(this))); - if (activeChar.hasSummon()) + final L2Summon pet = getPet(); + if (pet != null) { - sendPacket(new RelationChanged(activeChar.getSummon(), relation2, activeChar.isAutoAttackable(this))); + rc.addRelation(pet, relation2, activeChar.isAutoAttackable(this)); + } + if (hasServitors()) + { + getServitors().values().forEach(s -> rc.addRelation(s, relation2, activeChar.isAutoAttackable(this))); } } + sendPacket(rc); } switch (getPrivateStoreType()) @@ -13663,6 +13823,12 @@ public final class L2PcInstance extends L2Playable return false; } + // If there is no geodata loaded for the place we are client Z correction might cause falling damage. + if (!GeoData.getInstance().hasGeo(getX(), getY())) + { + return false; + } + final int damage = (int) Formulas.calcFallDam(this, deltaZ); if (damage > 0) { @@ -14682,4 +14848,14 @@ public final class L2PcInstance extends L2Playable { return getPlayerSide() == CastleSide.LIGHT; } + + public int getMaxSummonPoints() + { + return (int) getStat().calcStat(Stats.MAX_SUMMON_POINTS, 0, null, null); + } + + public int getSummonPoints() + { + return getServitors().values().stream().mapToInt(L2Summon::getSummonPoints).sum(); + } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PetInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PetInstance.java index a8008c03e3..66d8cd495c 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PetInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PetInstance.java @@ -32,12 +32,12 @@ import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.CharSummonTable; +import com.l2jserver.gameserver.data.sql.impl.CharSummonTable; +import com.l2jserver.gameserver.data.sql.impl.SummonEffectsTable; +import com.l2jserver.gameserver.data.sql.impl.SummonEffectsTable.SummonEffect; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.PetDataTable; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SummonEffectsTable; -import com.l2jserver.gameserver.datatables.SummonEffectsTable.SummonEffect; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.enums.ItemLocation; import com.l2jserver.gameserver.enums.PartyDistributionType; @@ -135,7 +135,8 @@ public class L2PetInstance extends L2Summon { try { - if ((getOwner() == null) || !getOwner().hasSummon() || (getOwner().getSummon().getObjectId() != getObjectId())) + final L2Summon pet = getOwner().getPet(); + if ((getOwner() == null) || (pet == null) || (pet.getObjectId() != getObjectId())) { stopFeed(); return; @@ -1162,7 +1163,7 @@ public class L2PetInstance extends L2Summon // stop feeding task if its active stopFeed(); - if (!isDead() && (getOwner().getSummon() == this)) + if (!isDead() && (getOwner().getPet() == this)) { _feedTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new FeedTask(), 10000, 10000); } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2SepulcherNpcInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2SepulcherNpcInstance.java index 98709ba1d0..d35de573b7 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2SepulcherNpcInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2SepulcherNpcInstance.java @@ -23,7 +23,7 @@ import java.util.concurrent.Future; import com.l2jserver.Config; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.instancemanager.FourSepulchersManager; import com.l2jserver.gameserver.model.L2World; @@ -354,7 +354,7 @@ public class L2SepulcherNpcInstance extends L2Npc public void openNextDoor(int npcId) { int doorId = FourSepulchersManager.getInstance().getHallGateKeepers().get(npcId); - DoorTable _doorTable = DoorTable.getInstance(); + DoorData _doorTable = DoorData.getInstance(); _doorTable.getDoor(doorId).openMe(); if (_closeTask != null) @@ -371,7 +371,7 @@ public class L2SepulcherNpcInstance extends L2Npc private static class CloseNextDoor implements Runnable { - final DoorTable _DoorTable = DoorTable.getInstance(); + final DoorData _DoorTable = DoorData.getInstance(); private final int _DoorId; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ServitorInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ServitorInstance.java index 6b043f8cf8..60ec48545a 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ServitorInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2ServitorInstance.java @@ -33,10 +33,10 @@ import javolution.util.FastList; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.CharSummonTable; +import com.l2jserver.gameserver.data.sql.impl.CharSummonTable; +import com.l2jserver.gameserver.data.sql.impl.SummonEffectsTable; +import com.l2jserver.gameserver.data.sql.impl.SummonEffectsTable.SummonEffect; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SummonEffectsTable; -import com.l2jserver.gameserver.datatables.SummonEffectsTable.SummonEffect; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Character; @@ -188,7 +188,7 @@ public class L2ServitorInstance extends L2Summon implements Runnable _summonLifeTask.cancel(false); } - CharSummonTable.getInstance().removeServitor(getOwner()); + CharSummonTable.getInstance().removeServitor(getOwner(), getObjectId()); return true; } @@ -465,7 +465,7 @@ public class L2ServitorInstance extends L2Summon implements Runnable if (!_restoreSummon) { - CharSummonTable.getInstance().removeServitor(owner); + CharSummonTable.getInstance().removeServitor(owner, getObjectId()); } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2TamedBeastInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2TamedBeastInstance.java index d05ba83d59..f812529836 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2TamedBeastInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2TamedBeastInstance.java @@ -27,12 +27,13 @@ import javolution.util.FastList; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.CtrlIntention; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.enums.InstanceType; +import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Character; -import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.effects.L2EffectType; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.model.skills.Skill; @@ -64,16 +65,16 @@ public final class L2TamedBeastInstance extends L2FeedableBeastInstance protected boolean _isFreyaBeast; private List _beastSkills = null; - public L2TamedBeastInstance(int objectId, L2NpcTemplate template) + public L2TamedBeastInstance(int objectId, int npcTemplateId) { - super(objectId, template); + super(IdFactory.getInstance().getNextId(), NpcData.getInstance().getTemplate(npcTemplateId)); setInstanceType(InstanceType.L2TamedBeastInstance); setHome(this); } - public L2TamedBeastInstance(int objectId, L2NpcTemplate template, L2PcInstance owner, int foodSkillId, int x, int y, int z) + public L2TamedBeastInstance(int npcTemplateId, L2PcInstance owner, int foodSkillId, int x, int y, int z) { - super(objectId, template); + super(IdFactory.getInstance().getNextId(), NpcData.getInstance().getTemplate(npcTemplateId)); _isFreyaBeast = false; setInstanceType(InstanceType.L2TamedBeastInstance); setCurrentHp(getMaxHp()); @@ -81,12 +82,12 @@ public final class L2TamedBeastInstance extends L2FeedableBeastInstance setOwner(owner); setFoodType(foodSkillId); setHome(x, y, z); - this.spawnMe(x, y, z); + spawnMe(x, y, z); } - public L2TamedBeastInstance(int objectId, L2NpcTemplate template, L2PcInstance owner, int food, int x, int y, int z, boolean isFreyaBeast) + public L2TamedBeastInstance(int npcTemplateId, L2PcInstance owner, int food, int x, int y, int z, boolean isFreyaBeast) { - super(objectId, template); + super(IdFactory.getInstance().getNextId(), NpcData.getInstance().getTemplate(npcTemplateId)); _isFreyaBeast = isFreyaBeast; setInstanceType(InstanceType.L2TamedBeastInstance); setCurrentHp(getMaxHp()); @@ -99,7 +100,6 @@ public final class L2TamedBeastInstance extends L2FeedableBeastInstance { getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, _owner); } - } public void onReceiveFood() diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2TeleporterInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2TeleporterInstance.java index e7e655a284..12b2d68ac0 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2TeleporterInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2TeleporterInstance.java @@ -28,10 +28,10 @@ import java.util.stream.Stream; import com.l2jserver.Config; import com.l2jserver.gameserver.cache.HtmCache; +import com.l2jserver.gameserver.data.sql.impl.TeleportLocationTable; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.TeleportersData; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.MultisellData; -import com.l2jserver.gameserver.datatables.TeleportLocationTable; -import com.l2jserver.gameserver.datatables.TeleportersData; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.instancemanager.SiegeManager; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterInstance.java index cade244be7..68d6d42a44 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterInstance.java @@ -18,19 +18,15 @@ */ package com.l2jserver.gameserver.model.actor.instance; -import java.util.Iterator; import java.util.List; -import java.util.Set; import java.util.logging.Logger; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.ClassListData; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.enums.InstanceType; -import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.instancemanager.FortManager; import com.l2jserver.gameserver.instancemanager.FortSiegeManager; @@ -41,12 +37,9 @@ import com.l2jserver.gameserver.model.L2ClanMember; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.base.AcquireSkillType; -import com.l2jserver.gameserver.model.base.ClassId; import com.l2jserver.gameserver.model.base.PlayerClass; -import com.l2jserver.gameserver.model.base.SubClass; import com.l2jserver.gameserver.model.entity.Castle; import com.l2jserver.gameserver.model.entity.Fort; -import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.model.zone.ZoneId; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.ActionFailed; @@ -57,7 +50,6 @@ import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.gameserver.network.serverpackets.UserInfo; import com.l2jserver.gameserver.util.Util; -import com.l2jserver.util.StringUtil; /** * This class ... @@ -294,562 +286,12 @@ public class L2VillageMasterInstance extends L2NpcInstance { showPledgeSkillList(player); } - else if (command.startsWith("Subclass")) - { - // Subclasses may not be changed while a skill is in use. - if (player.isCastingNow() || player.isAllSkillsDisabled()) - { - player.sendPacket(SystemMessageId.SUBCLASSES_MAY_NOT_BE_CREATED_OR_CHANGED_WHILE_A_SKILL_IS_IN_USE); - return; - } - final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); - // Subclasses may not be changed while a transformated state. - if (player.getTransformation() != null) - { - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_NoTransformed.htm"); - player.sendPacket(html); - return; - } - // Subclasses may not be changed while a summon is active. - if (player.hasSummon()) - { - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_NoSummon.htm"); - player.sendPacket(html); - return; - } - // Subclasses may not be changed while you have exceeded your inventory limit. - if (!player.isInventoryUnder90(true)) - { - player.sendPacket(SystemMessageId.A_SUBCLASS_CANNOT_BE_CREATED_OR_CHANGED_BECAUSE_YOU_HAVE_EXCEEDED_YOUR_INVENTORY_LIMIT); - return; - } - // Subclasses may not be changed while a you are over your weight limit. - if (player.getWeightPenalty() >= 2) - { - player.sendPacket(SystemMessageId.A_SUBCLASS_CANNOT_BE_CREATED_OR_CHANGED_WHILE_YOU_ARE_OVER_YOUR_WEIGHT_LIMIT); - return; - } - - int cmdChoice = 0; - int paramOne = 0; - int paramTwo = 0; - try - { - cmdChoice = Integer.parseInt(command.substring(9, 10).trim()); - - int endIndex = command.indexOf(' ', 11); - if (endIndex == -1) - { - endIndex = command.length(); - } - - if (command.length() > 11) - { - paramOne = Integer.parseInt(command.substring(11, endIndex).trim()); - if (command.length() > endIndex) - { - paramTwo = Integer.parseInt(command.substring(endIndex).trim()); - } - } - } - catch (Exception NumberFormatException) - { - _log.warning(L2VillageMasterInstance.class.getName() + ": Wrong numeric values for command " + command); - } - - Set subsAvailable = null; - switch (cmdChoice) - { - case 0: // Subclass change menu - html.setFile(player.getHtmlPrefix(), getSubClassMenu(player.getRace())); - break; - case 1: // Add Subclass - Initial - // Avoid giving player an option to add a new sub class, if they have max sub-classes already. - if (player.getTotalSubClasses() >= Config.MAX_SUBCLASS) - { - html.setFile(player.getHtmlPrefix(), getSubClassFail()); - break; - } - - subsAvailable = getAvailableSubClasses(player); - if ((subsAvailable != null) && !subsAvailable.isEmpty()) - { - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Add.htm"); - final StringBuilder content1 = StringUtil.startAppend(200); - for (PlayerClass subClass : subsAvailable) - { - StringUtil.append(content1, "", ClassListData.getInstance().getClass(subClass.ordinal()).getClientCode(), "
"); - } - html.replace("%list%", content1.toString()); - } - else - { - if ((player.getRace() == Race.ELF) || (player.getRace() == Race.DARK_ELF)) - { - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Fail_Elves.htm"); - player.sendPacket(html); - } - else if (player.getRace() == Race.KAMAEL) - { - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Fail_Kamael.htm"); - player.sendPacket(html); - } - else - { - // TODO: Retail message - player.sendMessage("There are no sub classes available at this time."); - } - return; - } - break; - case 2: // Change Class - Initial - if (player.getSubClasses().isEmpty()) - { - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ChangeNo.htm"); - } - else - { - final StringBuilder content2 = StringUtil.startAppend(200); - if (checkVillageMaster(player.getBaseClass())) - { - StringUtil.append(content2, "", ClassListData.getInstance().getClass(player.getBaseClass()).getClientCode(), "
"); - } - - for (Iterator subList = iterSubClasses(player); subList.hasNext();) - { - SubClass subClass = subList.next(); - if (checkVillageMaster(subClass.getClassDefinition())) - { - StringUtil.append(content2, "", ClassListData.getInstance().getClass(subClass.getClassId()).getClientCode(), "
"); - } - } - - if (content2.length() > 0) - { - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Change.htm"); - html.replace("%list%", content2.toString()); - } - else - { - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ChangeNotFound.htm"); - } - } - break; - case 3: // Change/Cancel Subclass - Initial - if ((player.getSubClasses() == null) || player.getSubClasses().isEmpty()) - { - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyEmpty.htm"); - break; - } - - // custom value - if (player.getTotalSubClasses() > 3) - { - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyCustom.htm"); - final StringBuilder content3 = StringUtil.startAppend(200); - int classIndex = 1; - - for (Iterator subList = iterSubClasses(player); subList.hasNext();) - { - SubClass subClass = subList.next(); - - StringUtil.append(content3, "Sub-class ", String.valueOf(classIndex++), "
", "", ClassListData.getInstance().getClass(subClass.getClassId()).getClientCode(), "
"); - } - html.replace("%list%", content3.toString()); - } - else - { - // retail html contain only 3 subclasses - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Modify.htm"); - if (player.getSubClasses().containsKey(1)) - { - html.replace("%sub1%", ClassListData.getInstance().getClass(player.getSubClasses().get(1).getClassId()).getClientCode()); - } - else - { - html.replace("%sub1%
", ""); - } - - if (player.getSubClasses().containsKey(2)) - { - html.replace("%sub2%", ClassListData.getInstance().getClass(player.getSubClasses().get(2).getClassId()).getClientCode()); - } - else - { - html.replace("%sub2%
", ""); - } - - if (player.getSubClasses().containsKey(3)) - { - html.replace("%sub3%", ClassListData.getInstance().getClass(player.getSubClasses().get(3).getClassId()).getClientCode()); - } - else - { - html.replace("%sub3%
", ""); - } - } - break; - case 4: // Add Subclass - Action (Subclass 4 x[x]) - /** - * If the character is less than level 75 on any of their previously chosen classes then disallow them to change to their most recently added sub-class choice. - */ - if (!player.getFloodProtectors().getSubclass().tryPerformAction("add subclass")) - { - _log.warning(L2VillageMasterInstance.class.getName() + ": Player " + player.getName() + " has performed a subclass change too fast"); - return; - } - - boolean allowAddition = true; - - if (player.getTotalSubClasses() >= Config.MAX_SUBCLASS) - { - allowAddition = false; - } - - if (player.getLevel() < 75) - { - allowAddition = false; - } - - if (allowAddition) - { - if (!player.getSubClasses().isEmpty()) - { - for (Iterator subList = iterSubClasses(player); subList.hasNext();) - { - SubClass subClass = subList.next(); - - if (subClass.getLevel() < 75) - { - allowAddition = false; - break; - } - } - } - } - - /** - * If quest checking is enabled, verify if the character has completed the Mimir's Elixir (Path to Subclass) and Fate's Whisper (A Grade Weapon) quests by checking for instances of their unique reward items. If they both exist, remove both unique items and continue with adding - * the sub-class. - */ - if (allowAddition && !Config.ALT_GAME_SUBCLASS_WITHOUT_QUESTS) - { - allowAddition = checkQuests(player); - } - - if (allowAddition && isValidNewSubClass(player, paramOne)) - { - if (!player.addSubClass(paramOne, player.getTotalSubClasses() + 1)) - { - return; - } - - player.setActiveClass(player.getTotalSubClasses()); - - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_AddOk.htm"); - - player.sendPacket(SystemMessageId.THE_NEW_SUBCLASS_HAS_BEEN_ADDED); // Subclass added. - } - else - { - html.setFile(player.getHtmlPrefix(), getSubClassFail()); - } - break; - case 5: // Change Class - Action - /** - * If the character is less than level 75 on any of their previously chosen classes then disallow them to change to their most recently added sub-class choice. Note: paramOne = classIndex - */ - if (!player.getFloodProtectors().getSubclass().tryPerformAction("change class")) - { - _log.warning(L2VillageMasterInstance.class.getName() + ": Player " + player.getName() + " has performed a subclass change too fast"); - return; - } - - if (player.getClassIndex() == paramOne) - { - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Current.htm"); - break; - } - - if (paramOne == 0) - { - if (!checkVillageMaster(player.getBaseClass())) - { - return; - } - } - else - { - try - { - if (!checkVillageMaster(player.getSubClasses().get(paramOne).getClassDefinition())) - { - return; - } - } - catch (NullPointerException e) - { - return; - } - } - - final int fromClassId = player.getClassId().getId(); - player.setActiveClass(paramOne); - final SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2); - msg.addClassId(fromClassId); - msg.addClassId(player.getClassId().getId()); - player.sendPacket(msg); - return; - case 6: // Change/Cancel Subclass - Choice - // validity check - if ((paramOne < 1) || (paramOne > Config.MAX_SUBCLASS)) - { - return; - } - - subsAvailable = getAvailableSubClasses(player); - // another validity check - if ((subsAvailable == null) || subsAvailable.isEmpty()) - { - // TODO: Retail message - player.sendMessage("There are no sub classes available at this time."); - return; - } - - final StringBuilder content6 = StringUtil.startAppend(200); - for (PlayerClass subClass : subsAvailable) - { - StringUtil.append(content6, "", ClassListData.getInstance().getClass(subClass.ordinal()).getClientCode(), "
"); - } - - switch (paramOne) - { - case 1: - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyChoice1.htm"); - break; - case 2: - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyChoice2.htm"); - break; - case 3: - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyChoice3.htm"); - break; - default: - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyChoice.htm"); - } - html.replace("%list%", content6.toString()); - break; - case 7: // Change Subclass - Action - /** - * Warning: the information about this subclass will be removed from the subclass list even if false! - */ - if (!player.getFloodProtectors().getSubclass().tryPerformAction("change class")) - { - _log.warning(L2VillageMasterInstance.class.getName() + ": Player " + player.getName() + " has performed a subclass change too fast"); - return; - } - - if (!isValidNewSubClass(player, paramTwo)) - { - return; - } - - if (player.modifySubClass(paramOne, paramTwo)) - { - player.abortCast(); - player.stopAllEffectsExceptThoseThatLastThroughDeath(); // all effects from old subclass stopped! - player.stopAllEffectsNotStayOnSubclassChange(); - player.stopCubics(); - player.setActiveClass(paramOne); - - html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyOk.htm"); - html.replace("%name%", ClassListData.getInstance().getClass(paramTwo).getClientCode()); - - player.sendPacket(SystemMessageId.THE_NEW_SUBCLASS_HAS_BEEN_ADDED); // Subclass added. - } - else - { - /** - * This isn't good! modifySubClass() removed subclass from memory we must update _classIndex! Else IndexOutOfBoundsException can turn up some place down the line along with other seemingly unrelated problems. - */ - player.setActiveClass(0); // Also updates _classIndex plus switching _classid to baseclass. - - player.sendMessage("The sub class could not be added, you have been reverted to your base class."); - return; - } - break; - } - html.replace("%objectId%", String.valueOf(getObjectId())); - player.sendPacket(html); - } else { super.onBypassFeedback(player, command); } } - protected String getSubClassMenu(Race race) - { - if (Config.ALT_GAME_SUBCLASS_EVERYWHERE || (race != Race.KAMAEL)) - { - return "data/html/villagemaster/SubClass.htm"; - } - - return "data/html/villagemaster/SubClass_NoOther.htm"; - } - - protected String getSubClassFail() - { - return "data/html/villagemaster/SubClass_Fail.htm"; - } - - protected boolean checkQuests(L2PcInstance player) - { - // Noble players can add Sub-Classes without quests - if (player.isNoble()) - { - return true; - } - - QuestState qs = player.getQuestState("234_FatesWhisper"); - if ((qs == null) || !qs.isCompleted()) - { - return false; - } - - qs = player.getQuestState("Q00235_MimirsElixir"); - if ((qs == null) || !qs.isCompleted()) - { - return false; - } - - return true; - } - - /** - * Returns list of available subclasses Base class and already used subclasses removed - * @param player - * @return - */ - private final Set getAvailableSubClasses(L2PcInstance player) - { - // get player base class - final int currentBaseId = player.getBaseClass(); - final ClassId baseCID = ClassId.getClassId(currentBaseId); - - // we need 2nd occupation ID - final int baseClassId; - if (baseCID.level() > 2) - { - baseClassId = baseCID.getParent().ordinal(); - } - else - { - baseClassId = currentBaseId; - } - - /** - * If the race of your main class is Elf or Dark Elf, you may not select each class as a subclass to the other class. If the race of your main class is Kamael, you may not subclass any other race If the race of your main class is NOT Kamael, you may not subclass any Kamael class You may not - * select Overlord and Warsmith class as a subclass. You may not select a similar class as the subclass. The occupations classified as similar classes are as follows: Treasure Hunter, Plainswalker and Abyss Walker Hawkeye, Silver Ranger and Phantom Ranger Paladin, Dark Avenger, Temple Knight - * and Shillien Knight Warlocks, Elemental Summoner and Phantom Summoner Elder and Shillien Elder Swordsinger and Bladedancer Sorcerer, Spellsinger and Spellhowler Also, Kamael have a special, hidden 4 subclass, the inspector, which can only be taken if you have already completed the other - * two Kamael subclasses - */ - Set availSubs = PlayerClass.values()[baseClassId].getAvailableSubclasses(player); - - if ((availSubs != null) && !availSubs.isEmpty()) - { - for (Iterator availSub = availSubs.iterator(); availSub.hasNext();) - { - PlayerClass pclass = availSub.next(); - - // check for the village master - if (!checkVillageMaster(pclass)) - { - availSub.remove(); - continue; - } - - // scan for already used subclasses - int availClassId = pclass.ordinal(); - ClassId cid = ClassId.getClassId(availClassId); - SubClass prevSubClass; - ClassId subClassId; - for (Iterator subList = iterSubClasses(player); subList.hasNext();) - { - prevSubClass = subList.next(); - subClassId = ClassId.getClassId(prevSubClass.getClassId()); - - if (subClassId.equalsOrChildOf(cid)) - { - availSub.remove(); - break; - } - } - } - } - - return availSubs; - } - - /** - * Check new subclass classId for validity (villagemaster race/type, is not contains in previous subclasses, is contains in allowed subclasses) Base class not added into allowed subclasses. - * @param player - * @param classId - * @return - */ - private final boolean isValidNewSubClass(L2PcInstance player, int classId) - { - if (!checkVillageMaster(classId)) - { - return false; - } - - final ClassId cid = ClassId.values()[classId]; - SubClass sub; - ClassId subClassId; - for (Iterator subList = iterSubClasses(player); subList.hasNext();) - { - sub = subList.next(); - subClassId = ClassId.values()[sub.getClassId()]; - - if (subClassId.equalsOrChildOf(cid)) - { - return false; - } - } - - // get player base class - final int currentBaseId = player.getBaseClass(); - final ClassId baseCID = ClassId.getClassId(currentBaseId); - - // we need 2nd occupation ID - final int baseClassId; - if (baseCID.level() > 2) - { - baseClassId = baseCID.getParent().ordinal(); - } - else - { - baseClassId = currentBaseId; - } - - Set availSubs = PlayerClass.values()[baseClassId].getAvailableSubclasses(player); - if ((availSubs == null) || availSubs.isEmpty()) - { - return false; - } - - boolean found = false; - for (PlayerClass pclass : availSubs) - { - if (pclass.ordinal() == classId) - { - found = true; - break; - } - } - return found; - } - protected boolean checkVillageMasterRace(PlayerClass pclass) { return true; @@ -877,19 +319,9 @@ public class L2VillageMasterInstance extends L2NpcInstance */ public final boolean checkVillageMaster(PlayerClass pclass) { - if (Config.ALT_GAME_SUBCLASS_EVERYWHERE) - { - return true; - } - return checkVillageMasterRace(pclass) && checkVillageMasterTeachType(pclass); } - private static final Iterator iterSubClasses(L2PcInstance player) - { - return player.getSubClasses().values().iterator(); - } - private static final void dissolveClan(L2PcInstance player, int clanId) { if (!player.isClanLeader()) diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterKamaelInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterKamaelInstance.java index 3bc84afd50..c0dbed0506 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterKamaelInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2VillageMasterKamaelInstance.java @@ -18,11 +18,9 @@ */ package com.l2jserver.gameserver.model.actor.instance; -import com.l2jserver.Config; import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.base.PlayerClass; -import com.l2jserver.gameserver.model.quest.QuestState; public final class L2VillageMasterKamaelInstance extends L2VillageMasterInstance { @@ -31,47 +29,6 @@ public final class L2VillageMasterKamaelInstance extends L2VillageMasterInstance super(objectId, template); } - @Override - protected final String getSubClassMenu(Race race) - { - if (Config.ALT_GAME_SUBCLASS_EVERYWHERE || (race == Race.KAMAEL)) - { - return "data/html/villagemaster/SubClass.htm"; - } - - return "data/html/villagemaster/SubClass_NoKamael.htm"; - } - - @Override - protected final String getSubClassFail() - { - return "data/html/villagemaster/SubClass_Fail_Kamael.htm"; - } - - @Override - protected final boolean checkQuests(L2PcInstance player) - { - // Noble players can add subbclasses without quests - if (player.isNoble()) - { - return true; - } - - QuestState qs = player.getQuestState("234_FatesWhisper"); - if ((qs == null) || !qs.isCompleted()) - { - return false; - } - - qs = player.getQuestState("236_SeedsOfChaos"); - if ((qs == null) || !qs.isCompleted()) - { - return false; - } - - return true; - } - @Override protected final boolean checkVillageMasterRace(PlayerClass pclass) { diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/stat/PcStat.java b/trunk/java/com/l2jserver/gameserver/model/actor/stat/PcStat.java index aa444ea8f9..957e58937e 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/stat/PcStat.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/stat/PcStat.java @@ -21,12 +21,13 @@ package com.l2jserver.gameserver.model.actor.stat; import java.util.concurrent.atomic.AtomicInteger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ExperienceTable; -import com.l2jserver.gameserver.datatables.PetDataTable; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; import com.l2jserver.gameserver.enums.PartySmallWindowUpdateType; import com.l2jserver.gameserver.enums.UserInfoType; import com.l2jserver.gameserver.model.L2PetLevelData; import com.l2jserver.gameserver.model.PcCondOverride; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2ClassMasterInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PetInstance; @@ -140,9 +141,10 @@ public class PcStat extends PlayableStat float ratioTakenByPlayer = 0; // if this player has a pet and it is in his range he takes from the owner's Exp, give the pet Exp now - if (activeChar.hasPet() && Util.checkIfInShortRadius(Config.ALT_PARTY_RANGE, activeChar, activeChar.getSummon(), false)) + final L2Summon sPet = activeChar.getPet(); + if ((sPet != null) && Util.checkIfInShortRadius(Config.ALT_PARTY_RANGE, activeChar, sPet, false)) { - L2PetInstance pet = (L2PetInstance) activeChar.getSummon(); + L2PetInstance pet = (L2PetInstance) sPet; ratioTakenByPlayer = pet.getPetLevelData().getOwnerExpTaken() / 100f; // only give exp/sp to the pet by taking from the owner if the pet has a non-zero, positive ratio @@ -243,7 +245,7 @@ public class PcStat extends PlayableStat @Override public final boolean addLevel(byte value) { - if ((getLevel() + value) > (ExperienceTable.getInstance().getMaxLevel() - 1)) + if ((getLevel() + value) > (ExperienceData.getInstance().getMaxLevel() - 1)) { return false; } @@ -281,9 +283,10 @@ public class PcStat extends PlayableStat } // Synchronize level with pet if possible. - if (getActiveChar().hasPet()) + final L2Summon sPet = getActiveChar().getPet(); + if (sPet != null) { - final L2PetInstance pet = (L2PetInstance) getActiveChar().getSummon(); + final L2PetInstance pet = (L2PetInstance) sPet; if (pet.getPetData().isSynchLevel() && (pet.getLevel() != getLevel())) { pet.getStat().setLevel(getLevel()); @@ -317,7 +320,7 @@ public class PcStat extends PlayableStat partyWindow.addUpdateType(PartySmallWindowUpdateType.LEVEL); getActiveChar().getParty().broadcastToPartyMembers(getActiveChar(), partyWindow); } - if ((getLevel() == ExperienceTable.getInstance().getMaxLevel()) && getActiveChar().isNoble()) + if ((getLevel() == ExperienceData.getInstance().getMaxLevel()) && getActiveChar().isNoble()) { getActiveChar().sendPacket(new ExAcquireAPSkillList(getActiveChar())); } @@ -342,7 +345,7 @@ public class PcStat extends PlayableStat @Override public final long getExpForLevel(int level) { - return ExperienceTable.getInstance().getExpForLevel(level); + return ExperienceData.getInstance().getExpForLevel(level); } @Override @@ -454,9 +457,9 @@ public class PcStat extends PlayableStat @Override public final void setLevel(byte value) { - if (value > (ExperienceTable.getInstance().getMaxLevel() - 1)) + if (value > (ExperienceData.getInstance().getMaxLevel() - 1)) { - value = (byte) (ExperienceTable.getInstance().getMaxLevel() - 1); + value = (byte) (ExperienceData.getInstance().getMaxLevel() - 1); } if (getActiveChar().isSubClassActive()) diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/stat/PetStat.java b/trunk/java/com/l2jserver/gameserver/model/actor/stat/PetStat.java index 715ef3856a..6e08a6f64d 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/stat/PetStat.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/stat/PetStat.java @@ -18,8 +18,8 @@ */ package com.l2jserver.gameserver.model.actor.stat; -import com.l2jserver.gameserver.datatables.ExperienceTable; -import com.l2jserver.gameserver.datatables.PetDataTable; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2PetInstance; import com.l2jserver.gameserver.model.skills.Skill; @@ -215,6 +215,6 @@ public class PetStat extends SummonStat @Override public int getMaxLevel() { - return ExperienceTable.getInstance().getMaxPetLevel(); + return ExperienceData.getInstance().getMaxPetLevel(); } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/stat/PlayableStat.java b/trunk/java/com/l2jserver/gameserver/model/actor/stat/PlayableStat.java index 4377a14f80..db3238a617 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/stat/PlayableStat.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/stat/PlayableStat.java @@ -21,9 +21,9 @@ package com.l2jserver.gameserver.model.actor.stat; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ExperienceTable; -import com.l2jserver.gameserver.datatables.PetDataTable; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.instancemanager.ZoneManager; import com.l2jserver.gameserver.model.actor.L2Playable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -264,6 +264,6 @@ public class PlayableStat extends CharStat public int getMaxLevel() { - return ExperienceTable.getInstance().getMaxLevel(); + return ExperienceData.getInstance().getMaxLevel(); } } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/status/PcStatus.java b/trunk/java/com/l2jserver/gameserver/model/actor/status/PcStatus.java index ad4b4fadac..af00209d92 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/status/PcStatus.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/status/PcStatus.java @@ -147,8 +147,8 @@ public class PcStatus extends PlayableStatus } // Check and calculate transfered damage - final L2Summon summon = getActiveChar().getSummon(); - if (getActiveChar().hasServitor() && Util.checkIfInRange(1000, getActiveChar(), summon, true)) + final L2Summon summon = getActiveChar().getAnyServitor(); + if ((summon != null) && Util.checkIfInRange(1000, getActiveChar(), summon, true)) { tDmg = ((int) value * (int) getActiveChar().getStat().calcStat(Stats.TRANSFER_DAMAGE_PERCENT, 0, null, null)) / 100; @@ -248,10 +248,10 @@ public class PcStatus extends PlayableStatus smsg.addInt(fullValue); getActiveChar().sendPacket(smsg); - if (tDmg > 0) + if ((tDmg > 0) && (summon != null)) { smsg = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_RECEIVED_S3_DAMAGE_FROM_C2); - smsg.addString(getActiveChar().getSummon().getName()); + smsg.addString(summon.getName()); smsg.addCharName(attacker); smsg.addInt(tDmg); getActiveChar().sendPacket(smsg); @@ -303,10 +303,12 @@ public class PcStatus extends PlayableStatus stopHpMpRegeneration(); getActiveChar().setIsDead(true); getActiveChar().setIsPendingRevive(true); - if (getActiveChar().hasSummon()) + final L2Summon pet = getActiveChar().getPet(); + if (pet != null) { - getActiveChar().getSummon().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null); + pet.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null); } + getActiveChar().getServitors().values().forEach(s -> s.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null)); return; } diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/tasks/cubics/CubicAction.java b/trunk/java/com/l2jserver/gameserver/model/actor/tasks/cubics/CubicAction.java index 21d0bf4bac..a5fa723da1 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/tasks/cubics/CubicAction.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/tasks/cubics/CubicAction.java @@ -24,6 +24,7 @@ import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2CubicInstance; import com.l2jserver.gameserver.model.effects.L2EffectType; import com.l2jserver.gameserver.model.skills.BuffInfo; @@ -72,10 +73,13 @@ public final class CubicAction implements Runnable { if (_cubic.getOwner().hasSummon()) { - if (!AttackStanceTaskManager.getInstance().hasAttackStanceTask(_cubic.getOwner().getSummon())) + for (L2Summon servitor : _cubic.getOwner().getServitors().values()) { - _cubic.stopAction(); - return; + if (!AttackStanceTaskManager.getInstance().hasAttackStanceTask(servitor)) + { + _cubic.stopAction(); + return; + } } } else diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/tasks/player/GameGuardCheckTask.java b/trunk/java/com/l2jserver/gameserver/model/actor/tasks/player/GameGuardCheckTask.java index 49659c8666..bcdeb130ab 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/tasks/player/GameGuardCheckTask.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/tasks/player/GameGuardCheckTask.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.model.actor.tasks.player; import java.util.logging.Logger; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.L2GameClient; import com.l2jserver.gameserver.network.serverpackets.LeaveWorld; @@ -48,7 +48,7 @@ public class GameGuardCheckTask implements Runnable L2GameClient client = _player.getClient(); if ((client != null) && !client.isAuthedGG() && _player.isOnline()) { - AdminTable.getInstance().broadcastMessageToGMs("Client " + client + " failed to reply GameGuard query and is being kicked!"); + AdminData.getInstance().broadcastMessageToGMs("Client " + client + " failed to reply GameGuard query and is being kicked!"); _log.info("Client " + client + " failed to reply GameGuard query and is being kicked!"); client.close(LeaveWorld.STATIC_PACKET); diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/tasks/player/IllegalPlayerActionTask.java b/trunk/java/com/l2jserver/gameserver/model/actor/tasks/player/IllegalPlayerActionTask.java index 36c6294c20..1a32be7986 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/tasks/player/IllegalPlayerActionTask.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/tasks/player/IllegalPlayerActionTask.java @@ -23,7 +23,7 @@ import java.util.logging.LogRecord; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.enums.IllegalActionPunishmentType; import com.l2jserver.gameserver.instancemanager.PunishmentManager; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -84,7 +84,7 @@ public final class IllegalPlayerActionTask implements Runnable //@formatter:on _log.log(record); - AdminTable.getInstance().broadcastMessageToGMs(_message); + AdminData.getInstance().broadcastMessageToGMs(_message); if (!_actor.isGM()) { switch (_punishment) diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/templates/L2NpcTemplate.java b/trunk/java/com/l2jserver/gameserver/model/actor/templates/L2NpcTemplate.java index 2e57048c67..67cfc4b6b8 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/templates/L2NpcTemplate.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/templates/L2NpcTemplate.java @@ -25,7 +25,7 @@ import java.util.Map; import java.util.Set; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.enums.AISkillScope; import com.l2jserver.gameserver.enums.AIType; import com.l2jserver.gameserver.enums.Race; diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/templates/L2PcTemplate.java b/trunk/java/com/l2jserver/gameserver/model/actor/templates/L2PcTemplate.java index e22e134152..59838b382d 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/templates/L2PcTemplate.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/templates/L2PcTemplate.java @@ -22,7 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import com.l2jserver.gameserver.datatables.ExperienceTable; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.base.ClassId; @@ -57,12 +57,12 @@ public class L2PcTemplate extends L2CharTemplate super(set); _classId = ClassId.getClassId(set.getInt("classId")); setRace(_classId.getRace()); - _baseHp = new float[ExperienceTable.getInstance().getMaxLevel()]; - _baseMp = new float[ExperienceTable.getInstance().getMaxLevel()]; - _baseCp = new float[ExperienceTable.getInstance().getMaxLevel()]; - _baseHpReg = new double[ExperienceTable.getInstance().getMaxLevel()]; - _baseMpReg = new double[ExperienceTable.getInstance().getMaxLevel()]; - _baseCpReg = new double[ExperienceTable.getInstance().getMaxLevel()]; + _baseHp = new float[ExperienceData.getInstance().getMaxLevel()]; + _baseMp = new float[ExperienceData.getInstance().getMaxLevel()]; + _baseCp = new float[ExperienceData.getInstance().getMaxLevel()]; + _baseHpReg = new double[ExperienceData.getInstance().getMaxLevel()]; + _baseMpReg = new double[ExperienceData.getInstance().getMaxLevel()]; + _baseCpReg = new double[ExperienceData.getInstance().getMaxLevel()]; _baseSlotDef = new HashMap<>(12); _baseSlotDef.put(Inventory.PAPERDOLL_CHEST, set.getInt("basePDefchest", 0)); diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/transform/Transform.java b/trunk/java/com/l2jserver/gameserver/model/actor/transform/Transform.java index d5083de3be..eddad859a1 100644 --- a/trunk/java/com/l2jserver/gameserver/model/actor/transform/Transform.java +++ b/trunk/java/com/l2jserver/gameserver/model/actor/transform/Transform.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.model.actor.transform; import java.util.ArrayList; import java.util.List; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/model/base/PlayerClass.java b/trunk/java/com/l2jserver/gameserver/model/base/PlayerClass.java index 6bdcd36c0c..632f603dbb 100644 --- a/trunk/java/com/l2jserver/gameserver/model/base/PlayerClass.java +++ b/trunk/java/com/l2jserver/gameserver/model/base/PlayerClass.java @@ -26,12 +26,9 @@ import static com.l2jserver.gameserver.model.base.ClassType.Fighter; import static com.l2jserver.gameserver.model.base.ClassType.Mystic; import static com.l2jserver.gameserver.model.base.ClassType.Priest; -import java.util.EnumMap; import java.util.EnumSet; -import java.util.Set; import com.l2jserver.gameserver.enums.Race; -import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; /** * @author luisantonioa @@ -208,20 +205,20 @@ public enum PlayerClass sigelHellKnight(Race.HUMAN, Fighter, ClassLevel.AWAKEN), sigelEvasTemplar(Race.ELF, Fighter, ClassLevel.AWAKEN), sigelShilenTemplar(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN), - tyrDuelist(Race.HUMAN, Fighter, ClassLevel.AWAKEN), - tyrDreadnought(Race.HUMAN, Fighter, ClassLevel.AWAKEN), - tyrTitan(Race.ORC, Fighter, ClassLevel.AWAKEN), - tyrGrandKhavatari(Race.ORC, Fighter, ClassLevel.AWAKEN), - tyrMaestro(Race.DWARF, Fighter, ClassLevel.AWAKEN), - tyrDoombringer(Race.KAMAEL, Fighter, ClassLevel.AWAKEN), + tyrrDuelist(Race.HUMAN, Fighter, ClassLevel.AWAKEN), + tyrrDreadnought(Race.HUMAN, Fighter, ClassLevel.AWAKEN), + tyrrTitan(Race.ORC, Fighter, ClassLevel.AWAKEN), + tyrrGrandKhavatari(Race.ORC, Fighter, ClassLevel.AWAKEN), + tyrrMaestro(Race.DWARF, Fighter, ClassLevel.AWAKEN), + tyrrDoombringer(Race.KAMAEL, Fighter, ClassLevel.AWAKEN), othellAdventurer(Race.HUMAN, Fighter, ClassLevel.AWAKEN), othellWindRider(Race.ELF, Fighter, ClassLevel.AWAKEN), othellGhostHunter(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN), othellFortuneSeeker(Race.DWARF, Fighter, ClassLevel.AWAKEN), - yrSagittarius(Race.HUMAN, Fighter, ClassLevel.AWAKEN), - yrMoonlightSentinel(Race.ELF, Fighter, ClassLevel.AWAKEN), - yrGhostSentinel(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN), - yrTrickster(Race.KAMAEL, Fighter, ClassLevel.AWAKEN), + yulSagittarius(Race.HUMAN, Fighter, ClassLevel.AWAKEN), + yulMoonlightSentinel(Race.ELF, Fighter, ClassLevel.AWAKEN), + yulGhostSentinel(Race.DARK_ELF, Fighter, ClassLevel.AWAKEN), + yulTrickster(Race.KAMAEL, Fighter, ClassLevel.AWAKEN), feohArchmage(Race.HUMAN, Mystic, ClassLevel.AWAKEN), feohSoultaker(Race.HUMAN, Mystic, ClassLevel.AWAKEN), feohMysticMuse(Race.ELF, Mystic, ClassLevel.AWAKEN), @@ -235,9 +232,9 @@ public enum PlayerClass wynnArcanaLord(Race.HUMAN, Mystic, ClassLevel.AWAKEN), wynnElementalMaster(Race.ELF, Mystic, ClassLevel.AWAKEN), wynnSpectralMaster(Race.DARK_ELF, Mystic, ClassLevel.AWAKEN), - eolhCardinal(Race.HUMAN, Priest, ClassLevel.AWAKEN), - eolhEvaSaint(Race.ELF, Priest, ClassLevel.AWAKEN), - eolhShillienSaint(Race.DARK_ELF, Priest, ClassLevel.AWAKEN), + aeoreCardinal(Race.HUMAN, Priest, ClassLevel.AWAKEN), + aeoreEvaSaint(Race.ELF, Priest, ClassLevel.AWAKEN), + aeoreShillienSaint(Race.DARK_ELF, Priest, ClassLevel.AWAKEN), ertheiaFighter(Race.ERTHEIA, Fighter, ClassLevel.FIRST), ertheiaWizzard(Race.ERTHEIA, Mystic, ClassLevel.FIRST), @@ -255,46 +252,6 @@ public enum PlayerClass private ClassLevel _level; private ClassType _type; - private static final Set mainSubclassSet; - private static final Set neverSubclassed = EnumSet.of(Overlord, Warsmith); - - private static final Set subclasseSet1 = EnumSet.of(DarkAvenger, Paladin, TempleKnight, ShillienKnight); - private static final Set subclasseSet2 = EnumSet.of(TreasureHunter, AbyssWalker, Plainswalker); - private static final Set subclasseSet3 = EnumSet.of(Hawkeye, SilverRanger, PhantomRanger); - private static final Set subclasseSet4 = EnumSet.of(Warlock, ElementalSummoner, PhantomSummoner); - private static final Set subclasseSet5 = EnumSet.of(Sorceror, Spellsinger, Spellhowler); - - private static final EnumMap> subclassSetMap = new EnumMap<>(PlayerClass.class); - - static - { - Set subclasses = getSet(null, THIRD); - subclasses.removeAll(neverSubclassed); - - mainSubclassSet = subclasses; - - subclassSetMap.put(DarkAvenger, subclasseSet1); - subclassSetMap.put(Paladin, subclasseSet1); - subclassSetMap.put(TempleKnight, subclasseSet1); - subclassSetMap.put(ShillienKnight, subclasseSet1); - - subclassSetMap.put(TreasureHunter, subclasseSet2); - subclassSetMap.put(AbyssWalker, subclasseSet2); - subclassSetMap.put(Plainswalker, subclasseSet2); - - subclassSetMap.put(Hawkeye, subclasseSet3); - subclassSetMap.put(SilverRanger, subclasseSet3); - subclassSetMap.put(PhantomRanger, subclasseSet3); - - subclassSetMap.put(Warlock, subclasseSet4); - subclassSetMap.put(ElementalSummoner, subclasseSet4); - subclassSetMap.put(PhantomSummoner, subclasseSet4); - - subclassSetMap.put(Sorceror, subclasseSet5); - subclassSetMap.put(Spellsinger, subclasseSet5); - subclassSetMap.put(Spellhowler, subclasseSet5); - } - private PlayerClass(Race race, ClassType pType, ClassLevel pLevel) { _race = race; @@ -302,50 +259,6 @@ public enum PlayerClass _type = pType; } - public final Set getAvailableSubclasses(L2PcInstance player) - { - Set subclasses = null; - - if (_level == THIRD) - { - subclasses = EnumSet.copyOf(mainSubclassSet); - - subclasses.remove(this); - - subclasses.removeAll(getSet(Race.ERTHEIA, THIRD)); - - if (player.getRace() == Race.KAMAEL) - { - if (player.getAppearance().getSex()) - { - subclasses.remove(femaleSoulbreaker); - } - else - { - subclasses.remove(maleSoulbreaker); - } - - if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75)) - { - subclasses.remove(inspector); - } - } - else - { - // Only Kamael can take Kamael classes as subclasses. - subclasses.removeAll(getSet(Race.KAMAEL, THIRD)); - } - - Set unavailableClasses = subclassSetMap.get(this); - - if (unavailableClasses != null) - { - subclasses.removeAll(unavailableClasses); - } - } - return subclasses; - } - public static final EnumSet getSet(Race race, ClassLevel level) { EnumSet allOf = EnumSet.noneOf(PlayerClass.class); diff --git a/trunk/java/com/l2jserver/gameserver/model/base/SubClass.java b/trunk/java/com/l2jserver/gameserver/model/base/SubClass.java index c4936e1c2c..a52b84122f 100644 --- a/trunk/java/com/l2jserver/gameserver/model/base/SubClass.java +++ b/trunk/java/com/l2jserver/gameserver/model/base/SubClass.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.model.base; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ExperienceTable; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; /** * Character Sub-Class Definition
@@ -28,10 +28,10 @@ import com.l2jserver.gameserver.datatables.ExperienceTable; */ public final class SubClass { - private static final byte _maxLevel = Config.MAX_SUBCLASS_LEVEL < ExperienceTable.getInstance().getMaxLevel() ? Config.MAX_SUBCLASS_LEVEL : (byte) (ExperienceTable.getInstance().getMaxLevel() - 1); + private static final byte _maxLevel = Config.MAX_SUBCLASS_LEVEL < ExperienceData.getInstance().getMaxLevel() ? Config.MAX_SUBCLASS_LEVEL : (byte) (ExperienceData.getInstance().getMaxLevel() - 1); private PlayerClass _class; - private long _exp = ExperienceTable.getInstance().getExpForLevel(Config.BASE_SUBCLASS_LEVEL); + private long _exp = ExperienceData.getInstance().getExpForLevel(Config.BASE_SUBCLASS_LEVEL); private long _sp = 0; private byte _level = Config.BASE_SUBCLASS_LEVEL; private int _classIndex = 1; @@ -84,9 +84,9 @@ public final class SubClass public void setExp(long expValue) { - if (expValue > (ExperienceTable.getInstance().getExpForLevel(_maxLevel + 1) - 1)) + if (!_dualClass && (expValue > (ExperienceData.getInstance().getExpForLevel(_maxLevel + 1) - 1))) { - expValue = ExperienceTable.getInstance().getExpForLevel(_maxLevel + 1) - 1; + expValue = ExperienceData.getInstance().getExpForLevel(_maxLevel + 1) - 1; } _exp = expValue; @@ -134,7 +134,7 @@ public final class SubClass } _level++; - setExp(ExperienceTable.getInstance().getExpForLevel(getLevel())); + setExp(ExperienceData.getInstance().getExpForLevel(getLevel())); } public void decLevel() @@ -145,6 +145,6 @@ public final class SubClass } _level--; - setExp(ExperienceTable.getInstance().getExpForLevel(getLevel())); + setExp(ExperienceData.getInstance().getExpForLevel(getLevel())); } } diff --git a/trunk/java/com/l2jserver/gameserver/model/clan/entry/PledgeRecruitInfo.java b/trunk/java/com/l2jserver/gameserver/model/clan/entry/PledgeRecruitInfo.java index 67af84f60b..df6c74cc9d 100644 --- a/trunk/java/com/l2jserver/gameserver/model/clan/entry/PledgeRecruitInfo.java +++ b/trunk/java/com/l2jserver/gameserver/model/clan/entry/PledgeRecruitInfo.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.model.clan.entry; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; /** diff --git a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSummon.java b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSummonPet.java similarity index 70% rename from trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSummon.java rename to trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSummonPet.java index 27d7468736..48ec5a2cd1 100644 --- a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSummon.java +++ b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSummonPet.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2015 L2J Server + * Copyright (C) 2004-2014 L2J Server * * This file is part of L2J Server. * @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.model.conditions; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.CharSummonTable; +import com.l2jserver.gameserver.data.sql.impl.CharSummonTable; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.L2Item; @@ -30,11 +30,11 @@ import com.l2jserver.gameserver.network.SystemMessageId; * Player Can Summon condition implementation. * @author Zoey76 */ -public class ConditionPlayerCanSummon extends Condition +public class ConditionPlayerCanSummonPet extends Condition { private final boolean _val; - public ConditionPlayerCanSummon(boolean val) + public ConditionPlayerCanSummonPet(boolean val) { _val = val; } @@ -49,25 +49,21 @@ public class ConditionPlayerCanSummon extends Condition } boolean canSummon = true; - if (Config.RESTORE_SERVITOR_ON_RECONNECT && CharSummonTable.getInstance().getServitors().containsKey(player.getObjectId())) + + if (Config.RESTORE_PET_ON_RECONNECT && CharSummonTable.getInstance().getPets().containsKey(player.getObjectId())) { player.sendPacket(SystemMessageId.YOU_MAY_NOT_SUMMON_MULTIPLE_PETS_AT_THE_SAME_TIME); canSummon = false; } - else if (Config.RESTORE_PET_ON_RECONNECT && CharSummonTable.getInstance().getPets().containsKey(player.getObjectId())) + else if (player.hasPet()) { player.sendPacket(SystemMessageId.YOU_MAY_NOT_SUMMON_MULTIPLE_PETS_AT_THE_SAME_TIME); canSummon = false; } - else if (player.hasSummon()) - { - player.sendPacket(SystemMessageId.YOU_MAY_NOT_SUMMON_MULTIPLE_PETS_AT_THE_SAME_TIME); - canSummon = false; - } - else if (player.isFlyingMounted() || player.isMounted()) + else if (player.isFlyingMounted() || player.isMounted() || player.inObserverMode() || player.isTeleporting()) { canSummon = false; } return (_val == canSummon); } -} +} diff --git a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSummonServitor.java b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSummonServitor.java new file mode 100644 index 0000000000..b8ea318f7a --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSummonServitor.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2004-2014 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jserver.gameserver.model.conditions; + +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.items.L2Item; +import com.l2jserver.gameserver.model.skills.Skill; + +/** + * Player Can Summon condition implementation. + * @author Sdw + */ +public class ConditionPlayerCanSummonServitor extends Condition +{ + private final boolean _val; + + public ConditionPlayerCanSummonServitor(boolean val) + { + _val = val; + } + + @Override + public boolean testImpl(L2Character effector, L2Character effected, Skill skill, L2Item item) + { + final L2PcInstance player = effector.getActingPlayer(); + if (player == null) + { + return false; + } + + boolean canSummon = true; + + if (player.isFlyingMounted() || player.isMounted() || player.inObserverMode() || player.isTeleporting()) + { + canSummon = false; + } + else if (player.getServitors().size() >= 4) + { + canSummon = false; + } + return canSummon == _val; + } +} \ No newline at end of file diff --git a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSweep.java b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSweep.java index d9011c7303..b0b2d2f619 100644 --- a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSweep.java +++ b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSweep.java @@ -68,7 +68,7 @@ public class ConditionPlayerCanSweep extends Condition target = (L2Attackable) objTarget; if (target.isDead()) { - if (target.isSpoil()) + if (target.isSpoiled()) { canSweep = target.checkSpoilOwner(sweeper, true); canSweep &= !target.isOldCorpse(sweeper, Config.CORPSE_CONSUME_SKILL_ALLOWED_TIME_BEFORE_DECAY, true); diff --git a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanUntransform.java b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanUntransform.java index 1d284d0e86..13502c78cc 100644 --- a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanUntransform.java +++ b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanUntransform.java @@ -51,7 +51,7 @@ public class ConditionPlayerCanUntransform extends Condition { canUntransform = false; } - else if ((player.isTransformed() || player.isInStance()) && player.isFlyingMounted() && player.isInsideZone(ZoneId.LANDING)) + else if ((player.isTransformed() || player.isInStance()) && player.isFlyingMounted() && !player.isInsideZone(ZoneId.LANDING)) { player.sendPacket(SystemMessageId.YOU_ARE_TOO_HIGH_TO_PERFORM_THIS_ACTION_PLEASE_LOWER_YOUR_ALTITUDE_AND_TRY_AGAIN); // TODO: check if message is retail like. canUntransform = false; diff --git a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerHasFreeSummonPoints.java b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerHasFreeSummonPoints.java new file mode 100644 index 0000000000..a4540bdd8f --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerHasFreeSummonPoints.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2004-2015 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jserver.gameserver.model.conditions; + +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.items.L2Item; +import com.l2jserver.gameserver.model.skills.Skill; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; + +/** + * @author Sdw + */ +public class ConditionPlayerHasFreeSummonPoints extends Condition +{ + private final int _summonPoints; + + public ConditionPlayerHasFreeSummonPoints(int summonPoints) + { + _summonPoints = summonPoints; + } + + @Override + public boolean testImpl(L2Character effector, L2Character effected, Skill skill, L2Item item) + { + final L2PcInstance player = effector.getActingPlayer(); + if (player == null) + { + return false; + } + + boolean canSummon = true; + + if ((_summonPoints == 0) && player.hasServitors()) + { + player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THE_S1_SKILL_DUE_TO_INSUFFICIENT_SUMMON_POINTS); + canSummon = false; + } + else if ((player.getSummonPoints() + _summonPoints) > player.getMaxSummonPoints()) + { + final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_CANNOT_USE_THE_S1_SKILL_DUE_TO_INSUFFICIENT_SUMMON_POINTS); + sm.addSkillName(skill); + player.sendPacket(sm); + canSummon = false; + } + + return canSummon; + } +} diff --git a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerHasPet.java b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerHasPet.java index 88bc2f44b1..016cfcf6c2 100644 --- a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerHasPet.java +++ b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerHasPet.java @@ -21,6 +21,7 @@ package com.l2jserver.gameserver.model.conditions; import java.util.ArrayList; import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PetInstance; import com.l2jserver.gameserver.model.items.L2Item; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; @@ -52,7 +53,8 @@ public class ConditionPlayerHasPet extends Condition @Override public boolean testImpl(L2Character effector, L2Character effected, Skill skill, L2Item item) { - if ((effector.getActingPlayer() == null) || (!(effector.getActingPlayer().getSummon() instanceof L2PetInstance))) + final L2Summon pet = effector.getActingPlayer().getPet(); + if ((effector.getActingPlayer() == null) || (pet == null)) { return false; } @@ -62,7 +64,7 @@ public class ConditionPlayerHasPet extends Condition return true; } - final L2ItemInstance controlItem = ((L2PetInstance) effector.getActingPlayer().getSummon()).getControlItem(); + final L2ItemInstance controlItem = ((L2PetInstance) pet).getControlItem(); return (controlItem != null) && _controlItemIds.contains(controlItem.getId()); } } diff --git a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerServitorNpcId.java b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerServitorNpcId.java index 869cad8201..e56e29f484 100644 --- a/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerServitorNpcId.java +++ b/trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerServitorNpcId.java @@ -21,6 +21,7 @@ package com.l2jserver.gameserver.model.conditions; import java.util.List; import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.items.L2Item; import com.l2jserver.gameserver.model.skills.Skill; @@ -54,6 +55,17 @@ public class ConditionPlayerServitorNpcId extends Condition { return false; } - return (_npcIds == null) || _npcIds.contains(effector.getActingPlayer().getSummon().getId()); + if (_npcIds == null) + { + return true; + } + for (L2Summon summon : effector.getServitors().values()) + { + if (_npcIds.contains(summon.getId())) + { + return true; + } + } + return false; } } diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/AbstractResidence.java b/trunk/java/com/l2jserver/gameserver/model/entity/AbstractResidence.java index 8d2e423d77..9934b8cf48 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/AbstractResidence.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/AbstractResidence.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.model.entity; import java.util.ArrayList; import java.util.List; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.events.ListenersContainer; diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/Auction.java b/trunk/java/com/l2jserver/gameserver/model/entity/Auction.java index d6900b7d1d..1394288bfb 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/Auction.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/Auction.java @@ -33,7 +33,7 @@ import javolution.util.FastMap; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.enums.AuctionItemType; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.instancemanager.AuctionManager; diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/BlockCheckerEngine.java b/trunk/java/com/l2jserver/gameserver/model/entity/BlockCheckerEngine.java index 084c92be71..90118fef25 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/BlockCheckerEngine.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/BlockCheckerEngine.java @@ -28,7 +28,7 @@ import javolution.util.FastMap; import com.l2jserver.Config; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.datatables.SpawnTable; import com.l2jserver.gameserver.enums.Team; @@ -36,6 +36,7 @@ import com.l2jserver.gameserver.instancemanager.HandysBlockCheckerManager; import com.l2jserver.gameserver.model.ArenaParticipantsHolder; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.L2World; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2BlockInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; @@ -388,11 +389,12 @@ public final class BlockCheckerEngine player.setTeam(Team.BLUE); } player.stopAllEffects(); - - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - player.getSummon().unSummon(player); + pet.unSummon(player); } + player.getServitors().values().forEach(s -> s.unSummon(player)); // Give the player start up effects // Freeze diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/Castle.java b/trunk/java/com/l2jserver/gameserver/model/entity/Castle.java index d40b242c5c..964b49e002 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/Castle.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/Castle.java @@ -34,10 +34,10 @@ import javolution.util.FastMap; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.CastleData; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.DoorTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.CastleData; +import com.l2jserver.gameserver.data.xml.impl.DoorData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.enums.CastleSide; import com.l2jserver.gameserver.enums.MountType; import com.l2jserver.gameserver.instancemanager.CastleManager; @@ -764,7 +764,7 @@ public final class Castle extends AbstractResidence // This method loads castle door data from database private void loadDoor() { - for (L2DoorInstance door : DoorTable.getInstance().getDoors()) + for (L2DoorInstance door : DoorData.getInstance().getDoors()) { if ((door.getCastle() != null) && (door.getCastle().getResidenceId() == getResidenceId())) { @@ -816,7 +816,7 @@ public final class Castle extends AbstractResidence public void setDoorUpgrade(int doorId, int ratio, boolean save) { - final L2DoorInstance door = (getDoors().isEmpty()) ? DoorTable.getInstance().getDoor(doorId) : getDoor(doorId); + final L2DoorInstance door = (getDoors().isEmpty()) ? DoorData.getInstance().getDoor(doorId) : getDoor(doorId); if (door == null) { return; diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/ClanHall.java b/trunk/java/com/l2jserver/gameserver/model/entity/ClanHall.java index 33e261515b..fc82bffddb 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/ClanHall.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/ClanHall.java @@ -30,7 +30,7 @@ import javolution.util.FastMap; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance; diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/Fort.java b/trunk/java/com/l2jserver/gameserver/model/entity/Fort.java index 8d5bfc0113..3271c99bd5 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/Fort.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/Fort.java @@ -41,11 +41,11 @@ import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.FortUpdater; import com.l2jserver.gameserver.FortUpdater.UpdaterType; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.DoorTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; +import com.l2jserver.gameserver.data.xml.impl.StaticObjectData; import com.l2jserver.gameserver.datatables.SpawnTable; -import com.l2jserver.gameserver.datatables.StaticObjects; import com.l2jserver.gameserver.enums.MountType; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.instancemanager.FortManager; @@ -729,7 +729,7 @@ public final class Fort extends AbstractResidence // This method loads fort door data from database private void loadDoor() { - for (L2DoorInstance door : DoorTable.getInstance().getDoors()) + for (L2DoorInstance door : DoorData.getInstance().getDoors()) { if ((door.getFort() != null) && (door.getFort().getResidenceId() == getResidenceId())) { @@ -740,7 +740,7 @@ public final class Fort extends AbstractResidence private void loadFlagPoles() { - for (L2StaticObjectInstance obj : StaticObjects.getInstance().getStaticObjects()) + for (L2StaticObjectInstance obj : StaticObjectData.getInstance().getStaticObjects()) { if ((obj.getType() == 3) && obj.getName().startsWith(getName())) { diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/FortSiege.java b/trunk/java/com/l2jserver/gameserver/model/entity/FortSiege.java index 8be250360d..f2592ee5da 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/FortSiege.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/FortSiege.java @@ -32,8 +32,8 @@ import javolution.util.FastList; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.enums.FortTeleportWhoType; import com.l2jserver.gameserver.enums.SiegeClanType; import com.l2jserver.gameserver.instancemanager.FortManager; diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/Hero.java b/trunk/java/com/l2jserver/gameserver/model/entity/Hero.java index 38c106abef..87cf58c29b 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/Hero.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/Hero.java @@ -39,10 +39,10 @@ import javolution.util.FastMap; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.CharNameTable; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.ClassListData; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.ClassListData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2World; diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/Instance.java b/trunk/java/com/l2jserver/gameserver/model/entity/Instance.java index 5dab75d3d2..1dcc98e4fb 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/Instance.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/Instance.java @@ -41,8 +41,8 @@ import org.w3c.dom.Node; import com.l2jserver.Config; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.DoorTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.DoorData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.instancemanager.InstanceManager; import com.l2jserver.gameserver.model.L2Spawn; @@ -538,7 +538,7 @@ public final class Instance { doorId = Integer.parseInt(d.getAttributes().getNamedItem("doorId").getNodeValue()); StatsSet set = new StatsSet(); - set.add(DoorTable.getInstance().getDoorTemplate(doorId)); + set.add(DoorData.getInstance().getDoorTemplate(doorId)); for (Node bean = d.getFirstChild(); bean != null; bean = bean.getNextSibling()) { if ("set".equalsIgnoreCase(bean.getNodeName())) diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/L2Event.java b/trunk/java/com/l2jserver/gameserver/model/entity/L2Event.java index e052933269..e1af46cde1 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/L2Event.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/L2Event.java @@ -36,7 +36,7 @@ import javolution.util.FastMap; import com.l2jserver.Config; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.SpawnTable; import com.l2jserver.gameserver.instancemanager.AntiFeedManager; import com.l2jserver.gameserver.model.L2Spawn; diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/Message.java b/trunk/java/com/l2jserver/gameserver/model/entity/Message.java index be0bf33158..5c24153a83 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/Message.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/Message.java @@ -25,7 +25,7 @@ import java.sql.SQLException; import java.util.concurrent.ScheduledFuture; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.enums.MailType; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.instancemanager.MailManager; diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/Siege.java b/trunk/java/com/l2jserver/gameserver/model/entity/Siege.java index 5e1c949ba4..cabf15c62b 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/Siege.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/Siege.java @@ -23,6 +23,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -35,9 +36,9 @@ import javolution.util.FastList; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.NpcData; -import com.l2jserver.gameserver.datatables.SiegeScheduleData; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.NpcData; +import com.l2jserver.gameserver.data.xml.impl.SiegeScheduleData; import com.l2jserver.gameserver.enums.SiegeClanType; import com.l2jserver.gameserver.enums.SiegeTeleportWhoType; import com.l2jserver.gameserver.instancemanager.CastleManager; @@ -54,6 +55,7 @@ import com.l2jserver.gameserver.model.SiegeScheduleDate; import com.l2jserver.gameserver.model.TeleportWhereType; import com.l2jserver.gameserver.model.TowerSpawn; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2ControlTowerInstance; import com.l2jserver.gameserver.model.actor.instance.L2FlameTowerInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -610,17 +612,35 @@ public class Siege implements Siegable } } member.sendPacket(new UserInfo(member)); - for (L2PcInstance player : member.getKnownList().getKnownPlayers().values()) + final Collection plrs = member.getKnownList().getKnownPlayers().values(); + + for (L2PcInstance player : plrs) { - if (player == null) + if ((player == null) || !member.isVisibleFor(player)) { continue; } - player.sendPacket(new RelationChanged(member, member.getRelation(player), member.isAutoAttackable(player))); - if (member.hasSummon()) + final int relation = member.getRelation(player); + Integer oldrelation = member.getKnownList().getKnownRelations().get(player.getObjectId()); + if ((oldrelation == null) || (oldrelation != relation)) { - player.sendPacket(new RelationChanged(member.getSummon(), member.getRelation(player), member.isAutoAttackable(player))); + final RelationChanged rc = new RelationChanged(); + rc.addRelation(member, relation, member.isAutoAttackable(player)); + if (member.hasSummon()) + { + final L2Summon pet = member.getPet(); + if (pet != null) + { + rc.addRelation(pet, relation, member.isAutoAttackable(player)); + } + if (member.hasServitors()) + { + member.getServitors().values().forEach(s -> rc.addRelation(s, relation, member.isAutoAttackable(player))); + } + } + player.sendPacket(rc); + member.getKnownList().getKnownRelations().put(player.getObjectId(), relation); } } } @@ -659,16 +679,35 @@ public class Siege implements Siegable } member.sendPacket(new UserInfo(member)); - for (L2PcInstance player : member.getKnownList().getKnownPlayers().values()) + final Collection plrs = member.getKnownList().getKnownPlayers().values(); + + for (L2PcInstance player : plrs) { - if (player == null) + if ((player == null) || !member.isVisibleFor(player)) { continue; } - player.sendPacket(new RelationChanged(member, member.getRelation(player), member.isAutoAttackable(player))); - if (member.hasSummon()) + + final int relation = member.getRelation(player); + Integer oldrelation = member.getKnownList().getKnownRelations().get(player.getObjectId()); + if ((oldrelation == null) || (oldrelation != relation)) { - player.sendPacket(new RelationChanged(member.getSummon(), member.getRelation(player), member.isAutoAttackable(player))); + final RelationChanged rc = new RelationChanged(); + rc.addRelation(member, relation, member.isAutoAttackable(player)); + if (member.hasSummon()) + { + final L2Summon pet = member.getPet(); + if (pet != null) + { + rc.addRelation(pet, relation, member.isAutoAttackable(player)); + } + if (member.hasServitors()) + { + member.getServitors().values().forEach(s -> rc.addRelation(s, relation, member.isAutoAttackable(player))); + } + } + player.sendPacket(rc); + member.getKnownList().getKnownRelations().put(player.getObjectId(), relation); } } } diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/TvTEvent.java b/trunk/java/com/l2jserver/gameserver/model/entity/TvTEvent.java index cac374e8ee..9e9f76b0bf 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/TvTEvent.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/TvTEvent.java @@ -29,9 +29,9 @@ import javolution.util.FastMap; import com.l2jserver.Config; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.NpcData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.datatables.SpawnTable; import com.l2jserver.gameserver.instancemanager.AntiFeedManager; @@ -386,7 +386,7 @@ public class TvTEvent PcInventory inv = playerInstance.getInventory(); // Check for stackable item, non stackabe items need to be added one by one - if (ItemTable.getInstance().createDummyItem(reward[0]).isStackable()) + if (ItemTable.getInstance().getTemplate(reward[0]).isStackable()) { inv.addItem("TvT Event", reward[0], reward[1], playerInstance, playerInstance); @@ -587,7 +587,7 @@ public class TvTEvent L2DoorInstance door = null; if (_TvTEventInstance <= 0) { - door = DoorTable.getInstance().getDoor(doorId); + door = DoorData.getInstance().getDoor(doorId); } else { diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/TvTEventTeleporter.java b/trunk/java/com/l2jserver/gameserver/model/entity/TvTEventTeleporter.java index d65fd06136..cec75fb21d 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/TvTEventTeleporter.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/TvTEventTeleporter.java @@ -68,13 +68,15 @@ public class TvTEventTeleporter implements Runnable return; } - L2Summon summon = _playerInstance.getSummon(); + L2Summon summon = _playerInstance.getPet(); if (summon != null) { summon.unSummon(_playerInstance); } + _playerInstance.getServitors().values().forEach(s -> s.unSummon(_playerInstance)); + if ((Config.TVT_EVENT_EFFECTS_REMOVAL == 0) || ((Config.TVT_EVENT_EFFECTS_REMOVAL == 1) && ((_playerInstance.getTeam() == Team.NONE) || (_playerInstance.isInDuel() && (_playerInstance.getDuelState() != Duel.DUELSTATE_INTERRUPTED))))) { _playerInstance.stopAllEffectsExceptThoseThatLastThroughDeath(); diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/clanhall/AuctionableHall.java b/trunk/java/com/l2jserver/gameserver/model/entity/clanhall/AuctionableHall.java index 709b9eddf9..042636a310 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/clanhall/AuctionableHall.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/clanhall/AuctionableHall.java @@ -25,7 +25,7 @@ import java.util.logging.Logger; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.instancemanager.AuctionManager; import com.l2jserver.gameserver.instancemanager.ClanHallManager; import com.l2jserver.gameserver.model.L2Clan; diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/clanhall/ClanHallSiegeEngine.java b/trunk/java/com/l2jserver/gameserver/model/entity/clanhall/ClanHallSiegeEngine.java index 8899ff88fc..de0708c9eb 100644 --- a/trunk/java/com/l2jserver/gameserver/model/entity/clanhall/ClanHallSiegeEngine.java +++ b/trunk/java/com/l2jserver/gameserver/model/entity/clanhall/ClanHallSiegeEngine.java @@ -33,8 +33,8 @@ import javolution.util.FastMap; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.enums.SiegeClanType; import com.l2jserver.gameserver.instancemanager.CHSiegeManager; import com.l2jserver.gameserver.instancemanager.MapRegionManager; diff --git a/trunk/java/com/l2jserver/gameserver/model/event/LongTimeEvent.java b/trunk/java/com/l2jserver/gameserver/model/event/LongTimeEvent.java index 45138d2f4d..42f7ed2c9a 100644 --- a/trunk/java/com/l2jserver/gameserver/model/event/LongTimeEvent.java +++ b/trunk/java/com/l2jserver/gameserver/model/event/LongTimeEvent.java @@ -33,10 +33,10 @@ import org.w3c.dom.Document; import org.w3c.dom.Node; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.AnnouncementsTable; +import com.l2jserver.gameserver.data.sql.impl.AnnouncementsTable; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.EventDroplist; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.NpcData; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.announce.EventAnnouncement; import com.l2jserver.gameserver.model.drops.GeneralDropItem; diff --git a/trunk/java/com/l2jserver/gameserver/model/events/AbstractScript.java b/trunk/java/com/l2jserver/gameserver/model/events/AbstractScript.java index c0ab2fc33d..3f2692cb14 100644 --- a/trunk/java/com/l2jserver/gameserver/model/events/AbstractScript.java +++ b/trunk/java/com/l2jserver/gameserver/model/events/AbstractScript.java @@ -39,9 +39,9 @@ import javolution.util.FastSet; import com.l2jserver.Config; import com.l2jserver.gameserver.GameTimeController; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.NpcData; import com.l2jserver.gameserver.enums.QuestSound; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.instancemanager.CastleManager; @@ -117,6 +117,7 @@ import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.interfaces.IPositionable; import com.l2jserver.gameserver.model.itemcontainer.Inventory; import com.l2jserver.gameserver.model.itemcontainer.PcInventory; +import com.l2jserver.gameserver.model.items.L2EtcItem; import com.l2jserver.gameserver.model.items.L2Item; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.model.olympiad.Olympiad; @@ -2016,8 +2017,8 @@ public abstract class AbstractScript extends ManagedScript return; } - final L2ItemInstance _tmpItem = ItemTable.getInstance().createDummyItem(itemId); - if (_tmpItem == null) + final L2Item item = ItemTable.getInstance().getTemplate(itemId); + if (item == null) { return; } @@ -2030,9 +2031,9 @@ public abstract class AbstractScript extends ManagedScript } else if (Config.RATE_QUEST_REWARD_USE_MULTIPLIERS) { - if (_tmpItem.isEtcItem()) + if (item instanceof L2EtcItem) { - switch (_tmpItem.getEtcItem().getItemType()) + switch (((L2EtcItem) item).getItemType()) { case POTION: count *= Config.RATE_QUEST_REWARD_POTION; @@ -2064,13 +2065,13 @@ public abstract class AbstractScript extends ManagedScript } // Add items to player's inventory - L2ItemInstance item = player.getInventory().addItem("Quest", itemId, count, player, player.getTarget()); - if (item == null) + final L2ItemInstance itemInstance = player.getInventory().addItem("Quest", itemId, count, player, player.getTarget()); + if (itemInstance == null) { return; } - sendItemGetMessage(player, item, count); + sendItemGetMessage(player, itemInstance, count); } /** @@ -2586,7 +2587,7 @@ public abstract class AbstractScript extends ManagedScript L2DoorInstance door = null; if (instanceId <= 0) { - door = DoorTable.getInstance().getDoor(doorId); + door = DoorData.getInstance().getDoor(doorId); } else { @@ -2649,6 +2650,17 @@ public abstract class AbstractScript extends ManagedScript npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); } + /** + * Adds desire to move to the given NPC. + * @param npc the NPC + * @param loc the location + * @param desire the desire + */ + protected void addMoveToDesire(L2Npc npc, Location loc, int desire) + { + npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, loc); + } + /** * Instantly cast a skill upon the given target. * @param npc the caster NPC diff --git a/trunk/java/com/l2jserver/gameserver/model/events/EventType.java b/trunk/java/com/l2jserver/gameserver/model/events/EventType.java index 3b915533e3..5ed39793d4 100644 --- a/trunk/java/com/l2jserver/gameserver/model/events/EventType.java +++ b/trunk/java/com/l2jserver/gameserver/model/events/EventType.java @@ -34,6 +34,7 @@ import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcCreatureSee import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcEventReceived; import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcFirstTalk; import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcManorBypass; +import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcMenuSelect; import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcMoveFinished; import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcMoveNodeArrived; import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcMoveRouteFinished; @@ -168,6 +169,7 @@ public enum EventType ON_NPC_TALK(null, void.class), ON_NPC_TELEPORT(OnNpcTeleport.class, void.class), ON_NPC_MANOR_BYPASS(OnNpcManorBypass.class, void.class), + ON_NPC_MENU_SELECT(OnNpcMenuSelect.class, void.class), // Olympiad events ON_OLYMPIAD_MATCH_RESULT(OnOlympiadMatchResult.class, void.class), diff --git a/trunk/java/com/l2jserver/gameserver/model/events/impl/character/npc/OnNpcMenuSelect.java b/trunk/java/com/l2jserver/gameserver/model/events/impl/character/npc/OnNpcMenuSelect.java new file mode 100644 index 0000000000..b3045870f5 --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/model/events/impl/character/npc/OnNpcMenuSelect.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2004-2015 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jserver.gameserver.model.events.impl.character.npc; + +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.events.EventType; +import com.l2jserver.gameserver.model.events.impl.IBaseEvent; + +/** + * @author St3eT + */ +public class OnNpcMenuSelect implements IBaseEvent +{ + private final L2PcInstance _activeChar; + private final L2Npc _npc; + private final int _ask; + private final int _reply; + + /** + * @param activeChar + * @param npc + * @param ask + * @param reply + */ + public OnNpcMenuSelect(L2PcInstance activeChar, L2Npc npc, int ask, int reply) + { + _activeChar = activeChar; + _npc = npc; + _ask = ask; + _reply = reply; + } + + public L2PcInstance getTalker() + { + return _activeChar; + } + + public L2Npc getNpc() + { + return _npc; + } + + public int getAsk() + { + return _ask; + } + + public int getReply() + { + return _reply; + } + + @Override + public EventType getType() + { + return EventType.ON_NPC_MENU_SELECT; + } +} diff --git a/trunk/java/com/l2jserver/gameserver/model/fishing/L2Fishing.java b/trunk/java/com/l2jserver/gameserver/model/fishing/L2Fishing.java index 8ecce79755..d0fe990579 100644 --- a/trunk/java/com/l2jserver/gameserver/model/fishing/L2Fishing.java +++ b/trunk/java/com/l2jserver/gameserver/model/fishing/L2Fishing.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.model.fishing; import java.util.concurrent.Future; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.FishingMonstersData; +import com.l2jserver.gameserver.data.xml.impl.FishingMonstersData; import com.l2jserver.gameserver.instancemanager.FishingChampionshipManager; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/model/holders/PlayerEventHolder.java b/trunk/java/com/l2jserver/gameserver/model/holders/PlayerEventHolder.java index 07e69c6e11..2659cba07f 100644 --- a/trunk/java/com/l2jserver/gameserver/model/holders/PlayerEventHolder.java +++ b/trunk/java/com/l2jserver/gameserver/model/holders/PlayerEventHolder.java @@ -22,7 +22,7 @@ import java.util.List; import javolution.util.FastList; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/model/holders/PlayerSkillHolder.java b/trunk/java/com/l2jserver/gameserver/model/holders/PlayerSkillHolder.java index 102b87545f..6bde1fe746 100644 --- a/trunk/java/com/l2jserver/gameserver/model/holders/PlayerSkillHolder.java +++ b/trunk/java/com/l2jserver/gameserver/model/holders/PlayerSkillHolder.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.model.holders; import java.util.HashMap; import java.util.Map; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.interfaces.ISkillsHolder; import com.l2jserver.gameserver.model.skills.Skill; diff --git a/trunk/java/com/l2jserver/gameserver/model/itemauction/ItemAuctionInstance.java b/trunk/java/com/l2jserver/gameserver/model/itemauction/ItemAuctionInstance.java index 2b83c1f2fd..a754b0ecb9 100644 --- a/trunk/java/com/l2jserver/gameserver/model/itemauction/ItemAuctionInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/itemauction/ItemAuctionInstance.java @@ -42,7 +42,7 @@ import org.w3c.dom.Node; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.enums.ItemLocation; import com.l2jserver.gameserver.instancemanager.ItemAuctionManager; import com.l2jserver.gameserver.model.L2World; diff --git a/trunk/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java b/trunk/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java index 986d7fefd6..8836b0bc0d 100644 --- a/trunk/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java +++ b/trunk/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java @@ -30,7 +30,7 @@ import javolution.util.FastList; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.ArmorSetsData; +import com.l2jserver.gameserver.data.xml.impl.ArmorSetsData; import com.l2jserver.gameserver.datatables.ItemTable; import com.l2jserver.gameserver.enums.ItemLocation; import com.l2jserver.gameserver.enums.PrivateStoreType; diff --git a/trunk/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java b/trunk/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java index 0f768a0612..f3ed4a8733 100644 --- a/trunk/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java +++ b/trunk/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java @@ -42,6 +42,7 @@ import com.l2jserver.gameserver.model.events.impl.character.player.inventory.OnP import com.l2jserver.gameserver.model.items.L2Item; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.ExAdenaInvenCount; import com.l2jserver.gameserver.network.serverpackets.ExUserInfoInvenWeight; import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate; import com.l2jserver.gameserver.network.serverpackets.ItemList; @@ -584,6 +585,7 @@ public class PcInventory extends Inventory // Update current load as well actor.sendPacket(new ExUserInfoInvenWeight(actor)); + actor.sendPacket(new ExAdenaInvenCount(actor)); // Notify to scripts EventDispatcher.getInstance().notifyEventAsync(new OnPlayerItemAdd(actor, item), item.getItem()); @@ -638,6 +640,7 @@ public class PcInventory extends Inventory // Update current load as well actor.sendPacket(new ExUserInfoInvenWeight(actor)); + actor.sendPacket(new ExAdenaInvenCount(actor)); // Notify to scripts EventDispatcher.getInstance().notifyEventAsync(new OnPlayerItemAdd(actor, item), item.getItem()); diff --git a/trunk/java/com/l2jserver/gameserver/model/items/enchant/EnchantScroll.java b/trunk/java/com/l2jserver/gameserver/model/items/enchant/EnchantScroll.java index 7da01238f3..917a7529bb 100644 --- a/trunk/java/com/l2jserver/gameserver/model/items/enchant/EnchantScroll.java +++ b/trunk/java/com/l2jserver/gameserver/model/items/enchant/EnchantScroll.java @@ -22,7 +22,7 @@ import java.util.HashSet; import java.util.Set; import java.util.logging.Level; -import com.l2jserver.gameserver.datatables.EnchantItemGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemGroupsData; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; diff --git a/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java b/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java index ea04650f64..a1c18db922 100644 --- a/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java +++ b/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java @@ -37,9 +37,9 @@ import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.EnchantItemOptionsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemOptionsData; +import com.l2jserver.gameserver.data.xml.impl.OptionData; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.OptionsData; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.enums.ItemLocation; import com.l2jserver.gameserver.enums.ShotType; @@ -54,6 +54,7 @@ import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.L2WorldRegion; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.knownlist.NullKnownList; import com.l2jserver.gameserver.model.events.EventDispatcher; @@ -75,6 +76,7 @@ import com.l2jserver.gameserver.model.options.Options; import com.l2jserver.gameserver.model.stats.functions.AbstractFunction; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.DropItem; +import com.l2jserver.gameserver.network.serverpackets.ExAdenaInvenCount; import com.l2jserver.gameserver.network.serverpackets.ExUserInfoInvenWeight; import com.l2jserver.gameserver.network.serverpackets.GetItem; import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate; @@ -848,10 +850,12 @@ public final class L2ItemInstance extends L2Object */ public boolean isAvailable(L2PcInstance player, boolean allowAdena, boolean allowNonTradeable) { + final L2Summon pet = player.getPet(); + return ((!isEquipped()) // Not equipped && (getItem().getType2() != L2Item.TYPE2_QUEST) // Not Quest Item && ((getItem().getType2() != L2Item.TYPE2_MONEY) || (getItem().getType1() != L2Item.TYPE1_SHIELD_ARMOR)) // not money, not shield - && (!player.hasSummon() || (getObjectId() != player.getSummon().getControlObjectId())) // Not Control item of currently summoned pet + && ((pet == null) || (getObjectId() != pet.getControlObjectId())) // Not Control item of currently summoned pet && (player.getActiveEnchantItemId() != getObjectId()) // Not momentarily used enchant scroll && (player.getActiveEnchantSupportItemId() != getObjectId()) // Not momentarily used enchant support item && (player.getActiveEnchantAttrItemId() != getObjectId()) // Not momentarily used enchant attribute item @@ -1354,6 +1358,7 @@ public final class L2ItemInstance extends L2Object player.sendPacket(iu); player.sendPacket(new ExUserInfoInvenWeight(player)); + player.sendPacket(new ExAdenaInvenCount(player)); } else @@ -1552,7 +1557,7 @@ public final class L2ItemInstance extends L2Object { assert _itm.getWorldRegion() == null; - if ((Config.GEODATA > 0) && (_dropper != null)) + if (_dropper != null) { Location dropDest = GeoData.getInstance().moveCheck(_dropper.getX(), _dropper.getY(), _dropper.getZ(), _x, _y, _z, _dropper.getInstanceId()); _x = dropDest.getX(); @@ -1851,6 +1856,7 @@ public final class L2ItemInstance extends L2Object player.sendPacket(iu); player.sendPacket(new ExUserInfoInvenWeight(player)); + player.sendPacket(new ExAdenaInvenCount(player)); } else @@ -2190,7 +2196,7 @@ public final class L2ItemInstance extends L2Object for (int id : getEnchantOptions()) { - final Options options = OptionsData.getInstance().getOptions(id); + final Options options = OptionData.getInstance().getOptions(id); if (options != null) { options.apply(player); diff --git a/trunk/java/com/l2jserver/gameserver/model/olympiad/AbstractOlympiadGame.java b/trunk/java/com/l2jserver/gameserver/model/olympiad/AbstractOlympiadGame.java index 49a8d49021..50c6616c69 100644 --- a/trunk/java/com/l2jserver/gameserver/model/olympiad/AbstractOlympiadGame.java +++ b/trunk/java/com/l2jserver/gameserver/model/olympiad/AbstractOlympiadGame.java @@ -236,15 +236,18 @@ public abstract class AbstractOlympiadGame // Remove Summon's Buffs if (player.hasSummon()) { - final L2Summon summon = player.getSummon(); - summon.stopAllEffectsExceptThoseThatLastThroughDeath(); - summon.abortAttack(); - summon.abortCast(); - - if (summon.isPet()) + final L2Summon pet = player.getPet(); + if (pet != null) { - summon.unSummon(player); + pet.unSummon(player); } + + player.getServitors().values().forEach(s -> + { + s.stopAllEffectsExceptThoseThatLastThroughDeath(); + s.abortAttack(); + s.abortCast(); + }); } // stop any cubic that has been given by other player. @@ -319,16 +322,25 @@ public abstract class AbstractOlympiadGame { player.setAgathionId(0); } - final L2Summon summon = player.getSummon(); - if ((summon != null) && !summon.isDead()) + final L2Summon pet = player.getPet(); + if ((pet != null) && !pet.isDead()) { - summon.setTarget(null); - summon.abortAttack(); - summon.abortCast(); - summon.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); - summon.stopAllEffectsExceptThoseThatLastThroughDeath(); + pet.setTarget(null); + pet.abortAttack(); + pet.abortCast(); + pet.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + pet.stopAllEffectsExceptThoseThatLastThroughDeath(); } + player.getServitors().values().stream().filter(s -> !s.isDead()).forEach(s -> + { + s.setTarget(null); + s.abortAttack(); + s.abortCast(); + s.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + s.stopAllEffectsExceptThoseThatLastThroughDeath(); + }); + player.setCurrentCp(player.getMaxCp()); player.setCurrentHp(player.getMaxHp()); player.setCurrentMp(player.getMaxMp()); diff --git a/trunk/java/com/l2jserver/gameserver/model/quest/Quest.java b/trunk/java/com/l2jserver/gameserver/model/quest/Quest.java index 154e95d03b..716cd7b42c 100644 --- a/trunk/java/com/l2jserver/gameserver/model/quest/Quest.java +++ b/trunk/java/com/l2jserver/gameserver/model/quest/Quest.java @@ -2980,7 +2980,7 @@ public class Quest extends AbstractScript implements IIdentifiable */ public void addCondIsNotSubClassActive(String html) { - getStartConditions().put(p -> !p.isSubClassActive(), html); + getStartConditions().put(p -> !p.isSubClassActive() && !p.isDualClassActive(), html); } /** @@ -2992,4 +2992,14 @@ public class Quest extends AbstractScript implements IIdentifiable { getStartConditions().put(p -> p.isInCategory(categoryType), html); } + + /** + * Adds a clan level start condition to the quest. + * @param clanLevel the clan level + * @param html the HTML to display if the condition is not met + */ + public void addCondClanLevel(int clanLevel, String html) + { + getStartConditions().put(p -> (p.getClan() != null) && (p.getClan().getLevel() > clanLevel), html); + } } diff --git a/trunk/java/com/l2jserver/gameserver/model/shuttle/L2ShuttleEngine.java b/trunk/java/com/l2jserver/gameserver/model/shuttle/L2ShuttleEngine.java index 865b830589..2431f389d7 100644 --- a/trunk/java/com/l2jserver/gameserver/model/shuttle/L2ShuttleEngine.java +++ b/trunk/java/com/l2jserver/gameserver/model/shuttle/L2ShuttleEngine.java @@ -22,7 +22,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance; import com.l2jserver.gameserver.model.actor.instance.L2ShuttleInstance; @@ -43,8 +43,8 @@ public class L2ShuttleEngine implements Runnable public L2ShuttleEngine(L2ShuttleData data, L2ShuttleInstance shuttle) { _shuttle = shuttle; - _door1 = DoorTable.getInstance().getDoor(data.getDoors().get(0)); - _door2 = DoorTable.getInstance().getDoor(data.getDoors().get(1)); + _door1 = DoorData.getInstance().getDoor(data.getDoors().get(0)); + _door2 = DoorData.getInstance().getDoor(data.getDoors().get(1)); } // TODO: Rework me.. diff --git a/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java b/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java index 96b2960636..0223a89223 100644 --- a/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java +++ b/trunk/java/com/l2jserver/gameserver/model/skills/Skill.java @@ -31,8 +31,8 @@ import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SkillTreesData; import com.l2jserver.gameserver.enums.MountType; import com.l2jserver.gameserver.enums.ShotType; import com.l2jserver.gameserver.handler.ITargetTypeHandler; @@ -48,6 +48,7 @@ import com.l2jserver.gameserver.model.actor.L2Attackable; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.L2Playable; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2BlockInstance; import com.l2jserver.gameserver.model.actor.instance.L2CubicInstance; import com.l2jserver.gameserver.model.actor.instance.L2GuardInstance; @@ -1209,20 +1210,21 @@ public final class Skill implements IIdentifiable } } - if ((Config.GEODATA > 0) && !GeoData.getInstance().canSeeTarget(caster, target)) + if (!GeoData.getInstance().canSeeTarget(caster, target)) { return false; } return true; } - public static final boolean addSummon(L2Character caster, L2PcInstance owner, int radius, boolean isDead) + public static final boolean addPet(L2Character caster, L2PcInstance owner, int radius, boolean isDead) { - if (!owner.hasSummon()) + final L2Summon pet = owner.getPet(); + if (pet == null) { return false; } - return addCharacter(caster, owner.getSummon(), radius, isDead); + return addCharacter(caster, pet, radius, isDead); } public static final boolean addCharacter(L2Character caster, L2Character target, int radius, boolean isDead) @@ -1394,11 +1396,14 @@ public final class Skill implements IIdentifiable } // Support for buff sharing feature including healing herbs. - if (effected.isPlayer() && effected.hasServitor()) + if (effected.isPlayer() && effected.hasServitors()) { if ((addContinuousEffects && isContinuous() && !isDebuff()) || isRecoveryHerb()) { - applyEffects(effector, effected.getSummon(), isRecoveryHerb(), 0); + effected.getServitors().values().forEach(s -> + { + applyEffects(effector, s, isRecoveryHerb(), 0); + }); } } } @@ -1423,9 +1428,12 @@ public final class Skill implements IIdentifiable // Support for buff sharing feature. // Avoiding Servitor Share since it's implementation already "shares" the effect. - if (addContinuousEffects && info.getEffected().isPlayer() && info.getEffected().hasServitor() && isContinuous() && !isDebuff() && (getId() != CommonSkill.SERVITOR_SHARE.getId())) + if (addContinuousEffects && info.getEffected().isPlayer() && info.getEffected().hasServitors() && isContinuous() && !isDebuff() && (getId() != CommonSkill.SERVITOR_SHARE.getId())) { - applyEffects(effector, info.getEffected().getSummon(), false, 0); + info.getEffected().getServitors().values().forEach(s -> + { + applyEffects(effector, s, false, 0); + }); } } diff --git a/trunk/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java b/trunk/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java index fb769e683c..ae67ec0325 100644 --- a/trunk/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java +++ b/trunk/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java @@ -46,6 +46,7 @@ public enum L2TargetType HOLY, NONE, ONE, + ONE_FRIENDLY, OWNER_PET, PARTY, PARTY_CLAN, diff --git a/trunk/java/com/l2jserver/gameserver/model/stats/BaseStats.java b/trunk/java/com/l2jserver/gameserver/model/stats/BaseStats.java index 758ed99da1..81201eff1f 100644 --- a/trunk/java/com/l2jserver/gameserver/model/stats/BaseStats.java +++ b/trunk/java/com/l2jserver/gameserver/model/stats/BaseStats.java @@ -46,7 +46,7 @@ public enum BaseStats @Override public double calcBonus(L2Character actor) { - return Math.pow(1.005, actor.getDEX() - 23); + return Math.pow(1.004558949443461, actor.getDEX() - 19.27356040917275); } }, WIT // Updated and better Formula to match Ertheia @@ -54,7 +54,7 @@ public enum BaseStats @Override public double calcBonus(L2Character actor) { - return Math.pow(1.015, actor.getWIT() - 90); + return Math.pow(1.013832042738272, actor.getWIT() - 64.57078483041223); } }, CON // Updated and better Formula to match Ertheia @@ -62,7 +62,7 @@ public enum BaseStats @Override public double calcBonus(L2Character actor) { - return Math.pow(1.012, actor.getCON() - 35); // maybe - 36 + return Math.pow(1.011685289099497, actor.getCON() - 34.80273839854561); } }, MEN // Updated and better Formula to match Ertheia @@ -70,7 +70,7 @@ public enum BaseStats @Override public double calcBonus(L2Character actor) { - return Math.pow(1.004, actor.getMEN() + 30); + return Math.pow(1.003687502032154, actor.getMEN() + 30.4505503162); } }, CHA // Addition for Ertheia diff --git a/trunk/java/com/l2jserver/gameserver/model/stats/Formulas.java b/trunk/java/com/l2jserver/gameserver/model/stats/Formulas.java index 47af8022b7..7f824e6c77 100644 --- a/trunk/java/com/l2jserver/gameserver/model/stats/Formulas.java +++ b/trunk/java/com/l2jserver/gameserver/model/stats/Formulas.java @@ -22,8 +22,8 @@ import java.util.ArrayList; import java.util.List; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.HitConditionBonus; -import com.l2jserver.gameserver.datatables.KarmaData; +import com.l2jserver.gameserver.data.xml.impl.HitConditionBonusData; +import com.l2jserver.gameserver.data.xml.impl.KarmaData; import com.l2jserver.gameserver.enums.ShotType; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.instancemanager.ClanHallManager; @@ -1155,7 +1155,7 @@ public final class Formulas int chance = (80 + (2 * (attacker.getAccuracy() - target.getEvasionRate(attacker)))) * 10; // Get additional bonus from the conditions when you are attacking - chance *= HitConditionBonus.getInstance().getConditionBonus(attacker, target); + chance *= HitConditionBonusData.getInstance().getConditionBonus(attacker, target); chance = Math.max(chance, 200); chance = Math.min(chance, 980); diff --git a/trunk/java/com/l2jserver/gameserver/model/stats/Stats.java b/trunk/java/com/l2jserver/gameserver/model/stats/Stats.java index 07ccb2be5a..c6f56ec469 100644 --- a/trunk/java/com/l2jserver/gameserver/model/stats/Stats.java +++ b/trunk/java/com/l2jserver/gameserver/model/stats/Stats.java @@ -198,7 +198,10 @@ public enum Stats FISHING_EXPERTISE("fishingExpertise"), // Brooches - BROOCH_JEWELS("broochJewels"); + BROOCH_JEWELS("broochJewels"), + + // Summon Points + MAX_SUMMON_POINTS("summonPoints"); public static final int NUM_STATS = values().length; diff --git a/trunk/java/com/l2jserver/gameserver/model/stats/functions/FuncEnchantHp.java b/trunk/java/com/l2jserver/gameserver/model/stats/functions/FuncEnchantHp.java index d45db10c5a..2da335e677 100644 --- a/trunk/java/com/l2jserver/gameserver/model/stats/functions/FuncEnchantHp.java +++ b/trunk/java/com/l2jserver/gameserver/model/stats/functions/FuncEnchantHp.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.model.stats.functions; -import com.l2jserver.gameserver.datatables.EnchantItemHPBonusData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemHPBonusData; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.conditions.Condition; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; diff --git a/trunk/java/com/l2jserver/gameserver/model/stats/functions/formulas/FuncArmorSet.java b/trunk/java/com/l2jserver/gameserver/model/stats/functions/formulas/FuncArmorSet.java index 6b23ced419..cc6514f976 100644 --- a/trunk/java/com/l2jserver/gameserver/model/stats/functions/formulas/FuncArmorSet.java +++ b/trunk/java/com/l2jserver/gameserver/model/stats/functions/formulas/FuncArmorSet.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.model.stats.functions.formulas; import java.util.HashMap; import java.util.Map; -import com.l2jserver.gameserver.datatables.ArmorSetsData; +import com.l2jserver.gameserver.data.xml.impl.ArmorSetsData; import com.l2jserver.gameserver.model.L2ArmorSet; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -90,4 +90,4 @@ public class FuncArmorSet extends AbstractFunction } return value; } -} \ No newline at end of file +} diff --git a/trunk/java/com/l2jserver/gameserver/model/zone/type/L2BattalionZone.java b/trunk/java/com/l2jserver/gameserver/model/zone/type/L2BattalionZone.java index 62bab3b01d..782cd89b0b 100644 --- a/trunk/java/com/l2jserver/gameserver/model/zone/type/L2BattalionZone.java +++ b/trunk/java/com/l2jserver/gameserver/model/zone/type/L2BattalionZone.java @@ -175,7 +175,7 @@ public class L2BattalionZone extends L2ZoneRespawn player.stopAllEffectsExceptThoseThatLastThroughDeath(); if (Config.BTZ_REMOVE_PETS) { - L2Summon pet = player.getSummon(); + L2Summon pet = player.getPet(); if (pet != null) { pet.stopAllEffectsExceptThoseThatLastThroughDeath(); @@ -187,7 +187,7 @@ public class L2BattalionZone extends L2ZoneRespawn { if (Config.BTZ_REMOVE_PETS) { - L2Summon pet = player.getSummon(); + L2Summon pet = player.getPet(); if (pet != null) { pet.unSummon(player); @@ -213,7 +213,7 @@ public class L2BattalionZone extends L2ZoneRespawn { final PcInventory inv = player.getInventory(); - if (ItemTable.getInstance().createDummyItem(reward[0]).isStackable()) + if (ItemTable.getInstance().getTemplate(reward[0]).isStackable()) { inv.addItem("L2MultiFunctionZone ", reward[0], reward[1], player, player); diff --git a/trunk/java/com/l2jserver/gameserver/model/zone/type/L2OlympiadStadiumZone.java b/trunk/java/com/l2jserver/gameserver/model/zone/type/L2OlympiadStadiumZone.java index 70082fb8e4..e108a8f54d 100644 --- a/trunk/java/com/l2jserver/gameserver/model/zone/type/L2OlympiadStadiumZone.java +++ b/trunk/java/com/l2jserver/gameserver/model/zone/type/L2OlympiadStadiumZone.java @@ -29,6 +29,7 @@ import com.l2jserver.gameserver.model.PcCondOverride; import com.l2jserver.gameserver.model.TeleportWhereType; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance; import com.l2jserver.gameserver.model.actor.instance.L2OlympiadManagerInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -193,9 +194,10 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn else { // check for pet - if (player.hasPet()) + final L2Summon pet = player.getPet(); + if (pet != null) { - player.getSummon().unSummon(player); + pet.unSummon(player); } } } @@ -278,10 +280,10 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn { if (_player != null) { - if (_player.hasSummon()) + _player.getServitors().values().forEach(s -> { - _player.getSummon().unSummon(_player); - } + s.unSummon(_player); + }); _player.teleToLocation(TeleportWhereType.TOWN); _player.setInstanceId(0); diff --git a/trunk/java/com/l2jserver/gameserver/network/L2GameClient.java b/trunk/java/com/l2jserver/gameserver/network/L2GameClient.java index 210cdc85b2..6693f6c851 100644 --- a/trunk/java/com/l2jserver/gameserver/network/L2GameClient.java +++ b/trunk/java/com/l2jserver/gameserver/network/L2GameClient.java @@ -42,15 +42,16 @@ import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.LoginServerThread; import com.l2jserver.gameserver.LoginServerThread.SessionKey; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.CharNameTable; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.OfflineTradersTable; -import com.l2jserver.gameserver.datatables.SecondaryAuthData; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.OfflineTradersTable; +import com.l2jserver.gameserver.data.xml.impl.SecondaryAuthData; import com.l2jserver.gameserver.instancemanager.AntiFeedManager; import com.l2jserver.gameserver.model.CharSelectInfoPackage; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.PcCondOverride; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.L2Event; import com.l2jserver.gameserver.model.olympiad.OlympiadManager; @@ -782,18 +783,26 @@ public final class L2GameClient extends MMOClient> i OlympiadManager.getInstance().unRegisterNoble(getActiveChar()); // If the L2PcInstance has Pet, unsummon it - if (getActiveChar().hasSummon()) + L2Summon pet = getActiveChar().getPet(); + if (pet != null) { - getActiveChar().getSummon().setRestoreSummon(true); + pet.setRestoreSummon(true); - getActiveChar().getSummon().unSummon(getActiveChar()); + pet.unSummon(getActiveChar()); + pet = getActiveChar().getPet(); // Dead pet wasn't unsummoned, broadcast npcinfo changes (pet will be without owner name - means owner offline) - if (getActiveChar().getSummon() != null) + if (pet != null) { - getActiveChar().getSummon().broadcastNpcInfo(0); + pet.broadcastNpcInfo(0); } } + getActiveChar().getServitors().values().forEach(s -> + { + s.setRestoreSummon(true); + s.unSummon(getActiveChar()); + }); + if (Config.OFFLINE_SET_NAME_COLOR) { getActiveChar().getAppearance().setNameColor(Config.OFFLINE_NAME_COLOR); @@ -948,10 +957,12 @@ public final class L2GameClient extends MMOClient> i if ((player != null) && player.isOnline()) // safety precaution { saveCharToDisk(); - if (player.hasSummon()) + final L2Summon pet = player.getPet(); + if (pet != null) { - player.getSummon().storeMe(); + pet.storeMe(); } + player.getServitors().values().forEach(L2Summon::storeMe); } } catch (Exception e) diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/AllyDismiss.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/AllyDismiss.java index edfbd89fcd..e9d4f715e2 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/AllyDismiss.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/AllyDismiss.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterCreate.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterCreate.java index c0366c8204..0abeb4ea16 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterCreate.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterCreate.java @@ -24,12 +24,12 @@ import java.util.logging.LogRecord; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.CharNameTable; -import com.l2jserver.gameserver.datatables.CharTemplateTable; -import com.l2jserver.gameserver.datatables.InitialEquipmentData; -import com.l2jserver.gameserver.datatables.InitialShortcutData; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.data.xml.impl.InitialEquipmentData; +import com.l2jserver.gameserver.data.xml.impl.InitialShortcutData; +import com.l2jserver.gameserver.data.xml.impl.PlayerTemplateData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SkillTreesData; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.Location; @@ -180,7 +180,7 @@ public final class CharacterCreate extends L2GameClientPacket return; } - template = CharTemplateTable.getInstance().getTemplate(_classId); + template = PlayerTemplateData.getInstance().getTemplate(_classId); if ((template == null) || (ClassId.getClassId(_classId).level() > 0)) { if (Config.DEBUG) diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterSelect.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterSelect.java index bdb78bda59..39d03a40ec 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterSelect.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/CharacterSelect.java @@ -23,8 +23,8 @@ import java.util.logging.LogRecord; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.CharNameTable; -import com.l2jserver.gameserver.datatables.SecondaryAuthData; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.data.xml.impl.SecondaryAuthData; import com.l2jserver.gameserver.instancemanager.AntiFeedManager; import com.l2jserver.gameserver.instancemanager.PunishmentManager; import com.l2jserver.gameserver.model.CharSelectInfoPackage; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/DlgAnswer.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/DlgAnswer.java index 563341b88a..46d8def22e 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/DlgAnswer.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/DlgAnswer.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.enums.PlayerAction; import com.l2jserver.gameserver.handler.AdminCommandHandler; import com.l2jserver.gameserver.handler.IAdminCommandHandler; @@ -84,7 +84,7 @@ public final class DlgAnswer extends L2GameClientPacket } String command = cmd.split(" ")[0]; IAdminCommandHandler ach = AdminCommandHandler.getInstance().getHandler(command); - if (AdminTable.getInstance().hasAccess(command, activeChar.getAccessLevel())) + if (AdminData.getInstance().hasAccess(command, activeChar.getAccessLevel())) { if (Config.GMAUDIT) { diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java index 1bf7bea97d..b7754d0b9c 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java @@ -21,11 +21,11 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; import com.l2jserver.gameserver.LoginServerThread; import com.l2jserver.gameserver.cache.HtmCache; -import com.l2jserver.gameserver.datatables.AdminTable; -import com.l2jserver.gameserver.datatables.AnnouncementsTable; -import com.l2jserver.gameserver.datatables.BeautyShopData; -import com.l2jserver.gameserver.datatables.OfflineTradersTable; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.sql.impl.AnnouncementsTable; +import com.l2jserver.gameserver.data.sql.impl.OfflineTradersTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; +import com.l2jserver.gameserver.data.xml.impl.BeautyShopData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.instancemanager.CHSiegeManager; import com.l2jserver.gameserver.instancemanager.CastleManager; @@ -175,34 +175,34 @@ public class EnterWorld extends L2GameClientPacket // Apply special GM properties to the GM when entering if (activeChar.isGM()) { - if (Config.GM_STARTUP_INVULNERABLE && AdminTable.getInstance().hasAccess("admin_invul", activeChar.getAccessLevel())) + if (Config.GM_STARTUP_INVULNERABLE && AdminData.getInstance().hasAccess("admin_invul", activeChar.getAccessLevel())) { activeChar.setIsInvul(true); } - if (Config.GM_STARTUP_INVISIBLE && AdminTable.getInstance().hasAccess("admin_invisible", activeChar.getAccessLevel())) + if (Config.GM_STARTUP_INVISIBLE && AdminData.getInstance().hasAccess("admin_invisible", activeChar.getAccessLevel())) { activeChar.setInvisible(true); } - if (Config.GM_STARTUP_SILENCE && AdminTable.getInstance().hasAccess("admin_silence", activeChar.getAccessLevel())) + if (Config.GM_STARTUP_SILENCE && AdminData.getInstance().hasAccess("admin_silence", activeChar.getAccessLevel())) { activeChar.setSilenceMode(true); } - if (Config.GM_STARTUP_DIET_MODE && AdminTable.getInstance().hasAccess("admin_diet", activeChar.getAccessLevel())) + if (Config.GM_STARTUP_DIET_MODE && AdminData.getInstance().hasAccess("admin_diet", activeChar.getAccessLevel())) { activeChar.setDietMode(true); activeChar.refreshOverloaded(); } - if (Config.GM_STARTUP_AUTO_LIST && AdminTable.getInstance().hasAccess("admin_gmliston", activeChar.getAccessLevel())) + if (Config.GM_STARTUP_AUTO_LIST && AdminData.getInstance().hasAccess("admin_gmliston", activeChar.getAccessLevel())) { - AdminTable.getInstance().addGm(activeChar, false); + AdminData.getInstance().addGm(activeChar, false); } else { - AdminTable.getInstance().addGm(activeChar, true); + AdminData.getInstance().addGm(activeChar, true); } if (Config.GM_GIVE_SPECIAL_SKILLS) diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/MoveBackwardToLocation.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/MoveBackwardToLocation.java index abdccdafdf..2d72eba222 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/MoveBackwardToLocation.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/MoveBackwardToLocation.java @@ -47,6 +47,8 @@ public class MoveBackwardToLocation extends L2GameClientPacket private int _originX; private int _originY; private int _originZ; + + @SuppressWarnings("unused") private int _moveMovement; @Override @@ -133,23 +135,15 @@ public class MoveBackwardToLocation extends L2GameClientPacket return; } - // Disable keyboard movement when geodata is not enabled and player is not flying. - if ((_moveMovement == 0) && (Config.GEODATA < 1) && !activeChar.isFlying()) + double dx = _targetX - activeChar.getX(); + double dy = _targetY - activeChar.getY(); + // Can't move if character is confused, or trying to move a huge distance + if (activeChar.isOutOfControl() || (((dx * dx) + (dy * dy)) > 98010000)) // 9900*9900 { activeChar.sendPacket(ActionFailed.STATIC_PACKET); + return; } - else - { - double dx = _targetX - activeChar.getX(); - double dy = _targetY - activeChar.getY(); - // Can't move if character is confused, or trying to move a huge distance - if (activeChar.isOutOfControl() || (((dx * dx) + (dy * dy)) > 98010000)) // 9900*9900 - { - activeChar.sendPacket(ActionFailed.STATIC_PACKET); - return; - } - activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(_targetX, _targetY, _targetZ)); - } + activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(_targetX, _targetY, _targetZ)); } @Override diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/MultiSellChoose.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/MultiSellChoose.java index 555c3b48f0..5c2414f2b6 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/MultiSellChoose.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/MultiSellChoose.java @@ -23,7 +23,7 @@ import java.util.ArrayList; import javolution.util.FastList; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.MultisellData; +import com.l2jserver.gameserver.data.xml.impl.MultisellData; import com.l2jserver.gameserver.model.Elementals; import com.l2jserver.gameserver.model.L2Augmentation; import com.l2jserver.gameserver.model.actor.L2Npc; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/NewCharacter.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/NewCharacter.java index a9d8531e84..53e93e69a5 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/NewCharacter.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/NewCharacter.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.CharTemplateTable; +import com.l2jserver.gameserver.data.xml.impl.PlayerTemplateData; import com.l2jserver.gameserver.model.base.ClassId; import com.l2jserver.gameserver.network.serverpackets.NewCharacterSuccess; @@ -45,19 +45,19 @@ public final class NewCharacter extends L2GameClientPacket } final NewCharacterSuccess ct = new NewCharacterSuccess(); - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.FIGHTER)); // Human Figther - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.MAGE)); // Human Mystic - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.ELVEN_FIGHTER)); // Elven Fighter - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.ELVEN_MAGE)); // Elven Mystic - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.DARK_FIGHTER)); // Dark Fighter - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.DARK_MAGE)); // Dark Mystic - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.ORC_FIGHTER)); // Orc Fighter - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.ORC_MAGE)); // Orc Mystic - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.DWARVEN_FIGHTER)); // Dwarf Fighter - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.MALE_SOLDIER)); // Male Kamael Soldier - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.FEMALE_SOLDIER)); // Female Kamael Soldier - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.ERTHEIA_FIGHTER)); // Ertheia Fighter - ct.addChar(CharTemplateTable.getInstance().getTemplate(ClassId.ERTHEIA_WIZARD)); // Ertheia Wizard + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.FIGHTER)); // Human Figther + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.MAGE)); // Human Mystic + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.ELVEN_FIGHTER)); // Elven Fighter + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.ELVEN_MAGE)); // Elven Mystic + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.DARK_FIGHTER)); // Dark Fighter + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.DARK_MAGE)); // Dark Mystic + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.ORC_FIGHTER)); // Orc Fighter + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.ORC_MAGE)); // Orc Mystic + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.DWARVEN_FIGHTER)); // Dwarf Fighter + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.MALE_SOLDIER)); // Male Kamael Soldier + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.FEMALE_SOLDIER)); // Female Kamael Soldier + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.ERTHEIA_FIGHTER)); // Ertheia Fighter + ct.addChar(PlayerTemplateData.getInstance().getTemplate(ClassId.ERTHEIA_WIZARD)); // Ertheia Wizard sendPacket(ct); } diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireAbilityList.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireAbilityList.java index 50c048cfd2..4038df758a 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireAbilityList.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireAbilityList.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.network.clientpackets; import java.util.ArrayList; import java.util.List; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.SkillHolder; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkill.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkill.java index 5e0e3554be..f4d841e00a 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -21,8 +21,8 @@ package com.l2jserver.gameserver.network.clientpackets; import java.util.List; import com.l2jserver.Config; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SkillTreesData; import com.l2jserver.gameserver.enums.CategoryType; import com.l2jserver.gameserver.enums.IllegalActionPunishmentType; import com.l2jserver.gameserver.enums.Race; @@ -310,6 +310,16 @@ public final class RequestAcquireSkill extends L2GameClientPacket { giveSkill(activeChar, trainer, skill); } + + final List skills = SkillTreesData.getInstance().getAvailableTransferSkills(activeChar); + if (skills.isEmpty()) + { + activeChar.sendPacket(SystemMessageId.THERE_ARE_NO_OTHER_SKILLS_TO_LEARN); + } + else + { + activeChar.sendPacket(new ExAcquirableSkillListByClass(skills, AcquireSkillType.TRANSFER)); + } break; } case SUBCLASS: @@ -619,11 +629,15 @@ public final class RequestAcquireSkill extends L2GameClientPacket if (!s.getRemoveSkills().isEmpty()) { - s.getRemoveSkills().forEach(sk -> + s.getRemoveSkills().forEach(skillId -> { - if (player.getSkillLevel(sk) > 0) + if (player.getSkillLevel(skillId) > 0) { - player.removeSkill(sk, true); + final Skill skillToRemove = player.getKnownSkill(skillId); + if (skillToRemove != null) + { + player.removeSkill(skillToRemove, true); + } } }); } diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkillInfo.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkillInfo.java index 7ffa82e69e..e15e1bab48 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkillInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkillInfo.java @@ -18,8 +18,8 @@ */ package com.l2jserver.gameserver.network.clientpackets; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SkillTreesData; import com.l2jserver.gameserver.enums.CategoryType; import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.model.ClanPrivilege; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestActionUse.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestActionUse.java index 8fdcea64be..c2669303b8 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestActionUse.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestActionUse.java @@ -25,10 +25,10 @@ import com.l2jserver.gameserver.ai.CtrlEvent; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.ai.L2SummonAI; import com.l2jserver.gameserver.ai.NextAction; +import com.l2jserver.gameserver.data.sql.impl.SummonSkillsTable; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; import com.l2jserver.gameserver.datatables.BotReportTable; -import com.l2jserver.gameserver.datatables.PetDataTable; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SummonSkillsTable; import com.l2jserver.gameserver.enums.MountType; import com.l2jserver.gameserver.enums.PrivateStoreType; import com.l2jserver.gameserver.instancemanager.AirShipManager; @@ -134,7 +134,8 @@ public final class RequestActionUse extends L2GameClientPacket } } - final L2Summon summon = activeChar.getSummon(); + final L2Summon pet = activeChar.getPet(); + final L2Summon servitor = activeChar.getAnyServitor(); final L2Object target = activeChar.getTarget(); switch (_actionId) { @@ -167,48 +168,48 @@ public final class RequestActionUse extends L2GameClientPacket activeChar.tryOpenPrivateSellStore(false); break; case 15: // Change Movement Mode (Pets) - if (validateSummon(summon, true)) + if (validateSummon(pet, true)) { - ((L2SummonAI) summon.getAI()).notifyFollowStatusChange(); + ((L2SummonAI) pet.getAI()).notifyFollowStatusChange(); } break; case 16: // Attack (Pets) - if (validateSummon(summon, true)) + if (validateSummon(pet, true)) { - if (summon.canAttack(_ctrlPressed)) + if (pet.canAttack(_ctrlPressed)) { - summon.doAttack(); + pet.doAttack(); } } break; case 17: // Stop (Pets) - if (validateSummon(summon, true)) + if (validateSummon(pet, true)) { - summon.cancelAction(); + pet.cancelAction(); } break; case 19: // Unsummon Pet - if (!validateSummon(summon, true)) + if (!validateSummon(pet, true)) { break; } - if (summon.isDead()) + if (pet.isDead()) { sendPacket(SystemMessageId.DEAD_PETS_CANNOT_BE_RETURNED_TO_THEIR_SUMMONING_ITEM); break; } - if (summon.isAttackingNow() || summon.isInCombat() || summon.isMovementDisabled()) + if (pet.isAttackingNow() || pet.isInCombat() || pet.isMovementDisabled()) { sendPacket(SystemMessageId.A_PET_CANNOT_BE_UNSUMMONED_DURING_BATTLE); break; } - if (summon.isHungry()) + if (pet.isHungry()) { - if (summon.isPet() && !((L2PetInstance) summon).getPetData().getFood().isEmpty()) + if (!((L2PetInstance) pet).getPetData().getFood().isEmpty()) { sendPacket(SystemMessageId.YOU_MAY_NOT_RESTORE_A_HUNGRY_PET); } @@ -219,27 +220,27 @@ public final class RequestActionUse extends L2GameClientPacket break; } - summon.unSummon(activeChar); + pet.unSummon(activeChar); break; case 21: // Change Movement Mode (Servitors) - if (validateSummon(summon, false)) + if (validateSummon(servitor, false)) { - ((L2SummonAI) summon.getAI()).notifyFollowStatusChange(); + ((L2SummonAI) servitor.getAI()).notifyFollowStatusChange(); } break; case 22: // Attack (Servitors) - if (validateSummon(summon, false)) + if (validateSummon(servitor, false)) { - if (summon.canAttack(_ctrlPressed)) + if (servitor.canAttack(_ctrlPressed)) { - summon.doAttack(); + servitor.doAttack(); } } break; case 23: // Stop (Servitors) - if (validateSummon(summon, false)) + if (validateSummon(servitor, false)) { - summon.cancelAction(); + servitor.cancelAction(); } break; case 28: // Private Store - Buy @@ -270,13 +271,13 @@ public final class RequestActionUse extends L2GameClientPacket sendPacket(new RecipeShopManageList(activeChar, true)); break; case 38: // Mount/Dismount - activeChar.mountPlayer(summon); + activeChar.mountPlayer(pet); break; case 39: // Soulless - Parasite Burst useSkill(4138, false); break; case 41: // Wild Hog Cannon - Attack - if (validateSummon(summon, false)) + if (validateSummon(servitor, false)) { if ((target != null) && (target.isDoor() || (target instanceof L2SiegeFlagInstance))) { @@ -329,33 +330,33 @@ public final class RequestActionUse extends L2GameClientPacket sendPacket(new RecipeShopManageList(activeChar, false)); break; case 52: // Unsummon Servitor - if (validateSummon(summon, false)) + if (validateSummon(servitor, false)) { - if (summon.isAttackingNow() || summon.isInCombat()) + if (servitor.isAttackingNow() || servitor.isInCombat()) { sendPacket(SystemMessageId.A_SERVITOR_WHOM_IS_ENGAGED_IN_BATTLE_CANNOT_BE_DE_ACTIVATED); break; } - summon.unSummon(activeChar); + servitor.unSummon(activeChar); } break; case 53: // Move to target (Servitors) - if (validateSummon(summon, false)) + if (validateSummon(servitor, false)) { - if ((target != null) && (summon != target) && !summon.isMovementDisabled()) + if ((target != null) && (servitor != target) && !servitor.isMovementDisabled()) { - summon.setFollowStatus(false); - summon.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, target.getLocation()); + servitor.setFollowStatus(false); + servitor.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, target.getLocation()); } } break; case 54: // Move to target (Pets) - if (validateSummon(summon, true)) + if (validateSummon(pet, true)) { - if ((target != null) && (summon != target) && !summon.isMovementDisabled()) + if ((target != null) && (pet != target) && !pet.isMovementDisabled()) { - summon.setFollowStatus(false); - summon.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, target.getLocation()); + pet.setFollowStatus(false); + pet.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, target.getLocation()); } } break; @@ -447,9 +448,9 @@ public final class RequestActionUse extends L2GameClientPacket } break; case 1001: // Sin Eater - Ultimate Bombastic Buster - if (validateSummon(summon, true) && (summon.getId() == SIN_EATER_ID)) + if (validateSummon(pet, true) && (pet.getId() == SIN_EATER_ID)) { - summon.broadcastPacket(new NpcSay(summon.getObjectId(), Say2.NPC_ALL, summon.getId(), NPC_STRINGS[Rnd.get(NPC_STRINGS.length)])); + pet.broadcastPacket(new NpcSay(pet.getObjectId(), Say2.NPC_ALL, pet.getId(), NPC_STRINGS[Rnd.get(NPC_STRINGS.length)])); } break; case 1003: // Wind Hatchling/Strider - Wild Stun @@ -663,9 +664,9 @@ public final class RequestActionUse extends L2GameClientPacket useSkill(6044, false); break; case 1084: // Switch State - if (summon instanceof L2BabyPetInstance) + if (pet instanceof L2BabyPetInstance) { - useSkill(6054, true); + useSkill(SWITCH_STANCE_ID, true); } break; case 1086: // Panther Cancel @@ -707,6 +708,172 @@ public final class RequestActionUse extends L2GameClientPacket case 1098: // Elite Maguen - Maguen Party Return useSkill(6684, true); break; + case 1099: // All servitor attack + activeChar.getServitors().values().forEach(s -> + { + if (validateSummon(s, false)) + { + if (s.canAttack(_ctrlPressed)) + { + s.doAttack(); + } + } + }); + break; + case 1100: // All servitor move to + activeChar.getServitors().values().forEach(s -> + { + if (validateSummon(s, false)) + { + if ((target != null) && (s != target) && !s.isMovementDisabled()) + { + s.setFollowStatus(false); + s.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, target.getLocation()); + } + } + }); + break; + case 1101: // All servitor stop + activeChar.getServitors().values().forEach(summon -> + { + if (validateSummon(summon, false)) + { + summon.cancelAction(); + } + }); + break; + case 1102: // Unsummon all servitors + boolean canUnsummon = true; + OUT: for (L2Summon s : activeChar.getServitors().values()) + { + if (validateSummon(s, false)) + { + if (s.isAttackingNow() || s.isInCombat()) + { + sendPacket(SystemMessageId.A_SERVITOR_WHOM_IS_ENGAGED_IN_BATTLE_CANNOT_BE_DE_ACTIVATED); + canUnsummon = false; + break OUT; + } + s.unSummon(activeChar); + } + } + if (canUnsummon) + { + activeChar.getServitors().values().stream().forEach(s -> + { + s.unSummon(activeChar); + }); + } + break; + case 1103: // seems to be passive mode + break; + case 1104: // seems to be defend mode + break; + case 1106: // Cute Bear - Bear Claw + useServitorsSkill(11278); + break; + case 1107: // Cute Bear - Bear Tumbling + useServitorsSkill(11279); + break; + case 1108: // Saber Tooth Cougar- Cougar Bite + useServitorsSkill(11280); + break; + case 1109: // Saber Tooth Cougar - Cougar Pounce + useServitorsSkill(11281); + break; + case 1110: // Grim Reaper - Reaper Touch + useServitorsSkill(11282); + break; + case 1111: // Grim Reaper - Reaper Power + useServitorsSkill(11283); + break; + case 1113: // Golden Lion - Lion Roar + useSkill(10051, false); + break; + case 1114: // Golden Lion - Lion Claw + useSkill(10052, false); + break; + case 1115: // Golden Lion - Lion Dash + useSkill(10053, false); + break; + case 1116: // Golden Lion - Lion Flame + useSkill(10054, false); + break; + case 1117: // Thunder Hawk - Thunder Flight + useSkill(10794, false); + break; + case 1118: // Thunder Hawk - Thunder Purity + useSkill(10795, false); + break; + case 1120: // Thunder Hawk - Thunder Feather Blast + useSkill(10797, false); + break; + case 1121: // Thunder Hawk - Thunder Sharp Claw + useSkill(10798, false); + break; + case 1122: // Tree of Life - Blessing of Tree + useServitorsSkill(11806); + break; + case 1124: // Wynn Kai the Cat - Feline Aggression + useServitorsSkill(11323); + break; + case 1125: // Wynn Kai the Cat - Feline Stun + useServitorsSkill(11324); + break; + case 1126: // Wynn Feline King - Feline Bite + useServitorsSkill(11325); + break; + case 1127: // Wynn Feline King - Feline Pounce + useServitorsSkill(11326); + break; + case 1128: // Wynn Feline Queen - Feline Touch + useServitorsSkill(11327); + break; + case 1129: // Wynn Feline Queen - Feline Power + useServitorsSkill(11328); + break; + case 1130: // Wynn Merrow - Unicorn's Aggression + useServitorsSkill(11332); + break; + case 1131: // Wynn Merrow - Unicorn's Stun + useServitorsSkill(11333); + break; + case 1132: // Wynn Magnus - Unicorn's Bite + useServitorsSkill(11334); + break; + case 1133: // Wynn Magnus - Unicorn's Pounce + useServitorsSkill(11335); + break; + case 1134: // Wynn Seraphim - Unicorn's Touch + useServitorsSkill(11336); + break; + case 1135: // Wynn Seraphim - Unicorn's Power + useServitorsSkill(11337); + break; + case 1136: // Wynn Nightshade - Phantom Aggression + useServitorsSkill(11341); + break; + case 1137: // Wynn Nightshade - Phantom Stun + useServitorsSkill(11342); + break; + case 1138: // Wynn Spectral Lord - Phantom Bite + useServitorsSkill(11343); + break; + case 1139: // Wynn Spectral Lord - Phantom Pounce + useServitorsSkill(11344); + break; + case 1140: // Wynn Soulless - Phantom Touch + useServitorsSkill(11345); + break; + case 1141: // Wynn Soulless - Phantom Power + useServitorsSkill(11346); + break; + case 1142: // Blood Panther - Panther Roar + useServitorsSkill(10087); + break; + case 1143: // Blood Panther - Panther Rush + useServitorsSkill(10088); + break; case 5000: // Baby Rudolph - Reindeer Scratch useSkill(23155, true); break; @@ -866,45 +1033,57 @@ public final class RequestActionUse extends L2GameClientPacket return; } - final L2Summon summon = activeChar.getSummon(); - if (!validateSummon(summon, pet)) + if (pet) { - return; - } - - if (summon instanceof L2BabyPetInstance) - { - if (!((L2BabyPetInstance) summon).isInSupportMode()) + final L2Summon summon = activeChar.getPet(); + if (!validateSummon(summon, pet)) { - sendPacket(SystemMessageId.A_PET_ON_AUXILIARY_MODE_CANNOT_USE_SKILLS); return; } - } - - int lvl = 0; - if (summon.isPet()) - { + + if (summon instanceof L2BabyPetInstance) + { + if (!((L2BabyPetInstance) summon).isInSupportMode()) + { + sendPacket(SystemMessageId.A_PET_ON_AUXILIARY_MODE_CANNOT_USE_SKILLS); + return; + } + } + if ((summon.getLevel() - activeChar.getLevel()) > 20) { sendPacket(SystemMessageId.YOUR_PET_IS_TOO_HIGH_LEVEL_TO_CONTROL); return; } - lvl = PetDataTable.getInstance().getPetData(summon.getId()).getAvailableLevel(skillId, summon.getLevel()); + + final int lvl = PetDataTable.getInstance().getPetData(summon.getId()).getAvailableLevel(skillId, summon.getLevel()); + + if (lvl > 0) + { + summon.setTarget(target); + summon.useMagic(SkillData.getInstance().getSkill(skillId, lvl), _ctrlPressed, _shiftPressed); + } + + if (skillId == SWITCH_STANCE_ID) + { + summon.switchMode(); + } } else { - lvl = SummonSkillsTable.getInstance().getAvailableLevel(summon, skillId); - } - - if (lvl > 0) - { - summon.setTarget(target); - summon.useMagic(SkillData.getInstance().getSkill(skillId, lvl), _ctrlPressed, _shiftPressed); - } - - if (skillId == SWITCH_STANCE_ID) - { - summon.switchMode(); + final L2Summon servitor = activeChar.getAnyServitor(); + if (!validateSummon(servitor, pet)) + { + return; + } + + final int lvl = SummonSkillsTable.getInstance().getAvailableLevel(servitor, skillId); + + if (lvl > 0) + { + servitor.setTarget(target); + servitor.useMagic(SkillData.getInstance().getSkill(skillId, lvl), _ctrlPressed, _shiftPressed); + } } } @@ -925,6 +1104,36 @@ public final class RequestActionUse extends L2GameClientPacket useSkill(skillId, activeChar.getTarget(), pet); } + /** + * Cast a skill for all active summon.
+ * Target is retrieved from owner's target + * @param skillId the skill Id to use + */ + private void useServitorsSkill(int skillId) + { + final L2PcInstance activeChar = getActiveChar(); + if (activeChar == null) + { + return; + } + + activeChar.getServitors().values().forEach(servitor -> + { + if (!validateSummon(servitor, false)) + { + return; + } + + final int lvl = SummonSkillsTable.getInstance().getAvailableLevel(servitor, skillId); + + if (lvl > 0) + { + servitor.setTarget(activeChar.getTarget()); + servitor.useMagic(SkillData.getInstance().getSkill(skillId, lvl), _ctrlPressed, _shiftPressed); + } + }); + } + /** * Validates the given summon and sends a system message to the master. * @param summon the summon to validate diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAutoSoulShot.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAutoSoulShot.java index bf235759cb..8abc82981d 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAutoSoulShot.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestAutoSoulShot.java @@ -18,22 +18,21 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.Config; import com.l2jserver.gameserver.enums.PrivateStoreType; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.items.L2Item; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; +import com.l2jserver.gameserver.model.items.type.ActionType; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.ExAutoSoulShot; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; /** - * This class ... - * @version $Revision: 1.0.0.0 $ $Date: 2005/07/11 15:29:30 $ + * @author Unknown, UnAfraid */ public final class RequestAutoSoulShot extends L2GameClientPacket { - private static final String _C__D0_0D_REQUESTAUTOSOULSHOT = "[C] D0:0D RequestAutoSoulShot"; - // format cd private int _itemId; private int _type; // 1 = on : 0 = off; @@ -56,11 +55,6 @@ public final class RequestAutoSoulShot extends L2GameClientPacket if ((activeChar.getPrivateStoreType() == PrivateStoreType.NONE) && (activeChar.getActiveRequester() == null) && !activeChar.isDead()) { - if (Config.DEBUG) - { - _log.fine("AutoSoulShot:" + _itemId); - } - final L2ItemInstance item = activeChar.getInventory().getItemByItemId(_itemId); if (item == null) { @@ -75,100 +69,145 @@ public final class RequestAutoSoulShot extends L2GameClientPacket return; } - // Fishingshots are not automatic on retail - if ((_itemId < 6535) || (_itemId > 6540)) + if (isSummonShot(item.getItem())) { - // Attempt to charge first shot on activation - if ((_itemId == 6645) || (_itemId == 6646) || (_itemId == 6647) || (_itemId == 20332) || (_itemId == 20333) || (_itemId == 20334)) + if (activeChar.hasSummon()) { - if (activeChar.hasSummon()) + final boolean isSoulshot = item.getEtcItem().getDefaultAction() == ActionType.SUMMON_SOULSHOT; + final boolean isSpiritshot = item.getEtcItem().getDefaultAction() == ActionType.SUMMON_SPIRITSHOT; + if (isSoulshot) { - if (item.getEtcItem().getHandlerName().equals("BeastSoulShot")) + int soulshotCount = 0; + final L2Summon pet = activeChar.getPet(); + if (pet != null) { - if (activeChar.getSummon().getSoulShotsPerHit() > item.getCount()) - { - activeChar.sendPacket(SystemMessageId.YOU_DON_T_HAVE_ENOUGH_SOULSHOTS_NEEDED_FOR_A_PET_SERVITOR); - return; - } + soulshotCount += pet.getSoulShotsPerHit(); } - else + for (L2Summon servitor : activeChar.getServitors().values()) { - if (activeChar.getSummon().getSpiritShotsPerHit() > item.getCount()) - { - activeChar.sendPacket(SystemMessageId.YOU_DON_T_HAVE_ENOUGH_SOULSHOTS_NEEDED_FOR_A_PET_SERVITOR); - return; - } + soulshotCount += servitor.getSoulShotsPerHit(); + } + if (soulshotCount > item.getCount()) + { + activeChar.sendPacket(SystemMessageId.YOU_DON_T_HAVE_ENOUGH_SOULSHOTS_NEEDED_FOR_A_PET_SERVITOR); + return; } - activeChar.addAutoSoulShot(_itemId); - activeChar.sendPacket(new ExAutoSoulShot(_itemId, _type)); - - // start the auto soulshot use - SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THE_AUTOMATIC_USE_OF_S1_HAS_BEEN_ACTIVATED); - sm.addItemName(item); - activeChar.sendPacket(sm); - - activeChar.rechargeShots(true, true); - activeChar.getSummon().rechargeShots(true, true); - } - else + else if (isSpiritshot) { - activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_A_SERVITOR_OR_PET_AND_THEREFORE_CANNOT_USE_THE_AUTOMATIC_USE_FUNCTION); - } - } - else - { - if ((activeChar.getActiveWeaponItem() != activeChar.getFistsWeaponItem()) && (item.getItem().getCrystalType() == activeChar.getActiveWeaponItem().getItemGradeSPlus())) - { - activeChar.addAutoSoulShot(_itemId); - activeChar.sendPacket(new ExAutoSoulShot(_itemId, _type)); - } - else - { - if (((_itemId >= 2509) && (_itemId <= 2514)) || ((_itemId >= 3947) && (_itemId <= 3952)) || (_itemId == 5790) || ((_itemId >= 22072) && (_itemId <= 22081))) + int spiritshotCount = 0; + final L2Summon pet = activeChar.getPet(); + if (pet != null) { - activeChar.sendPacket(SystemMessageId.YOUR_SPIRITSHOT_DOES_NOT_MATCH_THE_WEAPON_S_GRADE); + spiritshotCount += pet.getSpiritShotsPerHit(); } - else + for (L2Summon servitor : activeChar.getServitors().values()) { - activeChar.sendPacket(SystemMessageId.THE_SOULSHOT_YOU_ARE_ATTEMPTING_TO_USE_DOES_NOT_MATCH_THE_GRADE_OF_YOUR_EQUIPPED_WEAPON); + spiritshotCount += servitor.getSpiritShotsPerHit(); + } + if (spiritshotCount > item.getCount()) + { + activeChar.sendPacket(SystemMessageId.YOU_DON_T_HAVE_ENOUGH_SOULSHOTS_NEEDED_FOR_A_PET_SERVITOR); + return; } - - activeChar.addAutoSoulShot(_itemId); - activeChar.sendPacket(new ExAutoSoulShot(_itemId, _type)); } - // start the auto soulshot use - SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THE_AUTOMATIC_USE_OF_S1_HAS_BEEN_ACTIVATED); + // Activate shots + activeChar.addAutoSoulShot(_itemId); + activeChar.sendPacket(new ExAutoSoulShot(_itemId, _type)); + + // Send message + final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THE_AUTOMATIC_USE_OF_S1_HAS_BEEN_ACTIVATED); sm.addItemName(item); activeChar.sendPacket(sm); - activeChar.rechargeShots(true, true); + // Recharge summon's shots + final L2Summon pet = activeChar.getPet(); + if (pet != null) + { + pet.rechargeShots(isSoulshot, isSpiritshot); + } + activeChar.getServitors().values().forEach(s -> + { + s.rechargeShots(isSoulshot, isSpiritshot); + }); } + else + { + activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_A_SERVITOR_OR_PET_AND_THEREFORE_CANNOT_USE_THE_AUTOMATIC_USE_FUNCTION); + } + } + else if (isPlayerShot(item.getItem())) + { + final boolean isSoulshot = (item.getEtcItem().getDefaultAction() == ActionType.SOULSHOT) || (item.getEtcItem().getDefaultAction() == ActionType.FISHINGSHOT); + final boolean isSpiritshot = item.getEtcItem().getDefaultAction() == ActionType.SPIRITSHOT; + if ((activeChar.getActiveWeaponItem() == activeChar.getFistsWeaponItem()) || (item.getItem().getCrystalType() != activeChar.getActiveWeaponItem().getItemGradeSPlus())) + { + activeChar.sendPacket(isSoulshot ? SystemMessageId.YOUR_SPIRITSHOT_DOES_NOT_MATCH_THE_WEAPON_S_GRADE : SystemMessageId.THE_SOULSHOT_YOU_ARE_ATTEMPTING_TO_USE_DOES_NOT_MATCH_THE_GRADE_OF_YOUR_EQUIPPED_WEAPON); + return; + } + + // Activate shots + activeChar.addAutoSoulShot(_itemId); + activeChar.sendPacket(new ExAutoSoulShot(_itemId, _type)); + + // Send message + final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THE_AUTOMATIC_USE_OF_S1_HAS_BEEN_ACTIVATED); + sm.addItemName(item); + activeChar.sendPacket(sm); + + // Recharge player's shots + activeChar.rechargeShots(isSoulshot, isSpiritshot); } } else if (_type == 0) { + // Cancel auto shots activeChar.removeAutoSoulShot(_itemId); activeChar.sendPacket(new ExAutoSoulShot(_itemId, _type)); - // cancel the auto soulshot use - SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THE_AUTOMATIC_USE_OF_S1_HAS_BEEN_DEACTIVATED); + // Send message + final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THE_AUTOMATIC_USE_OF_S1_HAS_BEEN_DEACTIVATED); sm.addItemName(item); activeChar.sendPacket(sm); } } } - @Override - public String getType() - { - return _C__D0_0D_REQUESTAUTOSOULSHOT; - } - @Override protected boolean triggersOnActionRequest() { return false; } + + public static boolean isPlayerShot(L2Item item) + { + switch (item.getDefaultAction()) + { + case SPIRITSHOT: + case SOULSHOT: + case FISHINGSHOT: + return true; + default: + return false; + } + } + + public static boolean isSummonShot(L2Item item) + { + switch (item.getDefaultAction()) + { + case SUMMON_SPIRITSHOT: + case SUMMON_SOULSHOT: + return true; + default: + return false; + } + } + + @Override + public String getType() + { + return getClass().getSimpleName(); + } } diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBlock.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBlock.java index b4b891a220..2106b13a9e 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBlock.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBlock.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.model.BlockList; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBuyItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBuyItem.java index f6c54cb8b4..17fe4d8152 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBuyItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBuyItem.java @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.List; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.BuyListData; +import com.l2jserver.gameserver.data.xml.impl.BuyListData; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2MerchantInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java index 1ed92c4204..86d20d709f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java @@ -23,7 +23,7 @@ import java.util.logging.Level; import com.l2jserver.Config; import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.enums.PlayerAction; import com.l2jserver.gameserver.handler.AdminCommandHandler; @@ -39,6 +39,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.Hero; import com.l2jserver.gameserver.model.events.EventDispatcher; import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcManorBypass; +import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcMenuSelect; import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerBypass; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.network.SystemMessageId; @@ -65,6 +66,7 @@ public final class RequestBypassToServer extends L2GameClientPacket "_match", "_diary", "_olympiad?command", + "menu_select", "manor_menu_select" }; @@ -143,14 +145,14 @@ public final class RequestBypassToServer extends L2GameClientPacket return; } - if (!AdminTable.getInstance().hasAccess(command, activeChar.getAccessLevel())) + if (!AdminData.getInstance().hasAccess(command, activeChar.getAccessLevel())) { activeChar.sendMessage("You don't have the access rights to use this command!"); _log.warning("Character " + activeChar.getName() + " tried to use admin command " + command + ", without proper access level!"); return; } - if (AdminTable.getInstance().requireConfirm(command)) + if (AdminData.getInstance().requireConfirm(command)) { activeChar.setAdminConfirmCmd(_command); ConfirmDlg dlg = new ConfirmDlg(SystemMessageId.S13); @@ -260,6 +262,17 @@ public final class RequestBypassToServer extends L2GameClientPacket handler.useBypass("arenachange " + (arenaId - 1), activeChar, null); } } + else if (_command.startsWith("menu_select")) + { + final L2Npc lastNpc = activeChar.getLastFolkNPC(); + if ((lastNpc != null) && lastNpc.canInteract(activeChar)) + { + final String[] split = _command.substring(_command.indexOf("?") + 1).split("&"); + final int ask = Integer.parseInt(split[0].split("=")[1]); + final int reply = Integer.parseInt(split[1].split("=")[1]); + EventDispatcher.getInstance().notifyEventAsync(new OnNpcMenuSelect(activeChar, lastNpc, ask, reply), lastNpc); + } + } else if (_command.startsWith("manor_menu_select")) { final L2Npc lastNpc = activeChar.getLastFolkNPC(); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAbilityPoint.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAbilityPoint.java index 274ae3f819..ac8476cad8 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAbilityPoint.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangeAbilityPoint.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AbilityPointsData; +import com.l2jserver.gameserver.data.xml.impl.AbilityPointsData; import com.l2jserver.gameserver.enums.UserInfoType; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangePetName.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangePetName.java index c44d83a4b0..123af5d515 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangePetName.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestChangePetName.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.PetNameTable; +import com.l2jserver.gameserver.data.sql.impl.PetNameTable; import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; @@ -48,7 +48,7 @@ public final class RequestChangePetName extends L2GameClientPacket return; } - final L2Summon pet = activeChar.getSummon(); + final L2Summon pet = activeChar.getPet(); if (pet == null) { return; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestCharacterNameCreatable.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestCharacterNameCreatable.java index 3ba6f8e0b0..444efcf00f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestCharacterNameCreatable.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestCharacterNameCreatable.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.network.serverpackets.ExIsCharNameCreatable; import com.l2jserver.gameserver.util.Util; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestConfirmSiegeWaitingList.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestConfirmSiegeWaitingList.java index 9d18383475..0aa13d279e 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestConfirmSiegeWaitingList.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestConfirmSiegeWaitingList.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestCrystallizeItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestCrystallizeItem.java index 39e21d984a..e244b75c58 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestCrystallizeItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestCrystallizeItem.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.List; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ItemCrystalizationData; +import com.l2jserver.gameserver.data.xml.impl.ItemCrystalizationData; import com.l2jserver.gameserver.enums.PrivateStoreType; import com.l2jserver.gameserver.enums.Race; import com.l2jserver.gameserver.model.CrystalizationData; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDestroyItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDestroyItem.java index e562c569f1..1c54bf6f0a 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDestroyItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDestroyItem.java @@ -27,6 +27,7 @@ import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.enums.PrivateStoreType; import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager; import com.l2jserver.gameserver.model.PcCondOverride; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.network.SystemMessageId; @@ -148,9 +149,10 @@ public final class RequestDestroyItem extends L2GameClientPacket if (itemToRemove.getItem().isPetItem()) { - if (activeChar.hasSummon() && (activeChar.getSummon().getControlObjectId() == _objectId)) + final L2Summon pet = activeChar.getPet(); + if ((pet != null) && (pet.getControlObjectId() == _objectId)) { - activeChar.getSummon().unSummon(activeChar); + pet.unSummon(activeChar); } try (Connection con = L2DatabaseFactory.getInstance().getConnection(); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDispel.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDispel.java index 6aeb40a29d..7266d8329d 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDispel.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDispel.java @@ -20,6 +20,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; import com.l2jserver.gameserver.datatables.SkillData; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.skills.AbnormalType; import com.l2jserver.gameserver.model.skills.Skill; @@ -78,9 +79,15 @@ public class RequestDispel extends L2GameClientPacket } else { - if (activeChar.hasSummon() && (activeChar.getSummon().getObjectId() == _objectId)) + final L2Summon pet = activeChar.getPet(); + if ((pet != null) && (pet.getObjectId() == _objectId)) { - activeChar.getSummon().stopSkillEffects(true, _skillId); + pet.stopSkillEffects(true, _skillId); + } + + if (activeChar.hasServitor(_objectId)) + { + activeChar.removeServitor(_objectId); } } } diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDropItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDropItem.java index 3bacf3e3e4..07638a7455 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDropItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestDropItem.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.enums.PrivateStoreType; import com.l2jserver.gameserver.model.PcCondOverride; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -223,7 +223,7 @@ public final class RequestDropItem extends L2GameClientPacket { String msg = "Character (" + activeChar.getName() + ") has dropped (" + dropedItem.getCount() + ")adena at (" + _x + "," + _y + "," + _z + ")"; _log.warning(msg); - AdminTable.getInstance().broadcastMessageToGMs(msg); + AdminData.getInstance().broadcastMessageToGMs(msg); } } diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEnchantItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEnchantItem.java index bec4f3273e..ac0a30e723 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEnchantItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEnchantItem.java @@ -23,7 +23,7 @@ import java.util.logging.LogRecord; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.EnchantItemData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemData; import com.l2jserver.gameserver.enums.UserInfoType; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -36,6 +36,7 @@ import com.l2jserver.gameserver.model.skills.CommonSkill; import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.EnchantResult; +import com.l2jserver.gameserver.network.serverpackets.ExAdenaInvenCount; import com.l2jserver.gameserver.network.serverpackets.ExUserInfoInvenWeight; import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate; import com.l2jserver.gameserver.network.serverpackets.ItemList; @@ -430,7 +431,7 @@ public final class RequestEnchantItem extends L2GameClientPacket activeChar.broadcastUserInfo(UserInfoType.ENCHANTLEVEL); activeChar.sendPacket(new ExUserInfoInvenWeight(activeChar)); - activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE); + activeChar.sendPacket(new ExAdenaInvenCount(activeChar)); } } diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordCheck.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordCheck.java index 0db4045723..f2c8460751 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordCheck.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordCheck.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.SecondaryAuthData; +import com.l2jserver.gameserver.data.xml.impl.SecondaryAuthData; import com.l2jserver.gameserver.network.serverpackets.Ex2ndPasswordCheck; /** diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordReq.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordReq.java index bab1d94f04..7f2cbd86a2 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordReq.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordReq.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.SecondaryAuthData; +import com.l2jserver.gameserver.data.xml.impl.SecondaryAuthData; import com.l2jserver.gameserver.network.serverpackets.Ex2ndPasswordAck; import com.l2jserver.gameserver.security.SecondaryPasswordAuth; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordVerify.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordVerify.java index 5103ca46c8..0f293ef933 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordVerify.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestEx2ndPasswordVerify.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.SecondaryAuthData; +import com.l2jserver.gameserver.data.xml.impl.SecondaryAuthData; /** * Format: (ch)S S: numerical password diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExAddEnchantScrollItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExAddEnchantScrollItem.java index 810cef9b96..1a7e226ebb 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExAddEnchantScrollItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExAddEnchantScrollItem.java @@ -18,13 +18,12 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.EnchantItemData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.enchant.EnchantScroll; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.ExPutEnchantScrollItemResult; -import com.l2jserver.gameserver.network.serverpackets.ExPutEnchantSupportItemResult; /** * @author Sdw @@ -61,7 +60,6 @@ public class RequestExAddEnchantScrollItem extends L2GameClientPacket { // message may be custom activeChar.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITIONS); - activeChar.setActiveEnchantSupportItemId(L2PcInstance.ID_NONE); return; } @@ -71,8 +69,7 @@ public class RequestExAddEnchantScrollItem extends L2GameClientPacket { // message may be custom activeChar.sendPacket(SystemMessageId.INAPPROPRIATE_ENCHANT_CONDITIONS); - activeChar.setActiveEnchantSupportItemId(L2PcInstance.ID_NONE); - activeChar.sendPacket(new ExPutEnchantSupportItemResult(0)); + activeChar.sendPacket(new ExPutEnchantScrollItemResult(0)); return; } activeChar.sendPacket(new ExPutEnchantScrollItemResult(_scrollObjectId)); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkill.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkill.java index b3ce343679..c858475345 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkill.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkill.java @@ -23,7 +23,7 @@ import java.util.logging.LogRecord; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder; import com.l2jserver.gameserver.model.L2EnchantSkillLearn; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillInfo.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillInfo.java index 710f96041a..f59dbdb048 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillInfo.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.skills.Skill; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillInfoDetail.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillInfoDetail.java index bba9427e20..4e3e971c2a 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillInfoDetail.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillInfoDetail.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; import com.l2jserver.gameserver.model.L2EnchantSkillLearn; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.serverpackets.ExEnchantSkillInfoDetail; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillRouteChange.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillRouteChange.java index aa9f43440d..02f540b73d 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillRouteChange.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillRouteChange.java @@ -23,7 +23,7 @@ import java.util.logging.LogRecord; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder; import com.l2jserver.gameserver.model.L2EnchantSkillLearn; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillSafe.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillSafe.java index 6502fedb04..41d8f744a9 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillSafe.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillSafe.java @@ -23,7 +23,7 @@ import java.util.logging.LogRecord; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder; import com.l2jserver.gameserver.model.L2EnchantSkillLearn; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillUntrain.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillUntrain.java index cac7d7b2f2..081fb6bc91 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillUntrain.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkillUntrain.java @@ -23,7 +23,7 @@ import java.util.logging.LogRecord; import java.util.logging.Logger; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder; import com.l2jserver.gameserver.model.L2EnchantSkillLearn; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExPledgeCrestLarge.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExPledgeCrestLarge.java index 42247394df..c612ce6119 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExPledgeCrestLarge.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExPledgeCrestLarge.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.CrestTable; +import com.l2jserver.gameserver.data.sql.impl.CrestTable; import com.l2jserver.gameserver.model.L2Crest; import com.l2jserver.gameserver.network.serverpackets.ExPledgeEmblem; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExRemoveEnchantSupportItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExRemoveEnchantSupportItem.java index 4ba11ce5ea..a5c276056b 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExRemoveEnchantSupportItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExRemoveEnchantSupportItem.java @@ -47,12 +47,14 @@ public class RequestExRemoveEnchantSupportItem extends L2GameClientPacket activeChar.setActiveEnchantTimestamp(System.currentTimeMillis()); - final L2ItemInstance supportItem = activeChar.getInventory().getItemByItemId(activeChar.getActiveEnchantSupportItemId()); + final L2ItemInstance supportItem = activeChar.getInventory().getItemByObjectId(activeChar.getActiveEnchantSupportItemId()); if ((supportItem == null) || (supportItem.getCount() < 1)) { - activeChar.sendPacket(ExRemoveEnchantSupportItemResult.STATIC_PACKET); + activeChar.setActiveEnchantSupportItemId(L2PcInstance.ID_NONE); } + + activeChar.sendPacket(ExRemoveEnchantSupportItemResult.STATIC_PACKET); } @Override diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExSetPledgeCrestLarge.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExSetPledgeCrestLarge.java index 2a1af3011f..618759895f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExSetPledgeCrestLarge.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExSetPledgeCrestLarge.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.CrestTable; +import com.l2jserver.gameserver.data.sql.impl.CrestTable; import com.l2jserver.gameserver.model.ClanPrivilege; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2Crest; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExTryToPutEnchantSupportItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExTryToPutEnchantSupportItem.java index 5e8e224260..a2826de305 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExTryToPutEnchantSupportItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExTryToPutEnchantSupportItem.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.EnchantItemData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.enchant.EnchantScroll; import com.l2jserver.gameserver.model.items.enchant.EnchantSupportItem; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExTryToPutEnchantTargetItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExTryToPutEnchantTargetItem.java index 73088802fd..1cbbb68c7f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExTryToPutEnchantTargetItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestExTryToPutEnchantTargetItem.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.network.clientpackets; import java.util.logging.Level; -import com.l2jserver.gameserver.datatables.EnchantItemData; +import com.l2jserver.gameserver.data.xml.impl.EnchantItemData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.enchant.EnchantScroll; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGMCommand.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGMCommand.java index f0ccd84c18..d9a0a2164c 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGMCommand.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGMCommand.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGetItemFromPet.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGetItemFromPet.java index d4001a3f52..5f5bf4b6f2 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGetItemFromPet.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGetItemFromPet.java @@ -60,7 +60,7 @@ public final class RequestGetItemFromPet extends L2GameClientPacket return; } - final L2PetInstance pet = (L2PetInstance) player.getSummon(); + final L2PetInstance pet = (L2PetInstance) player.getPet(); if (player.getActiveEnchantItemId() != L2PcInstance.ID_NONE) { return; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGiveItemToPet.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGiveItemToPet.java index 9c1b8567a5..2cbd30aeb7 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGiveItemToPet.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGiveItemToPet.java @@ -98,7 +98,7 @@ public final class RequestGiveItemToPet extends L2GameClientPacket return; } - final L2PetInstance pet = (L2PetInstance) player.getSummon(); + final L2PetInstance pet = (L2PetInstance) player.getPet(); if (pet.isDead()) { player.sendPacket(SystemMessageId.YOUR_PET_IS_DEAD_AND_ANY_ATTEMPT_YOU_MAKE_TO_GIVE_IT_SOMETHING_GOES_UNRECOGNIZED); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGmList.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGmList.java index db27facbac..5e229dff89 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGmList.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestGmList.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; /** * This class handles RequestGmLista packet triggered by /gmlist command @@ -41,7 +41,7 @@ public final class RequestGmList extends L2GameClientPacket { return; } - AdminTable.getInstance().sendListToPlayer(getClient().getActiveChar()); + AdminData.getInstance().sendListToPlayer(getClient().getActiveChar()); } @Override diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaEquip.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaEquip.java index b5b40ffb91..5de2e172b9 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaEquip.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaEquip.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.HennaData; +import com.l2jserver.gameserver.data.xml.impl.HennaData; import com.l2jserver.gameserver.model.PcCondOverride; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.L2Henna; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemInfo.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemInfo.java index 8f4f0d8f1c..6335cf3ef4 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemInfo.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.HennaData; +import com.l2jserver.gameserver.data.xml.impl.HennaData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.L2Henna; import com.l2jserver.gameserver.network.serverpackets.HennaItemDrawInfo; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemRemoveInfo.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemRemoveInfo.java index 5cb5ab2a49..30eb5960c4 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemRemoveInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestHennaItemRemoveInfo.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.HennaData; +import com.l2jserver.gameserver.data.xml.impl.HennaData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.L2Henna; import com.l2jserver.gameserver.network.serverpackets.HennaItemRemoveInfo; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestMagicSkillUse.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestMagicSkillUse.java index 4b9b89d940..5ebc47c974 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestMagicSkillUse.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestMagicSkillUse.java @@ -20,8 +20,8 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; import com.l2jserver.gameserver.ai.CtrlIntention; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SkillTreesData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.effects.L2EffectType; import com.l2jserver.gameserver.model.skills.CommonSkill; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetGetItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetGetItem.java index 8ca79859a1..ccb91ec1a6 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetGetItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetGetItem.java @@ -63,7 +63,7 @@ public final class RequestPetGetItem extends L2GameClientPacket return; } - final L2PetInstance pet = (L2PetInstance) getClient().getActiveChar().getSummon(); + final L2PetInstance pet = (L2PetInstance) getClient().getActiveChar().getPet(); if (pet.isDead() || pet.isOutOfControl()) { sendPacket(ActionFailed.STATIC_PACKET); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetUseItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetUseItem.java index da50137ff4..5d75d0af73 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetUseItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetUseItem.java @@ -56,7 +56,7 @@ public final class RequestPetUseItem extends L2GameClientPacket return; } - final L2PetInstance pet = (L2PetInstance) activeChar.getSummon(); + final L2PetInstance pet = (L2PetInstance) activeChar.getPet(); final L2ItemInstance item = pet.getInventory().getItemByObjectId(_objectId); if (item == null) { diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetition.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetition.java index 54de8fbdca..dc66ec5d2f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetition.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetition.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.instancemanager.PetitionManager; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; @@ -58,7 +58,7 @@ public final class RequestPetition extends L2GameClientPacket return; } - if (!AdminTable.getInstance().isGmOnline(false)) + if (!AdminData.getInstance().isGmOnline(false)) { activeChar.sendPacket(SystemMessageId.THERE_ARE_NO_GMS_CURRENTLY_VISIBLE_IN_THE_PUBLIC_LIST_AS_THEY_MAY_BE_PERFORMING_OTHER_FUNCTIONS_AT_THE_MOMENT); return; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetitionCancel.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetitionCancel.java index 3d5f3407f4..bbdd6ec1b0 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetitionCancel.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPetitionCancel.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.instancemanager.PetitionManager; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; @@ -81,7 +81,7 @@ public final class RequestPetitionCancel extends L2GameClientPacket // Notify all GMs that the player's pending petition has been cancelled. String msgContent = activeChar.getName() + " has canceled a pending petition."; - AdminTable.getInstance().broadcastToGMs(new CreatureSay(activeChar.getObjectId(), Say2.HERO_VOICE, "Petition System", msgContent)); + AdminData.getInstance().broadcastToGMs(new CreatureSay(activeChar.getObjectId(), Say2.HERO_VOICE, "Petition System", msgContent)); } else { diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeInfo.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeInfo.java index 0cb6d4cc06..4377cb5d52 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeInfo.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.network.clientpackets; import java.util.logging.Level; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.serverpackets.PledgeInfo; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeRecruitInfo.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeRecruitInfo.java index aca546c470..91391072d5 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeRecruitInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeRecruitInfo.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.serverpackets.ExPledgeRecruitInfo; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeWaitingApply.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeWaitingApply.java index c041580cb9..9d13373ec3 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeWaitingApply.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPledgeWaitingApply.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.enums.ClanEntryStatus; import com.l2jserver.gameserver.instancemanager.ClanEntryManager; import com.l2jserver.gameserver.model.L2Clan; @@ -81,10 +81,9 @@ public class RequestPledgeWaitingApply extends L2GameClientPacket } else { - SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_MAY_APPLY_FOR_ENTRY_AFTER_S1_MINUTE_S_DUE_TO_CANCELLING_YOUR_APPLICATION); + final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_MAY_APPLY_FOR_ENTRY_AFTER_S1_MINUTE_S_DUE_TO_CANCELLING_YOUR_APPLICATION); sm.addLong(ClanEntryManager.getInstance().getPlayerLockTime(activeChar.getObjectId())); activeChar.sendPacket(sm); - System.out.println("fuck me ?"); } } diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPreviewItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPreviewItem.java index 3fcdc9e9ec..30c7307d99 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPreviewItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPreviewItem.java @@ -25,7 +25,7 @@ import javolution.util.FastMap; import com.l2jserver.Config; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.BuyListData; +import com.l2jserver.gameserver.data.xml.impl.BuyListData; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2MerchantInstance; @@ -161,8 +161,7 @@ public final class RequestPreviewItem extends L2GameClientPacket final L2BuyList buyList = BuyListData.getInstance().getBuyList(_listId); if (buyList == null) { - Util.handleIllegalPlayerAction(activeChar, "Warning!! Character " + activeChar.getName() + " of account " + activeChar - .getAccountName() + " sent a false BuyList list_id " + _listId, Config.DEFAULT_PUNISH); + Util.handleIllegalPlayerAction(activeChar, "Warning!! Character " + activeChar.getName() + " of account " + activeChar.getAccountName() + " sent a false BuyList list_id " + _listId, Config.DEFAULT_PUNISH); return; } diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreBuy.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreBuy.java index 5bd6c16616..e29ffc9a50 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreBuy.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreBuy.java @@ -22,7 +22,7 @@ import static com.l2jserver.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE; import javolution.util.FastSet; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.OfflineTradersTable; +import com.l2jserver.gameserver.data.sql.impl.OfflineTradersTable; import com.l2jserver.gameserver.enums.PrivateStoreType; import com.l2jserver.gameserver.model.ItemRequest; import com.l2jserver.gameserver.model.L2Object; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreSell.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreSell.java index 331b050be6..1949aab810 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreSell.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestPrivateStoreSell.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.network.clientpackets; import static com.l2jserver.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.OfflineTradersTable; +import com.l2jserver.gameserver.data.sql.impl.OfflineTradersTable; import com.l2jserver.gameserver.enums.PrivateStoreType; import com.l2jserver.gameserver.model.ItemRequest; import com.l2jserver.gameserver.model.L2World; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeBookDestroy.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeBookDestroy.java index 8360c0f72c..533d2ac86f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeBookDestroy.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeBookDestroy.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.RecipeData; +import com.l2jserver.gameserver.data.xml.impl.RecipeData; import com.l2jserver.gameserver.model.L2RecipeList; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.serverpackets.RecipeBookItemList; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopListSet.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopListSet.java index 97443b9aa5..6dca79bc92 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopListSet.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRecipeShopListSet.java @@ -24,7 +24,7 @@ import java.util.Arrays; import java.util.List; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.RecipeData; +import com.l2jserver.gameserver.data.xml.impl.RecipeData; import com.l2jserver.gameserver.enums.PrivateStoreType; import com.l2jserver.gameserver.model.L2ManufactureItem; import com.l2jserver.gameserver.model.L2RecipeList; @@ -101,12 +101,6 @@ public final class RequestRecipeShopListSet extends L2GameClientPacket return; } - if (!player.canOpenPrivateStore()) - { - player.sendPacket(ActionFailed.STATIC_PACKET); - return; - } - List dwarfRecipes = Arrays.asList(player.getDwarvenRecipeBook()); List commonRecipes = Arrays.asList(player.getCommonRecipeBook()); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRefundItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRefundItem.java index 50e36ba134..39e7e4d419 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRefundItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRefundItem.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.network.clientpackets; import static com.l2jserver.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.BuyListData; +import com.l2jserver.gameserver.data.xml.impl.BuyListData; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2MerchantInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRegistBeauty.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRegistBeauty.java index 856b0059a4..9377c29027 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRegistBeauty.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestRegistBeauty.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.BeautyShopData; +import com.l2jserver.gameserver.data.xml.impl.BeautyShopData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.beautyshop.BeautyData; import com.l2jserver.gameserver.model.beautyshop.BeautyItem; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplyStartPledgeWar.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplyStartPledgeWar.java index 85578cee62..bb758c415a 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplyStartPledgeWar.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplyStartPledgeWar.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplyStopPledgeWar.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplyStopPledgeWar.java index d66e4b88b5..536ba319b3 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplyStopPledgeWar.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplyStopPledgeWar.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplySurrenderPledgeWar.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplySurrenderPledgeWar.java index e1f3840260..8646b40494 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplySurrenderPledgeWar.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestReplySurrenderPledgeWar.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; public final class RequestReplySurrenderPledgeWar extends L2GameClientPacket diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestResetAbilityPoint.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestResetAbilityPoint.java index a1dcc33c80..ad71637b45 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestResetAbilityPoint.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestResetAbilityPoint.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.enums.PrivateStoreType; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSaveKeyMapping.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSaveKeyMapping.java index 27f3c33708..2de86cfaa6 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSaveKeyMapping.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSaveKeyMapping.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.Map; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.UIData; +import com.l2jserver.gameserver.data.xml.impl.UIData; import com.l2jserver.gameserver.model.ActionKey; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.L2GameClient.GameClientState; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSellItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSellItem.java index 77d18fc9e1..d8cde24b9d 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSellItem.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSellItem.java @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.List; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.BuyListData; +import com.l2jserver.gameserver.data.xml.impl.BuyListData; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2MerchantInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSendPost.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSendPost.java index 707d9dba61..0d52f60a93 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSendPost.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSendPost.java @@ -22,8 +22,8 @@ import static com.l2jserver.gameserver.model.itemcontainer.Inventory.ADENA_ID; import static com.l2jserver.gameserver.model.itemcontainer.Inventory.MAX_ADENA; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.enums.PrivateStoreType; import com.l2jserver.gameserver.instancemanager.MailManager; import com.l2jserver.gameserver.model.BlockList; @@ -213,7 +213,7 @@ public final class RequestSendPost extends L2GameClientPacket } final int level = CharNameTable.getInstance().getAccessLevelById(receiverId); - final L2AccessLevel accessLevel = AdminTable.getInstance().getAccessLevel(level); + final L2AccessLevel accessLevel = AdminData.getInstance().getAccessLevel(level); if (accessLevel.isGm() && !activeChar.getAccessLevel().isGm()) { diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSetAllyCrest.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSetAllyCrest.java index a646bca722..3fa8c5633f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSetAllyCrest.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSetAllyCrest.java @@ -18,8 +18,8 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.CrestTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.CrestTable; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2Crest; import com.l2jserver.gameserver.model.L2Crest.CrestType; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSetPledgeCrest.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSetPledgeCrest.java index 3ba6d6080b..ab9b3f7e00 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSetPledgeCrest.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSetPledgeCrest.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.CrestTable; +import com.l2jserver.gameserver.data.sql.impl.CrestTable; import com.l2jserver.gameserver.model.ClanPrivilege; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2Crest; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestShowResetShopList.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestShowResetShopList.java index 865450f0a4..f34a57f917 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestShowResetShopList.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestShowResetShopList.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.BeautyShopData; +import com.l2jserver.gameserver.data.xml.impl.BeautyShopData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.beautyshop.BeautyData; import com.l2jserver.gameserver.model.beautyshop.BeautyItem; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestStartPledgeWar.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestStartPledgeWar.java index f15dd7f128..029fd1208e 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestStartPledgeWar.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestStartPledgeWar.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.ClanPrivilege; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestStopPledgeWar.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestStopPledgeWar.java index e9feb3a96f..03791466de 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestStopPledgeWar.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestStopPledgeWar.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.ClanPrivilege; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2ClanMember; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSurrenderPledgeWar.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSurrenderPledgeWar.java index 304545c002..56bcca6fbd 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSurrenderPledgeWar.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/RequestSurrenderPledgeWar.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/SendBypassBuildCmd.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/SendBypassBuildCmd.java index 9db1706b2a..27279425e2 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/SendBypassBuildCmd.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/SendBypassBuildCmd.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AdminTable; +import com.l2jserver.gameserver.data.xml.impl.AdminData; import com.l2jserver.gameserver.handler.AdminCommandHandler; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -72,7 +72,7 @@ public final class SendBypassBuildCmd extends L2GameClientPacket return; } - if (!AdminTable.getInstance().hasAccess(command, activeChar.getAccessLevel())) + if (!AdminData.getInstance().hasAccess(command, activeChar.getAccessLevel())) { activeChar.sendMessage("You don't have the access right to use this command!"); _log.warning("Character " + activeChar.getName() + " tryed to use admin command " + command + ", but have no access to it!"); diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/ValidatePosition.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/ValidatePosition.java index 880973ccca..95f88052e6 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/ValidatePosition.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/ValidatePosition.java @@ -19,7 +19,6 @@ package com.l2jserver.gameserver.network.clientpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.geoeditorcon.GeoEditorListener; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.zone.ZoneId; @@ -130,14 +129,6 @@ public class ValidatePosition extends L2GameClientPacket // party.broadcastToPartyMembers(activeChar, new PartyMemberPosition(activeChar)); // } - if (Config.ACCEPT_GEOEDITOR_CONN) - { - if ((GeoEditorListener.getInstance().getThread() != null) && GeoEditorListener.getInstance().getThread().isWorking() && GeoEditorListener.getInstance().getThread().isSend(activeChar)) - { - GeoEditorListener.getInstance().getThread().sendGmPosition(_x, _y, (short) _z); - } - } - // Don't allow flying transformations outside gracia area! if (activeChar.isFlyingMounted() && (_x > L2World.GRACIA_MAX_X)) { @@ -187,7 +178,7 @@ public class ValidatePosition extends L2GameClientPacket // when too far from server calculated true coordinate. // Due to geodata/zone errors, some Z axis checks are made. (maybe a temporary solution) // Important: this code part must work together with L2Character.updatePosition - if ((Config.GEODATA > 0) && ((diffSq > 250000) || (Math.abs(dz) > 200))) + if ((diffSq > 250000) || (Math.abs(dz) > 200)) { // if ((_z - activeChar.getClientZ()) < 200 && Math.abs(activeChar.getLastServerPosition().getZ()-realZ) > 70) diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/crystalization/RequestCrystallizeEstimate.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/crystalization/RequestCrystallizeEstimate.java index ef689d787e..61d4f8c2ce 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/crystalization/RequestCrystallizeEstimate.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/crystalization/RequestCrystallizeEstimate.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.List; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ItemCrystalizationData; +import com.l2jserver.gameserver.data.xml.impl.ItemCrystalizationData; import com.l2jserver.gameserver.enums.PrivateStoreType; import com.l2jserver.gameserver.model.CrystalizationData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendDel.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendDel.java index 743ba0e54e..31fc5566e8 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendDel.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendDel.java @@ -23,7 +23,7 @@ import java.sql.PreparedStatement; import java.util.logging.Level; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendList.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendList.java index 713d0859c2..91792dbd04 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendList.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/friend/RequestFriendList.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.clientpackets.friend; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.SystemMessageId; diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/RequestMentorCancel.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/RequestMentorCancel.java index 1b5b852205..df113737ff 100644 --- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/RequestMentorCancel.java +++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/mentoring/RequestMentorCancel.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.clientpackets.mentoring; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.instancemanager.MentorManager; import com.l2jserver.gameserver.model.L2Mentee; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AbstractMessagePacket.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AbstractMessagePacket.java index 57a25371fa..4afa9e9ec6 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AbstractMessagePacket.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AbstractMessagePacket.java @@ -23,9 +23,9 @@ import java.util.Arrays; import java.util.logging.Level; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.DoorTable; +import com.l2jserver.gameserver.data.xml.impl.DoorData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.datatables.ItemTable; -import com.l2jserver.gameserver.datatables.NpcData; import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.instancemanager.InstanceManager; @@ -607,7 +607,7 @@ public abstract class AbstractMessagePacket> case TYPE_DOOR_NAME: { - final L2DoorInstance door = DoorTable.getInstance().getDoor(param.getIntValue()); + final L2DoorInstance door = DoorData.getInstance().getDoor(param.getIntValue()); params[i] = door == null ? "Unknown" : door.getName(); break; } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java index 5fa6c44937..6e180aab62 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java @@ -19,9 +19,7 @@ package com.l2jserver.gameserver.network.serverpackets; import com.l2jserver.gameserver.model.actor.L2Character; -import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2TrapInstance; -import com.l2jserver.gameserver.model.zone.ZoneId; public abstract class AbstractNpcInfo extends L2GameServerPacket { @@ -142,98 +140,4 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket writeD(0x00); } } - - /** - * Packet for summons. - */ - public static class SummonInfo extends AbstractNpcInfo - { - private final L2Summon _summon; - private final int _form; - private final int _val; - - public SummonInfo(L2Summon cha, L2Character attacker, int val) - { - super(cha); - _summon = cha; - _val = val; - _form = cha.getFormId(); - - _isAttackable = cha.isAutoAttackable(attacker); - _rhand = cha.getWeapon(); - _lhand = 0; - _chest = cha.getArmor(); - _enchantEffect = cha.getTemplate().getWeaponEnchant(); - _name = cha.getName(); - _title = (cha.getOwner() != null) && cha.getOwner().isOnline() ? cha.getOwner().getName() : ""; - _idTemplate = cha.getTemplate().getDisplayId(); - _collisionHeight = cha.getTemplate().getfCollisionHeight(); - _collisionRadius = cha.getTemplate().getfCollisionRadius(); - setInvisible(cha.isInvisible()); - } - - @Override - protected void writeImpl() - { - writeC(0x0c); - writeD(_summon.getObjectId()); - writeD(_idTemplate + 1000000); // npctype id - writeD(_isAttackable ? 1 : 0); - writeD(_x); - writeD(_y); - writeD(_z); - writeD(_heading); - writeD(0x00); - writeD(_mAtkSpd); - writeD(_pAtkSpd); - writeD(_runSpd); - writeD(_walkSpd); - writeD(_swimRunSpd); - writeD(_swimWalkSpd); - writeD(_flyRunSpd); - writeD(_flyWalkSpd); - writeD(_flyRunSpd); - writeD(_flyWalkSpd); - writeF(_moveMultiplier); - writeF(_summon.getAttackSpeedMultiplier()); - writeF(_collisionRadius); - writeF(_collisionHeight); - writeD(_rhand); // right hand weapon - writeD(_chest); - writeD(_lhand); // left hand weapon - writeC(0x01); // name above char 1=true ... ?? - writeC(0x01); // always running 1=running 0=walking - writeC(_summon.isInCombat() ? 1 : 0); - writeC(_summon.isAlikeDead() ? 1 : 0); - writeC(_val); // invisible ?? 0=false 1=true 2=summoned (only works if model has a summon animation) - writeD(-1); // High Five NPCString ID - writeS(_name); - writeD(-1); // High Five NPCString ID - writeS(_title); - writeD(0x01);// Title color 0=client default - - writeD(_summon.getPvpFlag()); - writeD(_summon.getKarma()); - - writeD(0); // was AVE and was adding stealth - - writeD(0x00); // clan id - writeD(0x00); // crest id - writeD(0x00); // C2 - writeD(0x00); // C2 - writeC(_summon.isInsideZone(ZoneId.WATER) ? 1 : _summon.isFlying() ? 2 : 0); // C2 - - writeC(_summon.getTeam().getId()); - - writeF(_collisionRadius); - writeF(_collisionHeight); - writeD(_enchantEffect); // C4 - writeD(0x00); // C6 - writeD(0x00); - writeD(_form); // CT1.5 Pet form and skills - writeC(0x01); - writeC(0x01); - // writeD(_summon.getAbnormalVisualEffectSpecial()); - } - } } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AcquireSkillList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AcquireSkillList.java index 1ca0e656f4..565bae414f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AcquireSkillList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AcquireSkillList.java @@ -19,22 +19,26 @@ package com.l2jserver.gameserver.network.serverpackets; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; -import com.l2jserver.gameserver.datatables.SkillData; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.ItemHolder; +import com.l2jserver.gameserver.model.skills.Skill; /** * @author Sdw */ public class AcquireSkillList extends L2GameServerPacket { + final L2PcInstance _activeChar; final List _learnable; public AcquireSkillList(L2PcInstance activeChar) { + _activeChar = activeChar; _learnable = SkillTreesData.getInstance().getAvailableSkills(activeChar, activeChar.getClassId(), false, false); _learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(activeChar, activeChar.getClassId(), false, false)); } @@ -58,11 +62,13 @@ public class AcquireSkillList extends L2GameServerPacket writeQ(item.getCount()); } - writeC(skill.getRemoveSkills().size()); - for (int skillId : skill.getRemoveSkills()) + final List skillRem = skill.getRemoveSkills().stream().map(_activeChar::getKnownSkill).filter(Objects::nonNull).collect(Collectors.toList()); + + writeC(skillRem.size()); + for (Skill skillRemove : skillRem) { - writeD(skillId); - writeH(SkillData.getInstance().getMaxLevel(skillId)); + writeD(skillRemove.getId()); + writeH(skillRemove.getLevel()); } } } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AgitDecoInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AgitDecoInfo.java index 7e84110ae2..dc00589743 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AgitDecoInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AgitDecoInfo.java @@ -97,8 +97,7 @@ public class AgitDecoInfo extends L2GameServerPacket { writeC(0); } - else if (((_clanHall.getGrade() == 0) && (function.getLvl() < 25)) || ((_clanHall.getGrade() == 1) && (function.getLvl() < 30)) || ((_clanHall.getGrade() == 2) && (function - .getLvl() < 40)) || ((_clanHall.getGrade() == 3) && (function.getLvl() < 50))) + else if (((_clanHall.getGrade() == 0) && (function.getLvl() < 25)) || ((_clanHall.getGrade() == 1) && (function.getLvl() < 30)) || ((_clanHall.getGrade() == 2) && (function.getLvl() < 40)) || ((_clanHall.getGrade() == 3) && (function.getLvl() < 50))) { writeC(1); } @@ -156,8 +155,7 @@ public class AgitDecoInfo extends L2GameServerPacket writeC(0); writeC(0); } - else if (((_clanHall.getGrade() == 0) && (function.getLvl() < 2)) || ((_clanHall.getGrade() == 1) && (function.getLvl() < 4)) || ((_clanHall.getGrade() == 2) && (function - .getLvl() < 5)) || ((_clanHall.getGrade() == 3) && (function.getLvl() < 8))) + else if (((_clanHall.getGrade() == 0) && (function.getLvl() < 2)) || ((_clanHall.getGrade() == 1) && (function.getLvl() < 4)) || ((_clanHall.getGrade() == 2) && (function.getLvl() < 5)) || ((_clanHall.getGrade() == 3) && (function.getLvl() < 8))) { writeC(1); writeC(1); diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AllianceInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AllianceInfo.java index 33643d8710..27e6322da7 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AllianceInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AllianceInfo.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.network.serverpackets; import java.util.Collection; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.ClanInfo; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.network.clientpackets.RequestAllyInfo; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AllyCrest.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AllyCrest.java index a91e49b3c2..ad1df46f4c 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/AllyCrest.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/AllyCrest.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.serverpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.CrestTable; +import com.l2jserver.gameserver.data.sql.impl.CrestTable; import com.l2jserver.gameserver.model.L2Crest; public class AllyCrest extends L2GameServerPacket diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/BlockListPacket.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/BlockListPacket.java index f38072e141..7b03e04ab0 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/BlockListPacket.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/BlockListPacket.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.network.serverpackets; import java.util.List; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; /** * @author Sdw diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/CharSelectionInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/CharSelectionInfo.java index 0c6678da14..72ac0a02db 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/CharSelectionInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/CharSelectionInfo.java @@ -1,18 +1,18 @@ /* * Copyright (C) 2004-2015 L2J Server - * + * * This file is part of L2J Server. - * + * * L2J Server is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * L2J Server is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -29,8 +29,8 @@ import javolution.util.FastList; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.ClanTable; -import com.l2jserver.gameserver.datatables.ExperienceTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; import com.l2jserver.gameserver.model.CharSelectInfoPackage; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.entity.Hero; @@ -131,7 +131,7 @@ public class CharSelectionInfo extends L2GameServerPacket writeQ(charInfoPackage.getSp()); writeQ(charInfoPackage.getExp()); - writeF((float) (charInfoPackage.getExp() - ExperienceTable.getInstance().getExpForLevel(charInfoPackage.getLevel())) / (ExperienceTable.getInstance().getExpForLevel(charInfoPackage.getLevel() + 1) - ExperienceTable.getInstance().getExpForLevel(charInfoPackage.getLevel()))); // High Five + writeF((float) (charInfoPackage.getExp() - ExperienceData.getInstance().getExpForLevel(charInfoPackage.getLevel())) / (ExperienceData.getInstance().getExpForLevel(charInfoPackage.getLevel() + 1) - ExperienceData.getInstance().getExpForLevel(charInfoPackage.getLevel()))); // High Five writeD(charInfoPackage.getLevel()); writeD(charInfoPackage.getKarma()); diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/EnchantResult.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/EnchantResult.java index ba5f666914..dd4482ccdb 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/EnchantResult.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/EnchantResult.java @@ -50,7 +50,7 @@ public class EnchantResult extends L2GameServerPacket public EnchantResult(int result, L2ItemInstance item) { - this(result, 0, 0, 0, item.getEnchantOptions()); + this(result, 0, 0, item.getEnchantLevel(), item.getEnchantOptions()); } @Override diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/EquipUpdate.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/EquipUpdate.java deleted file mode 100644 index ec7cc0986c..0000000000 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/EquipUpdate.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2004-2015 L2J Server - * - * This file is part of L2J Server. - * - * L2J Server is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * L2J Server is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jserver.gameserver.network.serverpackets; - -import com.l2jserver.gameserver.model.items.L2Item; -import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; - -public final class EquipUpdate extends L2GameServerPacket -{ - private final L2ItemInstance _item; - private final int _change; - - public EquipUpdate(L2ItemInstance item, int change) - { - _item = item; - _change = change; - } - - @Override - protected final void writeImpl() - { - int bodypart = 0; - writeC(0x4b); - writeD(_change); - writeD(_item.getObjectId()); - switch (_item.getItem().getBodyPart()) - { - case L2Item.SLOT_L_EAR: - bodypart = 0x01; - break; - case L2Item.SLOT_R_EAR: - bodypart = 0x02; - break; - case L2Item.SLOT_NECK: - bodypart = 0x03; - break; - case L2Item.SLOT_R_FINGER: - bodypart = 0x04; - break; - case L2Item.SLOT_L_FINGER: - bodypart = 0x05; - break; - case L2Item.SLOT_HEAD: - bodypart = 0x06; - break; - case L2Item.SLOT_R_HAND: - bodypart = 0x07; - break; - case L2Item.SLOT_L_HAND: - bodypart = 0x08; - break; - case L2Item.SLOT_GLOVES: - bodypart = 0x09; - break; - case L2Item.SLOT_CHEST: - bodypart = 0x0a; - break; - case L2Item.SLOT_LEGS: - bodypart = 0x0b; - break; - case L2Item.SLOT_FEET: - bodypart = 0x0c; - break; - case L2Item.SLOT_BACK: - bodypart = 0x0d; - break; - case L2Item.SLOT_LR_HAND: - bodypart = 0x0e; - break; - case L2Item.SLOT_HAIR: - bodypart = 0x0f; - break; - case L2Item.SLOT_BELT: - bodypart = 0x10; - break; - } - writeD(bodypart); - } -} diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAcquireAPSkillList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAcquireAPSkillList.java index 97beb61013..ccaebc828d 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAcquireAPSkillList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAcquireAPSkillList.java @@ -22,8 +22,8 @@ import java.util.ArrayList; import java.util.List; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.AbilityPointsData; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.AbilityPointsData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.skills.Skill; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAcquireSkillInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAcquireSkillInfo.java index fa44fc14c2..a87d729816 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAcquireSkillInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAcquireSkillInfo.java @@ -18,13 +18,14 @@ */ package com.l2jserver.gameserver.network.serverpackets; -import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; -import com.l2jserver.gameserver.datatables.SkillData; import com.l2jserver.gameserver.model.L2SkillLearn; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.ItemHolder; +import com.l2jserver.gameserver.model.skills.Skill; /** * @author UnAfraid @@ -35,8 +36,8 @@ public class ExAcquireSkillInfo extends L2GameServerPacket private final int _level; private final int _spCost; private final int _minLevel; - private final List _itemReq = new ArrayList<>(); - private final List _skillRem = new ArrayList<>(); + private final List _itemReq; + private final List _skillRem; /** * Special constructor for Alternate Skill Learning system.
@@ -51,8 +52,8 @@ public class ExAcquireSkillInfo extends L2GameServerPacket _level = skillLearn.getSkillLevel(); _spCost = sp; _minLevel = skillLearn.getGetLevel(); - _itemReq.addAll(skillLearn.getRequiredItems()); - _skillRem.addAll(skillLearn.getRemoveSkills()); + _itemReq = skillLearn.getRequiredItems(); + _skillRem = skillLearn.getRemoveSkills().stream().map(player::getKnownSkill).filter(Objects::nonNull).collect(Collectors.toList()); } @Override @@ -65,7 +66,7 @@ public class ExAcquireSkillInfo extends L2GameServerPacket writeD(_level); writeQ(_spCost); writeH(_minLevel); - writeH(0x00); // TODO: Find me ! + writeH(0x00); // Dual Class Level Required writeD(_itemReq.size()); for (ItemHolder holder : _itemReq) { @@ -74,10 +75,10 @@ public class ExAcquireSkillInfo extends L2GameServerPacket } writeD(_skillRem.size()); - for (int skillId : _skillRem) + for (Skill skill : _skillRem) { - writeD(skillId); - writeD(SkillData.getInstance().getMaxLevel(skillId)); + writeD(skill.getId()); + writeD(skill.getLevel()); } } } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAlchemySkillList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAlchemySkillList.java index bf02b7b812..badc16ef0d 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAlchemySkillList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExAlchemySkillList.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.network.serverpackets; import java.util.ArrayList; import java.util.List; -import com.l2jserver.gameserver.datatables.SkillTreesData; +import com.l2jserver.gameserver.data.xml.impl.SkillTreesData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.skills.Skill; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExBeautyItemList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExBeautyItemList.java index bc2b85bfb8..9f61a4b9ab 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExBeautyItemList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExBeautyItemList.java @@ -23,7 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import com.l2jserver.gameserver.datatables.BeautyShopData; +import com.l2jserver.gameserver.data.xml.impl.BeautyShopData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.beautyshop.BeautyData; import com.l2jserver.gameserver.model.beautyshop.BeautyItem; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfo.java index 9895701c85..6f45272c70 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfo.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.network.serverpackets; import javolution.util.FastList; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; import com.l2jserver.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder; import com.l2jserver.gameserver.model.L2EnchantSkillLearn; @@ -98,4 +98,4 @@ public final class ExEnchantSkillInfo extends L2GameServerPacket writeD(level); } } -} \ No newline at end of file +} diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfoDetail.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfoDetail.java index 4223a3b73a..5f44006949 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfoDetail.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExEnchantSkillInfoDetail.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.serverpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData; +import com.l2jserver.gameserver.data.xml.impl.EnchantSkillGroupsData; import com.l2jserver.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder; import com.l2jserver.gameserver.model.L2EnchantSkillLearn; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExPetInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExPetInfo.java new file mode 100644 index 0000000000..a3a342bc11 --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExPetInfo.java @@ -0,0 +1,391 @@ +/* + * Copyright (C) 2004-2015 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jserver.gameserver.network.serverpackets; + +import java.util.Set; + +import com.l2jserver.gameserver.enums.NpcInfoType; +import com.l2jserver.gameserver.enums.Team; +import com.l2jserver.gameserver.model.actor.L2Summon; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect; +import com.l2jserver.gameserver.model.zone.ZoneId; + +/** + * @author Sdw + */ +public class ExPetInfo extends AbstractMaskPacket +{ + private final L2Summon _summon; + private final L2PcInstance _attacker; + private final int _val; + private final byte[] _masks = new byte[] + { + (byte) 0x00, + (byte) 0x0C, + (byte) 0x0C, + (byte) 0x00, + (byte) 0x00 + }; + + private int _initSize = 0; + private int _blockSize = 0; + + private int _clanCrest = 0; + private int _clanLargeCrest = 0; + private int _allyCrest = 0; + private int _allyId = 0; + private int _clanId = 0; + private int _statusMask = 0; + private final String _title; + private final Set _abnormalVisualEffects; + + public ExPetInfo(L2Summon summon, L2PcInstance attacker, int val) + { + _summon = summon; + _attacker = attacker; + _title = (summon.getOwner() != null) && summon.getOwner().isOnline() ? summon.getOwner().getName() : ""; + _val = val; + _abnormalVisualEffects = summon.getCurrentAbnormalVisualEffects(); + + if (summon.getTemplate().getDisplayId() != summon.getTemplate().getId()) + { + _masks[2] |= 0x10; + addComponentType(NpcInfoType.NAME); + } + + addComponentType(NpcInfoType.ATTACKABLE, NpcInfoType.UNKNOWN1, NpcInfoType.TITLE, NpcInfoType.ID, NpcInfoType.POSITION, NpcInfoType.ALIVE, NpcInfoType.RUNNING); + + if (summon.getHeading() > 0) + { + addComponentType(NpcInfoType.HEADING); + } + + if ((summon.getStat().getPAtkSpd() > 0) || (summon.getStat().getMAtkSpd() > 0)) + { + addComponentType(NpcInfoType.ATK_CAST_SPEED); + } + + if (summon.getRunSpeed() > 0) + { + addComponentType(NpcInfoType.SPEED_MULTIPLIER); + } + + if ((summon.getWeapon() > 0) || (summon.getArmor() > 0)) + { + addComponentType(NpcInfoType.EQUIPPED); + } + + if (summon.getTeam() != Team.NONE) + { + addComponentType(NpcInfoType.TEAM); + } + + if (summon.isInsideZone(ZoneId.WATER) || summon.isFlying()) + { + addComponentType(NpcInfoType.SWIM_OR_FLY); + } + + if (summon.isFlying()) + { + addComponentType(NpcInfoType.FLYING); + } + + if (summon.getMaxHp() > 0) + { + addComponentType(NpcInfoType.MAX_HP); + } + + if (summon.getMaxMp() > 0) + { + addComponentType(NpcInfoType.MAX_MP); + } + + if (summon.getCurrentHp() <= summon.getMaxHp()) + { + addComponentType(NpcInfoType.CURRENT_HP); + } + + if (summon.getCurrentMp() <= summon.getMaxMp()) + { + addComponentType(NpcInfoType.CURRENT_MP); + } + + if (!_abnormalVisualEffects.isEmpty()) + { + addComponentType(NpcInfoType.ABNORMALS); + } + + if (summon.getTemplate().getWeaponEnchant() > 0) + { + addComponentType(NpcInfoType.ENCHANT); + } + + if ((summon.getTransformation() != null) && (summon.getTransformation().getId() > 0)) + { + addComponentType(NpcInfoType.TRANSFORMATION); + } + + if (summon.getOwner().getClan() != null) + { + _clanId = summon.getOwner().getClanId(); + _clanCrest = summon.getOwner().getClanCrestId(); + _clanLargeCrest = summon.getOwner().getClanCrestLargeId(); + _allyCrest = summon.getOwner().getAllyId(); + _allyId = summon.getOwner().getAllyCrestId(); + + addComponentType(NpcInfoType.CLAN); + } + + addComponentType(NpcInfoType.UNKNOWN8); + + // TODO: Confirm me + if (summon.isInCombat()) + { + _statusMask |= 0x01; + } + if (summon.isDead()) + { + _statusMask |= 0x02; + } + if (summon.isTargetable()) + { + _statusMask |= 0x04; + } + + _statusMask |= 0x08; + + if (_statusMask != 0) + { + addComponentType(NpcInfoType.VISUAL_STATE); + } + } + + @Override + protected byte[] getMasks() + { + return _masks; + } + + @Override + protected void onNewMaskAdded(NpcInfoType component) + { + calcBlockSize(_summon, component); + } + + private void calcBlockSize(L2Summon summon, NpcInfoType type) + { + switch (type) + { + case ATTACKABLE: + case UNKNOWN1: + { + _initSize += type.getBlockLength(); + break; + } + case TITLE: + { + _initSize += type.getBlockLength() + (_title.length() * 2); + break; + } + case NAME: + { + _blockSize += type.getBlockLength() + (summon.getName().length() * 2); + break; + } + default: + { + _blockSize += type.getBlockLength(); + break; + } + } + } + + @Override + protected void writeImpl() + { + writeC(0xFE); + writeH(0x15E); + writeD(_summon.getObjectId()); + writeC(_val); // // 0=teleported 1=default 2=summoned + writeH(37); // mask_bits_37 + writeB(_masks); + + // Block 1 + writeC(_initSize); + + if (containsMask(NpcInfoType.ATTACKABLE)) + { + writeC(_summon.isAutoAttackable(_attacker) ? 0x01 : 0x00); + } + if (containsMask(NpcInfoType.UNKNOWN1)) + { + writeD(0x00); // unknown + } + if (containsMask(NpcInfoType.TITLE)) + { + writeS(_title); + } + + // Block 2 + writeH(_blockSize); + if (containsMask(NpcInfoType.ID)) + { + writeD(_summon.getTemplate().getDisplayId() + 1000000); + } + if (containsMask(NpcInfoType.POSITION)) + { + writeD(_summon.getX()); + writeD(_summon.getY()); + writeD(_summon.getZ()); + } + if (containsMask(NpcInfoType.HEADING)) + { + writeD(_summon.getHeading()); + } + if (containsMask(NpcInfoType.UNKNOWN2)) + { + writeD(0x00); // Unknown + } + if (containsMask(NpcInfoType.ATK_CAST_SPEED)) + { + writeD(_summon.getPAtkSpd()); + writeD(_summon.getMAtkSpd()); + } + if (containsMask(NpcInfoType.SPEED_MULTIPLIER)) + { + _buf.putFloat((float) _summon.getStat().getMovementSpeedMultiplier()); + _buf.putFloat(_summon.getStat().getAttackSpeedMultiplier()); + } + if (containsMask(NpcInfoType.EQUIPPED)) + { + writeD(_summon.getWeapon()); + writeD(_summon.getArmor()); // Armor id? + writeD(0x00); + } + if (containsMask(NpcInfoType.ALIVE)) + { + writeC(_summon.isDead() ? 0x00 : 0x01); + } + if (containsMask(NpcInfoType.RUNNING)) + { + writeC(_summon.isRunning() ? 0x01 : 0x00); + } + if (containsMask(NpcInfoType.SWIM_OR_FLY)) + { + writeC(_summon.isInsideZone(ZoneId.WATER) ? 0x01 : _summon.isFlying() ? 0x02 : 0x00); + } + if (containsMask(NpcInfoType.TEAM)) + { + writeC(_summon.getTeam().getId()); + } + if (containsMask(NpcInfoType.ENCHANT)) + { + writeD(_summon.getTemplate().getWeaponEnchant()); + } + if (containsMask(NpcInfoType.FLYING)) + { + writeD(_summon.isFlying() ? 0x01 : 00); + } + if (containsMask(NpcInfoType.CLONE)) + { + writeD(0x00); // Player ObjectId with Decoy + } + if (containsMask(NpcInfoType.UNKNOWN8)) + { + // No visual effect + writeD(0x00); // Unknown + } + if (containsMask(NpcInfoType.DISPLAY_EFFECT)) + { + writeD(0x00); + } + if (containsMask(NpcInfoType.TRANSFORMATION)) + { + writeD(0x00); // Transformation ID + } + if (containsMask(NpcInfoType.CURRENT_HP)) + { + writeD((int) _summon.getCurrentHp()); + } + if (containsMask(NpcInfoType.CURRENT_MP)) + { + writeD((int) _summon.getCurrentMp()); + } + if (containsMask(NpcInfoType.MAX_HP)) + { + writeD(_summon.getMaxHp()); + } + if (containsMask(NpcInfoType.MAX_MP)) + { + writeD(_summon.getMaxMp()); + } + if (containsMask(NpcInfoType.UNKNOWN11)) + { + writeC(0x00); // 2 - do some animation on spawn + } + if (containsMask(NpcInfoType.UNKNOWN12)) + { + writeD(0x00); + writeD(0x00); + } + if (containsMask(NpcInfoType.NAME)) + { + writeS(_summon.getName()); + } + if (containsMask(NpcInfoType.NAME_NPCSTRINGID)) + { + writeD(-1); // NPCStringId for name + } + if (containsMask(NpcInfoType.TITLE_NPCSTRINGID)) + { + writeD(-1); // NPCStringId for title + } + if (containsMask(NpcInfoType.PVP_FLAG)) + { + writeC(_summon.getPvpFlag()); // PVP flag + } + if (containsMask(NpcInfoType.NAME_COLOR)) + { + writeD(0x00); // Name color + } + if (containsMask(NpcInfoType.CLAN)) + { + writeD(_clanId); + writeD(_clanCrest); + writeD(_clanLargeCrest); + writeD(_allyId); + writeD(_allyCrest); + } + + if (containsMask(NpcInfoType.VISUAL_STATE)) + { + writeC(_statusMask); + } + + if (containsMask(NpcInfoType.ABNORMALS)) + { + writeH(_abnormalVisualEffects.size()); + for (AbnormalVisualEffect abnormalVisualEffect : _abnormalVisualEffects) + { + writeH(abnormalVisualEffect.getClientId()); + } + } + } +} \ No newline at end of file diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExPledgeRecruitInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExPledgeRecruitInfo.java index e0df76f0cf..53204f944f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExPledgeRecruitInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExPledgeRecruitInfo.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.serverpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.instancemanager.ClanEntryManager; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.clan.entry.PledgeRecruitInfo; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExResponseBeautyList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExResponseBeautyList.java index 2912938e1a..4de5d6ebe4 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExResponseBeautyList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExResponseBeautyList.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.network.serverpackets; import java.util.Map; -import com.l2jserver.gameserver.datatables.BeautyShopData; +import com.l2jserver.gameserver.data.xml.impl.BeautyShopData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.beautyshop.BeautyItem; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExShowAgitInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExShowAgitInfo.java index 609a7d0824..bc1ac6293f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExShowAgitInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExShowAgitInfo.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.network.serverpackets; import java.util.Map; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.instancemanager.ClanHallManager; import com.l2jserver.gameserver.model.entity.clanhall.AuctionableHall; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExShowCastleInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExShowCastleInfo.java index e04683dbef..be241bdb8f 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExShowCastleInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/ExShowCastleInfo.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.network.serverpackets; import java.util.List; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.model.entity.Castle; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/FlyToLocation.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/FlyToLocation.java index 8ce765702b..e3e02984f1 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/FlyToLocation.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/FlyToLocation.java @@ -100,4 +100,4 @@ public final class FlyToLocation extends L2GameServerPacket writeD(_flyDelay); writeD(_animationSpeed); } -} \ No newline at end of file +} diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/GMViewCharacterInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/GMViewCharacterInfo.java index eac2973ee0..d8dd614b24 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/GMViewCharacterInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/GMViewCharacterInfo.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.serverpackets; -import com.l2jserver.gameserver.datatables.ExperienceTable; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; public class GMViewCharacterInfo extends L2GameServerPacket @@ -57,7 +57,7 @@ public class GMViewCharacterInfo extends L2GameServerPacket writeD(_activeChar.getClassId().getId()); writeD(_activeChar.getLevel()); writeQ(_activeChar.getExp()); - writeF((float) (_activeChar.getExp() - ExperienceTable.getInstance().getExpForLevel(_activeChar.getLevel())) / (ExperienceTable.getInstance().getExpForLevel(_activeChar.getLevel() + 1) - ExperienceTable.getInstance().getExpForLevel(_activeChar.getLevel()))); // High Five exp % + writeF((float) (_activeChar.getExp() - ExperienceData.getInstance().getExpForLevel(_activeChar.getLevel())) / (ExperienceData.getInstance().getExpForLevel(_activeChar.getLevel() + 1) - ExperienceData.getInstance().getExpForLevel(_activeChar.getLevel()))); // High Five exp % writeD(_activeChar.getSTR()); writeD(_activeChar.getDEX()); writeD(_activeChar.getCON()); diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/HennaEquipList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/HennaEquipList.java index ca94fa1256..cd57c549b5 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/HennaEquipList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/HennaEquipList.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.network.serverpackets; import java.util.List; -import com.l2jserver.gameserver.datatables.HennaData; +import com.l2jserver.gameserver.data.xml.impl.HennaData; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.L2Henna; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/KeyPacket.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/KeyPacket.java index ba6d0396f2..5235963617 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/KeyPacket.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/KeyPacket.java @@ -18,6 +18,8 @@ */ package com.l2jserver.gameserver.network.serverpackets; +import com.l2jserver.Config; + public final class KeyPacket extends L2GameServerPacket { private final byte[] _key; @@ -39,8 +41,9 @@ public final class KeyPacket extends L2GameServerPacket writeC(_key[i]); // key } writeD(0x01); - writeD(0x01); // server id + writeD(Config.SERVER_ID); // server id writeC(0x01); writeD(0x00); // obfuscation key + writeC((Config.SERVER_LIST_TYPE & 0x400) == 0x400 ? 0x01 : 0x00); // isClassic } } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/MultiSellList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/MultiSellList.java index fef662abe4..6cb2b47fa7 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/MultiSellList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/MultiSellList.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.serverpackets; -import static com.l2jserver.gameserver.datatables.MultisellData.PAGE_SIZE; +import static com.l2jserver.gameserver.data.xml.impl.MultisellData.PAGE_SIZE; import com.l2jserver.gameserver.model.multisell.Entry; import com.l2jserver.gameserver.model.multisell.Ingredient; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/NpcInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/NpcInfo.java index 22c573049e..baa9963c35 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/NpcInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/NpcInfo.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.network.serverpackets; import java.util.Set; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.enums.NpcInfoType; import com.l2jserver.gameserver.enums.Team; import com.l2jserver.gameserver.instancemanager.TownManager; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/NpcInfoAbnormalVisualEffect.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/NpcInfoAbnormalVisualEffect.java new file mode 100644 index 0000000000..093f122b6b --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/NpcInfoAbnormalVisualEffect.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2004-2015 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jserver.gameserver.network.serverpackets; + +import java.util.Set; + +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect; + +/** + * @author Sdw + */ +public class NpcInfoAbnormalVisualEffect extends L2GameServerPacket +{ + private final L2Npc _npc; + + public NpcInfoAbnormalVisualEffect(L2Npc npc) + { + _npc = npc; + } + + @Override + protected final void writeImpl() + { + writeC(0x4B); + + writeD(_npc.getObjectId()); + writeD(_npc.getTransformation() == null ? 0 : _npc.getTransformation().getId()); + + final Set abnormalVisualEffects = _npc.getCurrentAbnormalVisualEffects(); + writeD(abnormalVisualEffects.size()); + for (AbnormalVisualEffect abnormalVisualEffect : abnormalVisualEffects) + { + writeH(abnormalVisualEffect.getClientId()); + } + } +} diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/PartySmallWindowAll.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/PartySmallWindowAll.java index 2344227baf..6ff6303b34 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/PartySmallWindowAll.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/PartySmallWindowAll.java @@ -19,6 +19,7 @@ package com.l2jserver.gameserver.network.serverpackets; import com.l2jserver.gameserver.model.L2Party; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; public final class PartySmallWindowAll extends L2GameServerPacket @@ -59,19 +60,32 @@ public final class PartySmallWindowAll extends L2GameServerPacket writeH(member.getClassId().getId()); writeC(0x01); // Unk writeH(member.getRace().ordinal()); - writeD(member.hasSummon() ? 0x01 : 0x00); // Summon size, one only atm - if (member.hasSummon()) + final L2Summon pet = member.getPet(); + writeD(member.getServitors().size() + (pet != null ? 1 : 0)); // Summon size, one only atm + if (pet != null) { - writeD(member.getSummon().getObjectId()); - writeD(member.getSummon().getId() + 1000000); - writeC(member.getSummon().getSummonType()); - writeS(member.getSummon().getName()); - writeD((int) member.getSummon().getCurrentHp()); - writeD(member.getSummon().getMaxHp()); - writeD((int) member.getSummon().getCurrentMp()); - writeD(member.getSummon().getMaxMp()); - writeC(member.getSummon().getLevel()); + writeD(pet.getObjectId()); + writeD(pet.getId() + 1000000); + writeC(pet.getSummonType()); + writeS(pet.getName()); + writeD((int) pet.getCurrentHp()); + writeD(pet.getMaxHp()); + writeD((int) pet.getCurrentMp()); + writeD(pet.getMaxMp()); + writeC(pet.getLevel()); } + member.getServitors().values().forEach(s -> + { + writeD(s.getObjectId()); + writeD(s.getId() + 1000000); + writeC(s.getSummonType()); + writeS(s.getName()); + writeD((int) s.getCurrentHp()); + writeD(s.getMaxHp()); + writeD((int) s.getCurrentMp()); + writeD(s.getMaxMp()); + writeC(s.getLevel()); + }); } } } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/PetInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/PetInfo.java index 6d3cac1be3..653049d193 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/PetInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/PetInfo.java @@ -24,6 +24,7 @@ import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PetInstance; import com.l2jserver.gameserver.model.actor.instance.L2ServitorInstance; import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect; +import com.l2jserver.gameserver.taskmanager.AttackStanceTaskManager; public class PetInfo extends L2GameServerPacket { @@ -38,6 +39,7 @@ public class PetInfo extends L2GameServerPacket private final int _flyWalkSpd; private final double _moveMultiplier; private int _maxFed, _curFed; + private int _statusMask = 0; public PetInfo(L2Summon summon, int val) { @@ -62,6 +64,19 @@ public class PetInfo extends L2GameServerPacket _curFed = sum.getLifeTimeRemaining(); _maxFed = sum.getLifeTime(); } + + if (summon.isRunning()) + { + _statusMask |= 0x04; + } + if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(summon)) + { + _statusMask |= 0x08; + } + if (summon.isDead()) + { + _statusMask |= 0x10; + } } @Override @@ -98,7 +113,7 @@ public class PetInfo extends L2GameServerPacket writeD(_summon.getArmor()); // body armor writeD(0x00); // left hand weapon - writeC(_summon.isShowSummonAnimation() ? 2 : _val); // 0=teleported 1=default 2=summoned + writeC(_summon.isShowSummonAnimation() ? 0x02 : _val); // 0=teleported 1=default 2=summoned writeD(-1); // High Five NPCString ID if (_summon.isPet()) { @@ -111,8 +126,8 @@ public class PetInfo extends L2GameServerPacket writeD(-1); // High Five NPCString ID writeS(_summon.getTitle()); // owner name - writeC(_summon.getPvpFlag()); // ? - writeD(_summon.getKarma()); + writeC(_summon.getPvpFlag()); // confirmed + writeD(_summon.getKarma()); // confirmed writeD(_curFed); // how fed it is writeD(_maxFed); // max fed it can be @@ -160,8 +175,8 @@ public class PetInfo extends L2GameServerPacket writeD(0x00); // TODO: Find me writeD(_summon.getFormId()); // Transformation ID - Confirmed - writeC(0x00); // Used Summon Points - writeC(0x00); // Maximum Summon Points + writeC(_summon.getOwner().getSummonPoints()); // Used Summon Points + writeC(_summon.getOwner().getMaxSummonPoints()); // Maximum Summon Points final Set aves = _summon.getCurrentAbnormalVisualEffects(); writeH(aves.size()); // Confirmed @@ -170,6 +185,6 @@ public class PetInfo extends L2GameServerPacket writeH(ave.getClientId()); // Confirmed } - writeC(0x00); // TODO: Find me + writeC(_statusMask); } } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/PledgeCrest.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/PledgeCrest.java index 3d8e0a759e..10891035e0 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/PledgeCrest.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/PledgeCrest.java @@ -19,7 +19,7 @@ package com.l2jserver.gameserver.network.serverpackets; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.CrestTable; +import com.l2jserver.gameserver.data.sql.impl.CrestTable; import com.l2jserver.gameserver.model.L2Crest; public final class PledgeCrest extends L2GameServerPacket diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/PledgeReceiveWarList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/PledgeReceiveWarList.java index 77a8ee543b..e32a81113b 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/PledgeReceiveWarList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/PledgeReceiveWarList.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.serverpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; /** diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/RecipeItemMakeInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/RecipeItemMakeInfo.java index 323a861b6f..be57839fe0 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/RecipeItemMakeInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/RecipeItemMakeInfo.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.serverpackets; -import com.l2jserver.gameserver.datatables.RecipeData; +import com.l2jserver.gameserver.data.xml.impl.RecipeData; import com.l2jserver.gameserver.model.L2RecipeList; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/SellList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SellList.java index f81a90d288..481601bd39 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/SellList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SellList.java @@ -22,6 +22,7 @@ import java.util.List; import javolution.util.FastList; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2MerchantInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; @@ -57,9 +58,10 @@ public class SellList extends L2GameServerPacket { if (_lease == null) { + final L2Summon pet = _activeChar.getPet(); for (L2ItemInstance item : _activeChar.getInventory().getItems()) { - if (!item.isEquipped() && item.isSellable() && (!_activeChar.hasSummon() || (item.getObjectId() != _activeChar.getSummon().getControlObjectId()))) // Pet is summoned and not the item that summoned the pet + if (!item.isEquipped() && item.isSellable() && ((pet == null) || (item.getObjectId() != pet.getControlObjectId()))) // Pet is summoned and not the item that summoned the pet { _selllist.add(item); } diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeAttackerList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeAttackerList.java index f6477c9d9c..32cef6a4b9 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeAttackerList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeAttackerList.java @@ -20,7 +20,7 @@ package com.l2jserver.gameserver.network.serverpackets; import java.util.Collection; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2SiegeClan; import com.l2jserver.gameserver.model.entity.Castle; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeDefenderList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeDefenderList.java index b9e7474b9d..044cf08e34 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeDefenderList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeDefenderList.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.serverpackets; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.enums.SiegeClanType; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2SiegeClan; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeInfo.java index cc9b3ab5cc..d6b91f33b6 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SiegeInfo.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.network.serverpackets; import java.util.Calendar; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.instancemanager.CHSiegeManager; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/SortedWareHouseWithdrawalList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SortedWareHouseWithdrawalList.java index 7cec7d56c0..c72156cccc 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/SortedWareHouseWithdrawalList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SortedWareHouseWithdrawalList.java @@ -24,7 +24,7 @@ import java.util.List; import javolution.util.FastList; -import com.l2jserver.gameserver.datatables.RecipeData; +import com.l2jserver.gameserver.data.xml.impl.RecipeData; import com.l2jserver.gameserver.model.L2RecipeList; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.L2Item; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/SummonInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SummonInfo.java new file mode 100644 index 0000000000..e49fc7f59d --- /dev/null +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/SummonInfo.java @@ -0,0 +1,390 @@ +/* + * Copyright (C) 2004-2015 L2J Server + * + * This file is part of L2J Server. + * + * L2J Server is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jserver.gameserver.network.serverpackets; + +import java.util.Set; + +import com.l2jserver.gameserver.enums.NpcInfoType; +import com.l2jserver.gameserver.enums.Team; +import com.l2jserver.gameserver.model.actor.L2Summon; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect; +import com.l2jserver.gameserver.model.zone.ZoneId; + +/** + * @author Sdw + */ +public class SummonInfo extends AbstractMaskPacket +{ + private final L2Summon _summon; + private final L2PcInstance _attacker; + private final int _val; + private final byte[] _masks = new byte[] + { + (byte) 0x00, + (byte) 0x0C, + (byte) 0x0C, + (byte) 0x00, + (byte) 0x00 + }; + + private int _initSize = 0; + private int _blockSize = 0; + + private int _clanCrest = 0; + private int _clanLargeCrest = 0; + private int _allyCrest = 0; + private int _allyId = 0; + private int _clanId = 0; + private int _statusMask = 0; + private final String _title; + private final Set _abnormalVisualEffects; + + public SummonInfo(L2Summon summon, L2PcInstance attacker, int val) + { + _summon = summon; + _attacker = attacker; + _title = (summon.getOwner() != null) && summon.getOwner().isOnline() ? summon.getOwner().getName() : ""; + _val = val; + _abnormalVisualEffects = summon.getCurrentAbnormalVisualEffects(); + + if (summon.getTemplate().getDisplayId() != summon.getTemplate().getId()) + { + _masks[2] |= 0x10; + addComponentType(NpcInfoType.NAME); + } + + addComponentType(NpcInfoType.ATTACKABLE, NpcInfoType.UNKNOWN1, NpcInfoType.TITLE, NpcInfoType.ID, NpcInfoType.POSITION, NpcInfoType.ALIVE, NpcInfoType.RUNNING); + + if (summon.getHeading() > 0) + { + addComponentType(NpcInfoType.HEADING); + } + + if ((summon.getStat().getPAtkSpd() > 0) || (summon.getStat().getMAtkSpd() > 0)) + { + addComponentType(NpcInfoType.ATK_CAST_SPEED); + } + + if (summon.getRunSpeed() > 0) + { + addComponentType(NpcInfoType.SPEED_MULTIPLIER); + } + + if ((summon.getWeapon() > 0) || (summon.getArmor() > 0)) + { + addComponentType(NpcInfoType.EQUIPPED); + } + + if (summon.getTeam() != Team.NONE) + { + addComponentType(NpcInfoType.TEAM); + } + + if (summon.isInsideZone(ZoneId.WATER) || summon.isFlying()) + { + addComponentType(NpcInfoType.SWIM_OR_FLY); + } + + if (summon.isFlying()) + { + addComponentType(NpcInfoType.FLYING); + } + + if (summon.getMaxHp() > 0) + { + addComponentType(NpcInfoType.MAX_HP); + } + + if (summon.getMaxMp() > 0) + { + addComponentType(NpcInfoType.MAX_MP); + } + + if (summon.getCurrentHp() <= summon.getMaxHp()) + { + addComponentType(NpcInfoType.CURRENT_HP); + } + + if (summon.getCurrentMp() <= summon.getMaxMp()) + { + addComponentType(NpcInfoType.CURRENT_MP); + } + + if (!_abnormalVisualEffects.isEmpty()) + { + addComponentType(NpcInfoType.ABNORMALS); + } + + if (summon.getTemplate().getWeaponEnchant() > 0) + { + addComponentType(NpcInfoType.ENCHANT); + } + + if ((summon.getTransformation() != null) && (summon.getTransformation().getId() > 0)) + { + addComponentType(NpcInfoType.TRANSFORMATION); + } + + if (summon.getOwner().getClan() != null) + { + _clanId = summon.getOwner().getClanId(); + _clanCrest = summon.getOwner().getClanCrestId(); + _clanLargeCrest = summon.getOwner().getClanCrestLargeId(); + _allyCrest = summon.getOwner().getAllyId(); + _allyId = summon.getOwner().getAllyCrestId(); + + addComponentType(NpcInfoType.CLAN); + } + + addComponentType(NpcInfoType.UNKNOWN8); + + // TODO: Confirm me + if (summon.isInCombat()) + { + _statusMask |= 0x01; + } + if (summon.isDead()) + { + _statusMask |= 0x02; + } + if (summon.isTargetable()) + { + _statusMask |= 0x04; + } + + _statusMask |= 0x08; + + if (_statusMask != 0) + { + addComponentType(NpcInfoType.VISUAL_STATE); + } + } + + @Override + protected byte[] getMasks() + { + return _masks; + } + + @Override + protected void onNewMaskAdded(NpcInfoType component) + { + calcBlockSize(_summon, component); + } + + private void calcBlockSize(L2Summon summon, NpcInfoType type) + { + switch (type) + { + case ATTACKABLE: + case UNKNOWN1: + { + _initSize += type.getBlockLength(); + break; + } + case TITLE: + { + _initSize += type.getBlockLength() + (_title.length() * 2); + break; + } + case NAME: + { + _blockSize += type.getBlockLength() + (summon.getName().length() * 2); + break; + } + default: + { + _blockSize += type.getBlockLength(); + break; + } + } + } + + @Override + protected void writeImpl() + { + writeC(0x8B); + writeD(_summon.getObjectId()); + writeC(_val); // 0=teleported 1=default 2=summoned + writeH(37); // mask_bits_37 + writeB(_masks); + + // Block 1 + writeC(_initSize); + + if (containsMask(NpcInfoType.ATTACKABLE)) + { + writeC(_summon.isAutoAttackable(_attacker) ? 0x01 : 0x00); + } + if (containsMask(NpcInfoType.UNKNOWN1)) + { + writeD(0x00); // unknown + } + if (containsMask(NpcInfoType.TITLE)) + { + writeS(_title); + } + + // Block 2 + writeH(_blockSize); + if (containsMask(NpcInfoType.ID)) + { + writeD(_summon.getTemplate().getDisplayId() + 1000000); + } + if (containsMask(NpcInfoType.POSITION)) + { + writeD(_summon.getX()); + writeD(_summon.getY()); + writeD(_summon.getZ()); + } + if (containsMask(NpcInfoType.HEADING)) + { + writeD(_summon.getHeading()); + } + if (containsMask(NpcInfoType.UNKNOWN2)) + { + writeD(0x00); // Unknown + } + if (containsMask(NpcInfoType.ATK_CAST_SPEED)) + { + writeD(_summon.getPAtkSpd()); + writeD(_summon.getMAtkSpd()); + } + if (containsMask(NpcInfoType.SPEED_MULTIPLIER)) + { + _buf.putFloat((float) _summon.getStat().getMovementSpeedMultiplier()); + _buf.putFloat(_summon.getStat().getAttackSpeedMultiplier()); + } + if (containsMask(NpcInfoType.EQUIPPED)) + { + writeD(_summon.getWeapon()); + writeD(_summon.getArmor()); // Armor id? + writeD(0x00); + } + if (containsMask(NpcInfoType.ALIVE)) + { + writeC(_summon.isDead() ? 0x00 : 0x01); + } + if (containsMask(NpcInfoType.RUNNING)) + { + writeC(_summon.isRunning() ? 0x01 : 0x00); + } + if (containsMask(NpcInfoType.SWIM_OR_FLY)) + { + writeC(_summon.isInsideZone(ZoneId.WATER) ? 0x01 : _summon.isFlying() ? 0x02 : 0x00); + } + if (containsMask(NpcInfoType.TEAM)) + { + writeC(_summon.getTeam().getId()); + } + if (containsMask(NpcInfoType.ENCHANT)) + { + writeD(_summon.getTemplate().getWeaponEnchant()); + } + if (containsMask(NpcInfoType.FLYING)) + { + writeD(_summon.isFlying() ? 0x01 : 00); + } + if (containsMask(NpcInfoType.CLONE)) + { + writeD(0x00); // Player ObjectId with Decoy + } + if (containsMask(NpcInfoType.UNKNOWN8)) + { + // No visual effect + writeD(0x00); // Unknown + } + if (containsMask(NpcInfoType.DISPLAY_EFFECT)) + { + writeD(0x00); + } + if (containsMask(NpcInfoType.TRANSFORMATION)) + { + writeD(0x00); // Transformation ID + } + if (containsMask(NpcInfoType.CURRENT_HP)) + { + writeD((int) _summon.getCurrentHp()); + } + if (containsMask(NpcInfoType.CURRENT_MP)) + { + writeD((int) _summon.getCurrentMp()); + } + if (containsMask(NpcInfoType.MAX_HP)) + { + writeD(_summon.getMaxHp()); + } + if (containsMask(NpcInfoType.MAX_MP)) + { + writeD(_summon.getMaxMp()); + } + if (containsMask(NpcInfoType.UNKNOWN11)) + { + writeC(0x00); // 2 - do some animation on spawn + } + if (containsMask(NpcInfoType.UNKNOWN12)) + { + writeD(0x00); + writeD(0x00); + } + if (containsMask(NpcInfoType.NAME)) + { + writeS(_summon.getName()); + } + if (containsMask(NpcInfoType.NAME_NPCSTRINGID)) + { + writeD(-1); // NPCStringId for name + } + if (containsMask(NpcInfoType.TITLE_NPCSTRINGID)) + { + writeD(-1); // NPCStringId for title + } + if (containsMask(NpcInfoType.PVP_FLAG)) + { + writeC(_summon.getPvpFlag()); // PVP flag + } + if (containsMask(NpcInfoType.NAME_COLOR)) + { + writeD(0x00); // Name color + } + if (containsMask(NpcInfoType.CLAN)) + { + writeD(_clanId); + writeD(_clanCrest); + writeD(_clanLargeCrest); + writeD(_allyId); + writeD(_allyCrest); + } + + if (containsMask(NpcInfoType.VISUAL_STATE)) + { + writeC(_statusMask); + } + + if (containsMask(NpcInfoType.ABNORMALS)) + { + writeH(_abnormalVisualEffects.size()); + for (AbnormalVisualEffect abnormalVisualEffect : _abnormalVisualEffects) + { + writeH(abnormalVisualEffect.getClientId()); + } + } + } +} \ No newline at end of file diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java index e62ea1cf0c..194ac39217 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.serverpackets; -import com.l2jserver.gameserver.datatables.ExperienceTable; +import com.l2jserver.gameserver.data.xml.impl.ExperienceData; import com.l2jserver.gameserver.enums.UserInfoType; import com.l2jserver.gameserver.instancemanager.RaidBossPointsManager; import com.l2jserver.gameserver.model.Elementals; @@ -172,7 +172,7 @@ public class UserInfo extends AbstractMaskPacket writeD((int) Math.round(_activeChar.getCurrentCp())); writeQ(_activeChar.getSp()); writeQ(_activeChar.getExp()); - writeF((float) (_activeChar.getExp() - ExperienceTable.getInstance().getExpForLevel(_activeChar.getLevel())) / (ExperienceTable.getInstance().getExpForLevel(_activeChar.getLevel() + 1) - ExperienceTable.getInstance().getExpForLevel(_activeChar.getLevel()))); + writeF((float) (_activeChar.getExp() - ExperienceData.getInstance().getExpForLevel(_activeChar.getLevel())) / (ExperienceData.getInstance().getExpForLevel(_activeChar.getLevel() + 1) - ExperienceData.getInstance().getExpForLevel(_activeChar.getLevel()))); } if (containsMask(UserInfoType.ENCHANTLEVEL)) diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/FriendList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/FriendList.java index 40d544f17b..3e482b5597 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/FriendList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/FriendList.java @@ -26,7 +26,7 @@ import java.util.List; import javolution.util.FastList; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2Friend.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2Friend.java index 417ebf5286..5dac138361 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2Friend.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2Friend.java @@ -18,7 +18,7 @@ */ package com.l2jserver.gameserver.network.serverpackets.friend; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2FriendList.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2FriendList.java index 86157f5a4a..6fe3a6684a 100644 --- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2FriendList.java +++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/friend/L2FriendList.java @@ -22,7 +22,7 @@ import java.util.List; import javolution.util.FastList; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket; diff --git a/trunk/java/com/l2jserver/gameserver/pathfinding/PathFinding.java b/trunk/java/com/l2jserver/gameserver/pathfinding/PathFinding.java index f7a75b4fff..d48e5f9350 100644 --- a/trunk/java/com/l2jserver/gameserver/pathfinding/PathFinding.java +++ b/trunk/java/com/l2jserver/gameserver/pathfinding/PathFinding.java @@ -32,7 +32,7 @@ public abstract class PathFinding { public static PathFinding getInstance() { - if (!Config.GEODATA_CELLFINDING) + if (Config.PATHFINDING == 1) { // Higher Memory Usage, Smaller Cpu Usage return GeoPathFinding.getInstance(); diff --git a/trunk/java/com/l2jserver/gameserver/script/faenor/FaenorInterface.java b/trunk/java/com/l2jserver/gameserver/script/faenor/FaenorInterface.java index ddca6d6fd7..b02ad27420 100644 --- a/trunk/java/com/l2jserver/gameserver/script/faenor/FaenorInterface.java +++ b/trunk/java/com/l2jserver/gameserver/script/faenor/FaenorInterface.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.script.faenor; import java.util.List; import java.util.logging.Logger; -import com.l2jserver.gameserver.datatables.AnnouncementsTable; +import com.l2jserver.gameserver.data.sql.impl.AnnouncementsTable; import com.l2jserver.gameserver.datatables.EventDroplist; import com.l2jserver.gameserver.model.announce.EventAnnouncement; import com.l2jserver.gameserver.script.DateRange; diff --git a/trunk/java/com/l2jserver/gameserver/security/SecondaryPasswordAuth.java b/trunk/java/com/l2jserver/gameserver/security/SecondaryPasswordAuth.java index df45703f9f..db8dc9c653 100644 --- a/trunk/java/com/l2jserver/gameserver/security/SecondaryPasswordAuth.java +++ b/trunk/java/com/l2jserver/gameserver/security/SecondaryPasswordAuth.java @@ -30,7 +30,7 @@ import java.util.logging.Logger; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.LoginServerThread; -import com.l2jserver.gameserver.datatables.SecondaryAuthData; +import com.l2jserver.gameserver.data.xml.impl.SecondaryAuthData; import com.l2jserver.gameserver.network.L2GameClient; import com.l2jserver.gameserver.network.serverpackets.Ex2ndPasswordAck; import com.l2jserver.gameserver.network.serverpackets.Ex2ndPasswordCheck; diff --git a/trunk/java/com/l2jserver/gameserver/taskmanager/AttackStanceTaskManager.java b/trunk/java/com/l2jserver/gameserver/taskmanager/AttackStanceTaskManager.java index b83b1f96cf..605fa26ee0 100644 --- a/trunk/java/com/l2jserver/gameserver/taskmanager/AttackStanceTaskManager.java +++ b/trunk/java/com/l2jserver/gameserver/taskmanager/AttackStanceTaskManager.java @@ -27,6 +27,7 @@ import java.util.logging.Logger; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2CubicInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.serverpackets.AutoAttackStop; @@ -129,7 +130,12 @@ public class AttackStanceTaskManager actor.getAI().setAutoAttacking(false); if (actor.isPlayer() && actor.hasSummon()) { - actor.getSummon().broadcastPacket(new AutoAttackStop(actor.getSummon().getObjectId())); + final L2Summon pet = actor.getPet(); + if (pet != null) + { + pet.broadcastPacket(new AutoAttackStop(pet.getObjectId())); + } + actor.getServitors().values().forEach(s -> s.broadcastPacket(new AutoAttackStop(s.getObjectId()))); } } iter.remove(); diff --git a/trunk/java/com/l2jserver/gameserver/taskmanager/DecayTaskManager.java b/trunk/java/com/l2jserver/gameserver/taskmanager/DecayTaskManager.java index 4ec15e943d..3053da6016 100644 --- a/trunk/java/com/l2jserver/gameserver/taskmanager/DecayTaskManager.java +++ b/trunk/java/com/l2jserver/gameserver/taskmanager/DecayTaskManager.java @@ -63,7 +63,7 @@ public final class DecayTaskManager delay = Config.DEFAULT_CORPSE_TIME; } - if ((character instanceof L2Attackable) && (((L2Attackable) character).isSpoil() || ((L2Attackable) character).isSeeded())) + if ((character instanceof L2Attackable) && (((L2Attackable) character).isSpoiled() || ((L2Attackable) character).isSeeded())) { delay += Config.SPOILED_CORPSE_EXTEND_TIME; } diff --git a/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskBirthday.java b/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskBirthday.java index 8762496472..300db55a83 100644 --- a/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskBirthday.java +++ b/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskBirthday.java @@ -28,7 +28,7 @@ import java.util.logging.Level; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; -import com.l2jserver.gameserver.datatables.CharNameTable; +import com.l2jserver.gameserver.data.sql.impl.CharNameTable; import com.l2jserver.gameserver.enums.MailType; import com.l2jserver.gameserver.instancemanager.MailManager; import com.l2jserver.gameserver.model.entity.Message; diff --git a/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskClanLeaderApply.java b/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskClanLeaderApply.java index 534e43a2a7..4ffd1a9b32 100644 --- a/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskClanLeaderApply.java +++ b/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskClanLeaderApply.java @@ -21,7 +21,7 @@ package com.l2jserver.gameserver.taskmanager.tasks; import java.util.Calendar; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2ClanMember; import com.l2jserver.gameserver.taskmanager.Task; diff --git a/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskRaidPointsReset.java b/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskRaidPointsReset.java index efdeba2504..d93515cf8c 100644 --- a/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskRaidPointsReset.java +++ b/trunk/java/com/l2jserver/gameserver/taskmanager/tasks/TaskRaidPointsReset.java @@ -22,7 +22,7 @@ import java.util.Calendar; import java.util.Map; import com.l2jserver.Config; -import com.l2jserver.gameserver.datatables.ClanTable; +import com.l2jserver.gameserver.data.sql.impl.ClanTable; import com.l2jserver.gameserver.instancemanager.RaidBossPointsManager; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.taskmanager.Task; diff --git a/trunk/java/com/l2jserver/gameserver/util/Broadcast.java b/trunk/java/com/l2jserver/gameserver/util/Broadcast.java index 2a0f9b9851..271131feb3 100644 --- a/trunk/java/com/l2jserver/gameserver/util/Broadcast.java +++ b/trunk/java/com/l2jserver/gameserver/util/Broadcast.java @@ -24,6 +24,7 @@ import java.util.logging.Logger; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.clientpackets.Say2; import com.l2jserver.gameserver.network.serverpackets.CharInfo; @@ -75,7 +76,7 @@ public final class Broadcast */ public static void toKnownPlayers(L2Character character, L2GameServerPacket mov) { - Collection plrs = character.getKnownList().getKnownPlayers().values(); + final Collection plrs = character.getKnownList().getKnownPlayers().values(); for (L2PcInstance player : plrs) { if (player == null) @@ -85,17 +86,28 @@ public final class Broadcast try { player.sendPacket(mov); - if ((mov instanceof CharInfo) && (character instanceof L2PcInstance)) + if ((mov instanceof CharInfo) && (character.isPlayer())) { int relation = ((L2PcInstance) character).getRelation(player); Integer oldrelation = character.getKnownList().getKnownRelations().get(player.getObjectId()); if ((oldrelation != null) && (oldrelation != relation)) { - player.sendPacket(new RelationChanged((L2PcInstance) character, relation, character.isAutoAttackable(player))); + final RelationChanged rc = new RelationChanged(); + rc.addRelation((L2PcInstance) character, relation, character.isAutoAttackable(player)); if (character.hasSummon()) { - player.sendPacket(new RelationChanged(character.getSummon(), relation, character.isAutoAttackable(player))); + final L2Summon pet = character.getPet(); + if (pet != null) + { + rc.addRelation(pet, relation, character.isAutoAttackable(player)); + } + if (character.hasServitors()) + { + character.getServitors().values().forEach(s -> rc.addRelation(s, relation, character.isAutoAttackable(player))); + } } + player.sendPacket(rc); + character.getKnownList().getKnownRelations().put(player.getObjectId(), relation); } } } diff --git a/trunk/java/com/l2jserver/gameserver/util/Evolve.java b/trunk/java/com/l2jserver/gameserver/util/Evolve.java index ce07b32c29..a47fd21f12 100644 --- a/trunk/java/com/l2jserver/gameserver/util/Evolve.java +++ b/trunk/java/com/l2jserver/gameserver/util/Evolve.java @@ -26,16 +26,18 @@ import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.NpcData; -import com.l2jserver.gameserver.datatables.PetDataTable; +import com.l2jserver.gameserver.data.xml.impl.NpcData; +import com.l2jserver.gameserver.data.xml.impl.PetDataTable; import com.l2jserver.gameserver.model.L2PetData; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PetInstance; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.ExAdenaInvenCount; import com.l2jserver.gameserver.network.serverpackets.ExUserInfoInvenWeight; import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate; import com.l2jserver.gameserver.network.serverpackets.MagicSkillLaunched; @@ -56,12 +58,13 @@ public final class Evolve return false; } - if (!player.hasPet()) + final L2Summon pet = player.getPet(); + if (pet == null) { return false; } - final L2PetInstance currentPet = (L2PetInstance) player.getSummon(); + final L2PetInstance currentPet = (L2PetInstance) pet; if (currentPet.isAlikeDead()) { Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to use death pet exploit!", Config.DEFAULT_PUNISH); @@ -239,6 +242,7 @@ public final class Evolve player.sendPacket(iu); player.sendPacket(new ExUserInfoInvenWeight(player)); + player.sendPacket(new ExAdenaInvenCount(player)); player.broadcastUserInfo(); diff --git a/trunk/java/com/l2jserver/gameserver/util/MinionList.java b/trunk/java/com/l2jserver/gameserver/util/MinionList.java index 28218db77d..971b18d1e2 100644 --- a/trunk/java/com/l2jserver/gameserver/util/MinionList.java +++ b/trunk/java/com/l2jserver/gameserver/util/MinionList.java @@ -28,7 +28,7 @@ import javolution.util.FastSet; import com.l2jserver.Config; import com.l2jserver.gameserver.ThreadPoolManager; -import com.l2jserver.gameserver.datatables.NpcData; +import com.l2jserver.gameserver.data.xml.impl.NpcData; import com.l2jserver.gameserver.idfactory.IdFactory; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Character;