From 1c6301c46dd6bafaec236775a3c1ade13f1c17ac Mon Sep 17 00:00:00 2001
From: mobius <8391001+MobiusDevelopment@users.noreply.github.com>
Date: Sat, 24 Jan 2015 20:02:32 +0000
Subject: [PATCH] Sync with L2JServer Jan 24th 2015.
---
trunk/dist/game/config/Character.properties | 15 +-
trunk/dist/game/config/General.properties | 13 +-
trunk/dist/game/config/GeoData.properties | 21 +-
trunk/dist/game/data/doors.xml | 160 +-
.../dist/game/data/html/admin/serverinfo.htm | 2 +-
.../game/data/html/teleporter/30146-1.htm | 11 -
.../game/data/html/teleporter/30146-2.htm | 6 -
.../game/data/html/teleporter/30146-3.htm | 6 -
.../game/data/html/teleporter/32163-1.htm | 14 -
.../game/data/html/teleporter/32163-2.htm | 5 -
.../game/data/html/teleporter/32163-3.htm | 5 -
.../game/data/html/teleporter/32163-4.htm | 3 -
.../game/data/html/teleporter/32163-5.htm | 5 -
.../game/data/html/villagemaster/SubClass.htm | 6 -
.../data/html/villagemaster/SubClass_Add.htm | 4 -
.../html/villagemaster/SubClass_AddOk.htm | 3 -
.../html/villagemaster/SubClass_Change.htm | 5 -
.../html/villagemaster/SubClass_ChangeNo.htm | 4 -
.../villagemaster/SubClass_ChangeNotFound.htm | 5 -
.../html/villagemaster/SubClass_Current.htm | 4 -
.../data/html/villagemaster/SubClass_Fail.htm | 8 -
.../villagemaster/SubClass_Fail_Elves.htm | 3 -
.../villagemaster/SubClass_Fail_Kamael.htm | 8 -
.../html/villagemaster/SubClass_Modify.htm | 11 -
.../villagemaster/SubClass_ModifyChoice.htm | 5 -
.../villagemaster/SubClass_ModifyChoice1.htm | 4 -
.../villagemaster/SubClass_ModifyChoice2.htm | 4 -
.../villagemaster/SubClass_ModifyChoice3.htm | 4 -
.../villagemaster/SubClass_ModifyCustom.htm | 6 -
.../villagemaster/SubClass_ModifyEmpty.htm | 8 -
.../html/villagemaster/SubClass_ModifyOk.htm | 3 -
.../html/villagemaster/SubClass_NoKamael.htm | 3 -
.../html/villagemaster/SubClass_NoOther.htm | 3 -
.../html/villagemaster/SubClass_NoSummon.htm | 3 -
.../villagemaster/SubClass_NoTransformed.htm | 3 -
trunk/dist/game/data/multisell/2027.xml | 22 +
trunk/dist/game/data/multisell/311262509.xml | 4104 ++++++++
trunk/dist/game/data/multisell/779.xml | 8736 +++++++++++++++++
trunk/dist/game/data/multisell/857.xml | 14 +
trunk/dist/game/data/scripts.cfg | 3 +-
.../scripts/ai/group_template/BeastFarm.java | 6 +-
.../ai/group_template/DragonValley.java | 4 +-
.../scripts/ai/group_template/FairyTrees.java | 2 +-
.../ai/group_template/FeedableBeasts.java | 42 +-
.../ai/group_template/FleeMonsters.java | 13 +-
.../group_template/PolymorphingOnAttack.java | 2 +-
.../ai/group_template/PrimevalIsle.java | 2 +-
.../scripts/ai/group_template/RangeGuard.java | 4 +-
.../data/scripts/ai/individual/Beleth.java | 14 +-
.../ai/individual/DarkWaterDragon.java | 6 +-
.../scripts/ai/individual/DivineBeast.java | 4 +-
.../data/scripts/ai/individual/Orfen.java | 2 +-
.../data/scripts/ai/individual/QueenAnt.java | 2 +-
.../data/scripts/ai/individual/SinEater.java | 4 +-
.../data/scripts/ai/npc/Acateo/Acateo.java | 24 +-
.../AlchemistManager/AlchemistManager.java | 2 +-
.../ai/npc/ArenaManager/ArenaManager.java | 6 +-
.../scripts/ai/npc/AvantGarde/AvantGarde.java | 6 +-
.../npc/AwakeningMaster/AwakeningMaster.java | 22 +-
.../CastleChamberlain/CastleChamberlain.java | 4 +-
.../CastleCourtMagician.java | 2 +-
.../ai/npc/ForgeOfTheGods/TarBeetleSpawn.java | 6 +-
.../data/scripts/ai/npc/Mammons/31126-01.html | 2 +-
.../data/scripts/ai/npc/Mammons/Mammons.java | 7 +
.../ai/npc/MentorGuide/MentorGuide.java | 24 +-
.../scripts/ai/npc/MonkOfChaos/33880-1.html | 20 +-
.../scripts/ai/npc/MonkOfChaos/33880-2.html | 16 +-
.../scripts/ai/npc/MonkOfChaos/33880.html | 14 +-
.../ai/npc/MonkOfChaos/MonkOfChaos.java | 7 +-
.../scripts/ai/npc/MonkOfChaos/canceled.html | 10 +-
.../scripts/ai/npc/MonkOfChaos/no-adena.html | 12 +-
.../scripts/ai/npc/MonkOfChaos/no-cancel.html | 12 +-
.../scripts/ai/npc/MonkOfChaos/no-learn.html | 14 +-
.../ai/npc/MonkOfChaos/no-subclass.html | 14 +-
.../ai/npc/NpcBuffers/NpcBuffersData.java | 4 +-
.../scripts/ai/npc/Proclaimer/Proclaimer.java | 2 +-
.../data/scripts/ai/npc/Raina/33491-01.html | 9 +
.../data/scripts/ai/npc/Raina/33491-02.html | 7 +
.../data/scripts/ai/npc/Raina/33491-03.html | 7 +
.../data/scripts/ai/npc/Raina/33491-04.html | 6 +
.../data/scripts/ai/npc/Raina/33491-05.html | 6 +
.../game/data/scripts/ai/npc/Raina/33491.html | 10 +
.../game/data/scripts/ai/npc/Raina/Raina.java | 866 ++
.../data/scripts/ai/npc/Raina/addConfirm.html | 6 +
.../scripts/ai/npc/Raina/addConfirm2.html | 6 +
.../ai/npc/Raina/addDualClassErtheia.html | 12 +
.../npc/Raina/addDualClassErtheiaFailed.html | 5 +
.../ai/npc/Raina/addDualClassErtheiaList.html | 9 +
.../data/scripts/ai/npc/Raina/addFailed.html | 8 +
.../data/scripts/ai/npc/Raina/addSuccess.html | 5 +
.../scripts/ai/npc/Raina/inventoryLimit.html | 3 +
.../scripts/ai/npc/Raina/noCertificate.html | 5 +
.../data/scripts/ai/npc/Raina/noErtheia.html | 4 +
.../data/scripts/ai/npc/Raina/noQuest.html | 4 +
.../scripts/ai/npc/Raina/noSubChange.html | 4 +
.../data/scripts/ai/npc/Raina/noSummon.html | 4 +
.../scripts/ai/npc/Raina/noTransform.html | 4 +
.../scripts/ai/npc/Raina/onlyErtheia.html | 5 +
.../data/scripts/ai/npc/Raina/reawaken.html | 10 +
.../scripts/ai/npc/Raina/reawakenCancel.html | 5 +
.../ai/npc/Raina/reawakenClassList.html | 9 +
.../scripts/ai/npc/Raina/reawakenList.html | 12 +
.../scripts/ai/npc/Raina/reawakenNoDual.html | 6 +
.../scripts/ai/npc/Raina/reawakenNoFee.html | 6 +
.../ai/npc/Raina/removeSubclassList.html | 7 +
.../scripts/ai/npc/Raina/subclassList.html | 4 +
.../ai/npc/Raina/subclassRemoveList.html | 7 +
.../data/scripts/ai/npc/Rignos/Rignos.java | 10 +-
.../scripts/ai/npc/Scarecrow/Scarecrow.java | 3 +-
.../SubclassCertification.java | 2 +-
.../GrandBossTeleporters.java | 8 +-
.../StrongholdsTeleports/32163-no.htm | 10 -
.../Teleports/StrongholdsTeleports/32163.htm | 10 -
.../StrongholdsTeleports.java | 1 -
.../Trainers/HealerTrainer/HealerTrainer.java | 2 +-
.../DevastatedCastle/DevastatedCastle.java | 4 +-
.../FortressOfResistance.java | 4 +-
.../FortressOfTheDead/FortressOfTheDead.java | 2 +-
.../RainbowSpringsChateau.java | 14 +-
.../conquerablehalls/flagwar/FlagWar.java | 4 +-
.../WildBeastReserve/messenger_initial.htm | 10 +-
.../messenger_nonsiegeinitial.htm | 6 +-
.../custom/NewbieCoupons/NewbieCoupons.java | 2 +-
.../custom/RaidbossInfo/RaidbossInfo.java | 2 +-
.../custom/Validators/SubClassSkills.java | 2 +-
.../events/GiftOfVitality/GiftOfVitality.java | 13 +-
.../features/SkillTransfer/SkillTransfer.java | 10 +-
.../data/scripts/gracia/AI/EnergySeeds.java | 8 +-
.../data/scripts/gracia/AI/NPC/Nemo/Nemo.java | 3 +-
.../data/scripts/gracia/GraciaLoader.java | 8 +-
.../{ => HallOfSuffering}/32530-00.htm | 2 +-
.../{ => HallOfSuffering}/32530-01.htm | 2 +-
.../{ => HallOfSuffering}/32530-02.htm | 2 +-
.../{ => HallOfSuffering}/32530-03.htm | 2 +-
.../{ => HallOfSuffering}/32530-04.htm | 2 +-
.../{ => HallOfSuffering}/32530-05.htm | 2 +-
.../{ => HallOfSuffering}/32530-06.htm | 2 +-
.../{ => HallOfSuffering}/32530-07.htm | 2 +-
.../{ => HallOfSuffering}/32530-08.htm | 2 +-
.../{ => HallOfSuffering}/32530-09.htm | 2 +-
.../{ => HallOfSuffering}/32530-10.htm | 0
.../{ => HallOfSuffering}/32530-11.htm | 0
.../HallOfSuffering.java | 431 +-
.../KeucereusNorthController.java | 4 +-
.../KeucereusSouthController.java | 4 +-
.../vehicles/SoDController/SoDController.java | 4 +-
.../vehicles/SoIController/SoIController.java | 4 +-
.../data/scripts/handlers/MasterHandler.java | 4 +-
.../actionhandlers/L2PcInstanceAction.java | 20 +-
.../actionhandlers/L2PetInstanceAction.java | 23 +-
.../actionhandlers/L2SummonAction.java | 17 +-
.../actionshifthandlers/L2NpcActionShift.java | 4 +-
.../admincommandhandlers/AdminAdmin.java | 6 +-
.../AdminAnnouncements.java | 2 +-
.../admincommandhandlers/AdminBuffs.java | 2 +-
.../admincommandhandlers/AdminCHSiege.java | 2 +-
.../admincommandhandlers/AdminCastle.java | 2 +-
.../AdminChangeAccessLevel.java | 6 +-
.../admincommandhandlers/AdminClan.java | 2 +-
.../admincommandhandlers/AdminClanHall.java | 2 +-
.../AdminDoorControl.java | 4 +-
.../admincommandhandlers/AdminEditChar.java | 15 +-
.../AdminEventEngine.java | 8 +-
.../admincommandhandlers/AdminExpSp.java | 2 +-
.../AdminFightCalculator.java | 2 +-
.../admincommandhandlers/AdminGeoEditor.java | 116 -
.../admincommandhandlers/AdminGm.java | 4 +-
.../admincommandhandlers/AdminGmChat.java | 4 +-
.../admincommandhandlers/AdminHellbound.java | 4 +-
.../admincommandhandlers/AdminLevel.java | 10 +-
.../admincommandhandlers/AdminMenu.java | 6 +-
.../admincommandhandlers/AdminMobGroup.java | 2 +-
.../admincommandhandlers/AdminPathNode.java | 4 +-
.../admincommandhandlers/AdminPledge.java | 2 +-
.../admincommandhandlers/AdminPolymorph.java | 2 +-
.../admincommandhandlers/AdminPunishment.java | 2 +-
.../admincommandhandlers/AdminReload.java | 78 +-
.../admincommandhandlers/AdminRide.java | 2 +-
.../admincommandhandlers/AdminServerInfo.java | 2 +-
.../admincommandhandlers/AdminShop.java | 2 +-
.../admincommandhandlers/AdminSkill.java | 8 +-
.../admincommandhandlers/AdminSpawn.java | 8 +-
.../admincommandhandlers/AdminSummon.java | 6 +-
.../admincommandhandlers/AdminTeleport.java | 2 +-
.../handlers/bypasshandlers/Multisell.java | 2 +-
.../bypasshandlers/OlympiadManagerLink.java | 19 +-
.../handlers/bypasshandlers/QuestLink.java | 2 +-
.../handlers/bypasshandlers/SkillList.java | 2 +-
.../handlers/bypasshandlers/SupportMagic.java | 31 +-
.../bypasshandlers/TerritoryStatus.java | 2 +-
.../scripts/handlers/bypasshandlers/Wear.java | 2 +-
.../handlers/communityboard/ClanBoard.java | 2 +-
.../handlers/communityboard/HomeBoard.java | 4 +-
.../handlers/communityboard/RegionBoard.java | 2 +-
.../handlers/effecthandlers/Blink.java | 12 +-
.../handlers/effecthandlers/EnemyCharge.java | 13 +-
.../scripts/handlers/effecthandlers/Fear.java | 11 +-
.../effecthandlers/HeadquarterCreate.java | 2 +-
.../handlers/effecthandlers/Pumping.java | 2 +-
.../handlers/effecthandlers/RebalanceHP.java | 31 +-
.../handlers/effecthandlers/Reeling.java | 2 +-
.../effecthandlers/ServitorShare.java | 4 +-
.../handlers/effecthandlers/Spoil.java | 5 +-
.../handlers/effecthandlers/Summon.java | 28 +-
.../handlers/effecthandlers/SummonNpc.java | 2 +-
.../handlers/effecthandlers/SummonPet.java | 6 +-
.../handlers/effecthandlers/SummonTrap.java | 2 +-
.../effecthandlers/TeleportToTarget.java | 8 +-
.../handlers/effecthandlers/ThrowUp.java | 12 +-
.../effecthandlers/Transformation.java | 2 +-
.../handlers/effecthandlers/Unsummon.java | 15 +-
.../handlers/itemhandlers/BeastSoulShot.java | 55 +-
.../itemhandlers/BeastSpiritShot.java | 57 +-
.../handlers/itemhandlers/PetFood.java | 2 +-
.../handlers/itemhandlers/Recipes.java | 2 +-
.../handlers/itemhandlers/SummonItems.java | 4 +-
.../handlers/targethandlers/AreaFriendly.java | 3 +-
.../handlers/targethandlers/AreaSummon.java | 10 +-
.../scripts/handlers/targethandlers/Clan.java | 24 +-
.../targethandlers/CommandChannel.java | 12 +-
.../handlers/targethandlers/EnemySummon.java | 2 +-
.../handlers/targethandlers/OneFriendly.java | 99 +
.../handlers/targethandlers/Party.java | 24 +-
.../handlers/targethandlers/PartyClan.java | 32 +-
.../handlers/targethandlers/PartyMember.java | 2 +-
.../handlers/targethandlers/PartyNotMe.java | 31 +-
.../handlers/targethandlers/PcBody.java | 2 +-
.../scripts/handlers/targethandlers/Pet.java | 6 +-
.../handlers/targethandlers/Servitor.java | 8 +-
.../handlers/targethandlers/Summon.java | 20 +-
.../handlers/targethandlers/TargetParty.java | 12 +-
.../handlers/telnethandlers/ChatsHandler.java | 6 +-
.../handlers/telnethandlers/DebugHandler.java | 4 +-
.../telnethandlers/PlayerHandler.java | 2 +-
.../telnethandlers/ReloadHandler.java | 6 +-
.../telnethandlers/StatusHandler.java | 6 +-
.../handlers/usercommandhandlers/Mount.java | 2 +-
.../voicedcommandhandlers/ChatAdmin.java | 8 +-
.../handlers/voicedcommandhandlers/Debug.java | 4 +-
.../voicedcommandhandlers/Hellbound.java | 4 +-
.../data/scripts/hellbound/AI/Chimeras.java | 3 +-
.../scripts/hellbound/AI/HellboundCore.java | 3 +-
.../hellbound/AI/NPC/Bernarde/Bernarde.java | 3 +-
.../scripts/hellbound/AI/NPC/Buron/Buron.java | 3 +-
.../scripts/hellbound/AI/NPC/Hude/Hude.java | 5 +-
.../scripts/hellbound/AI/NPC/Jude/Jude.java | 3 +-
.../scripts/hellbound/AI/NPC/Kief/Kief.java | 3 +-
.../hellbound/AI/NPC/Natives/Natives.java | 9 +-
.../hellbound/AI/NPC/Quarry/Quarry.java | 3 +-
.../hellbound/AI/NPC/Solomon/Solomon.java | 3 +-
.../hellbound/AI/NPC/Warpgate/Warpgate.java | 2 +-
.../scripts/hellbound/AI/OutpostCaptain.java | 7 +-
.../data/scripts/hellbound/AI/Slaves.java | 2 +-
.../AI/Zones/AnomicFoundry/AnomicFoundry.java | 4 +-
.../AI/Zones/BaseTower/BaseTower.java | 8 +-
.../TowerOfInfinitum/TowerOfInfinitum.java | 4 +-
.../AI/Zones/TowerOfNaia/TowerOfNaia.java | 14 +-
.../AI/Zones/TullyWorkshop/TullyWorkshop.java | 20 +-
.../scripts/hellbound/HellboundEngine.java | 4 +-
.../scripts/hellbound/HellboundPointData.java | 4 +-
.../scripts/hellbound/HellboundSpawns.java | 6 +-
.../Instances/UrbanArea/UrbanArea.java | 4 +-
.../CavernOfThePirateCaptain.java | 7 +-
.../CrystalCaverns/CrystalCaverns.java | 38 +-
.../DisciplesNecropolisPast.java | 3 +-
.../FinalEmperialTomb/FinalEmperialTomb.java | 13 +-
.../HideoutOfTheDawn/HideoutOfTheDawn.java | 3 +-
.../IceQueensCastleHardBattle.java | 14 +-
.../IceQueensCastleNormalBattle.java | 14 +-
.../scripts/instances/Kamaloka/Kamaloka.java | 12 +-
.../MonasteryOfSilence1.java | 7 +-
.../NornilsGarden/NornilsGarden.java | 13 +-
.../quests/Q00023_LidiasHeart/31328-01.htm | 4 +
.../quests/Q00023_LidiasHeart/31328-01a.html | 6 +
.../quests/Q00023_LidiasHeart/31328-02.htm | 4 +
.../quests/Q00023_LidiasHeart/31328-03.htm | 4 +
.../quests/Q00023_LidiasHeart/31328-04.html | 4 +
.../quests/Q00023_LidiasHeart/31328-05.html | 4 +
.../quests/Q00023_LidiasHeart/31328-06.html | 6 +
.../quests/Q00023_LidiasHeart/31328-07.html | 5 +
.../quests/Q00023_LidiasHeart/31328-08.html | 3 +
.../quests/Q00023_LidiasHeart/31328-09.html | 4 +
.../quests/Q00023_LidiasHeart/31328-10.html | 6 +
.../quests/Q00023_LidiasHeart/31328-11.html | 5 +
.../quests/Q00023_LidiasHeart/31328-12.html | 3 +
.../quests/Q00023_LidiasHeart/31328-13.html | 5 +
.../quests/Q00023_LidiasHeart/31328-14.html | 5 +
.../quests/Q00023_LidiasHeart/31328-15.html | 5 +
.../quests/Q00023_LidiasHeart/31328-16.html | 7 +
.../quests/Q00023_LidiasHeart/31328-17.html | 5 +
.../quests/Q00023_LidiasHeart/31328-18.html | 8 +
.../quests/Q00023_LidiasHeart/31328-19.html | 5 +
.../quests/Q00023_LidiasHeart/31328-20.html | 6 +
.../quests/Q00023_LidiasHeart/31328-21.html | 3 +
.../quests/Q00023_LidiasHeart/31328-22.html | 3 +
.../quests/Q00023_LidiasHeart/31386-01.html | 6 +
.../quests/Q00023_LidiasHeart/31386-02.html | 5 +
.../quests/Q00023_LidiasHeart/31386-03.html | 5 +
.../quests/Q00023_LidiasHeart/31386-04.html | 4 +
.../quests/Q00023_LidiasHeart/31523-01.html | 4 +
.../quests/Q00023_LidiasHeart/31523-02.html | 3 +
.../quests/Q00023_LidiasHeart/31523-03.html | 3 +
.../quests/Q00023_LidiasHeart/31523-04.html | 5 +
.../quests/Q00023_LidiasHeart/31523-05.html | 4 +
.../quests/Q00023_LidiasHeart/31523-06.html | 3 +
.../quests/Q00023_LidiasHeart/31524-01.html | 4 +
.../quests/Q00023_LidiasHeart/31524-02.html | 4 +
.../quests/Q00023_LidiasHeart/31524-03.html | 4 +
.../quests/Q00023_LidiasHeart/31524-04.html | 5 +
.../quests/Q00023_LidiasHeart/31524-05.html | 4 +
.../quests/Q00023_LidiasHeart/31524-06.html | 3 +
.../quests/Q00023_LidiasHeart/31526-01.html | 4 +
.../quests/Q00023_LidiasHeart/31526-02.html | 6 +
.../quests/Q00023_LidiasHeart/31526-03.html | 5 +
.../quests/Q00023_LidiasHeart/31526-04.html | 4 +
.../quests/Q00023_LidiasHeart/31526-05.html | 6 +
.../quests/Q00023_LidiasHeart/31526-06.html | 4 +
.../quests/Q00023_LidiasHeart/31526-07.html | 4 +
.../quests/Q00023_LidiasHeart/31526-07a.html | 4 +
.../quests/Q00023_LidiasHeart/31526-08.html | 5 +
.../quests/Q00023_LidiasHeart/31526-09.html | 6 +
.../quests/Q00023_LidiasHeart/31526-10.html | 4 +
.../quests/Q00023_LidiasHeart/31526-11.html | 4 +
.../quests/Q00023_LidiasHeart/31526-12.html | 4 +
.../quests/Q00023_LidiasHeart/31526-13.html | 3 +
.../quests/Q00023_LidiasHeart/31530-01.html | 4 +
.../quests/Q00023_LidiasHeart/31530-02.html | 3 +
.../quests/Q00023_LidiasHeart/31530-03.html | 3 +
.../Q00023_LidiasHeart.java | 509 +
...00024_InhabitantsOfTheForestOfTheDead.java | 4 +-
.../Q00144_PailakaInjuredDragon.java | 10 +-
.../quests/Q00177_SplitDestiny/32615-02.htm | 2 +-
.../Q00177_SplitDestiny.java | 2 +-
.../Q00357_WarehouseKeepersAmbition.java | 8 +-
.../Q00421_LittleWingsBigAdventure.java | 11 +-
.../Q00511_AwlUnderFoot.java | 2 +-
.../Q00619_RelicsOfTheOldEmpire.java | 2 +-
.../35627-01.html | 5 +
.../35627-02.html | 4 +
.../35627-03.html | 4 +
.../35627-04.html | 3 +
.../35627-05.html | 4 +
.../35627-06.html | 7 +
.../35627-06a.html | 3 +
.../35627-07.html | 3 +
.../35627-08.html | 6 +
.../35627-09.html | 4 +
.../35627-10.html | 4 +
.../35627-11.html | 3 +
.../Q00655_AGrandPlanForTamingWildBeasts.java | 258 +
.../Q10292_SevenSignsGirlOfDoubt.java | 14 +-
.../Q10323_TrainLikeItsReal.java | 6 +-
.../Q10741_ADraughtForTheCold/33951-01.htm | 6 +
.../Q10741_ADraughtForTheCold/33951-02.htm | 5 +
.../Q10741_ADraughtForTheCold/33951-03.htm | 4 +
.../Q10741_ADraughtForTheCold/33951-04.htm | 3 +
.../Q10741_ADraughtForTheCold/33951-05.htm | 4 +
.../Q10741_ADraughtForTheCold/33952-01.htm | 6 +
.../Q10741_ADraughtForTheCold/33952-02.htm | 4 +
.../Q10741_ADraughtForTheCold.java | 168 +
.../quests/Q10742_AFurryFriend/33952-01.htm | 6 +
.../quests/Q10742_AFurryFriend/33952-02.htm | 7 +
.../quests/Q10742_AFurryFriend/33952-03.htm | 6 +
.../quests/Q10742_AFurryFriend/33952-04.htm | 5 +
.../quests/Q10742_AFurryFriend/33952-05.htm | 3 +
.../quests/Q10742_AFurryFriend/33995-01.htm | 4 +
.../quests/Q10742_AFurryFriend/33995-02.htm | 4 +
.../quests/Q10742_AFurryFriend/33995-03.htm | 3 +
.../Q10742_AFurryFriend.java | 245 +
.../quests/Q10743_StrangeFungus/33952-01.htm | 6 +
.../quests/Q10743_StrangeFungus/33952-02.htm | 7 +
.../quests/Q10743_StrangeFungus/33952-03.htm | 4 +
.../quests/Q10743_StrangeFungus/33953-01.htm | 5 +
.../quests/Q10743_StrangeFungus/33953-02.htm | 6 +
.../quests/Q10743_StrangeFungus/33953-03.htm | 9 +
.../Q10743_StrangeFungus.java | 173 +
.../Q10744_StrongerThanSteel/33953-01.htm | 5 +
.../Q10744_StrongerThanSteel/33953-02.htm | 5 +
.../Q10744_StrongerThanSteel/33953-03.htm | 4 +
.../Q10744_StrongerThanSteel/33954-01.htm | 6 +
.../Q10744_StrongerThanSteel/33954-02.htm | 6 +
.../Q10744_StrongerThanSteel/33954-03.htm | 5 +
.../Q10744_StrongerThanSteel/33954-04.htm | 5 +
.../Q10744_StrongerThanSteel.java | 160 +
.../scripts/quests/QuestMasterHandler.java | 14 +-
.../scripts/vehicles/BoatGiranTalking.java | 286 -
.../scripts/vehicles/BoatTalkingGludin.java | 284 -
.../ProofOfCourage/ProofOfCourage.java | 2 +-
.../ProofOfJustice/ProofOfJustice.java | 2 +-
.../dist/game/data/skillTrees/AbyssWalker.xml | 10 +-
.../dist/game/data/skillTrees/Adventurer.xml | 20 +-
.../game/data/skillTrees/AeoreCardinal.xml | 12 +
.../game/data/skillTrees/AeoreEva'sSaint.xml | 12 +
.../data/skillTrees/AeoreShillienSaint.xml | 21 +
.../dist/game/data/skillTrees/Arbalester.xml | 8 +-
.../dist/game/data/skillTrees/ArcanaLord.xml | 16 +-
trunk/dist/game/data/skillTrees/Archmage.xml | 14 +-
trunk/dist/game/data/skillTrees/Berserker.xml | 8 +-
trunk/dist/game/data/skillTrees/Bishop.xml | 8 +-
.../dist/game/data/skillTrees/Bladedancer.xml | 13 +-
.../game/data/skillTrees/BountyHunter.xml | 8 +-
trunk/dist/game/data/skillTrees/Cardinal.xml | 14 +-
.../game/data/skillTrees/CloudBreaker.xml | 8 +-
.../dist/game/data/skillTrees/DarkAvenger.xml | 8 +-
.../dist/game/data/skillTrees/DarkFighter.xml | 7 +-
.../dist/game/data/skillTrees/DarkMystic.xml | 7 +-
trunk/dist/game/data/skillTrees/Destroyer.xml | 8 +-
trunk/dist/game/data/skillTrees/Dominator.xml | 16 +-
.../dist/game/data/skillTrees/Doombringer.xml | 16 +-
trunk/dist/game/data/skillTrees/Doomcryer.xml | 14 +-
.../dist/game/data/skillTrees/Dreadnought.xml | 16 +-
trunk/dist/game/data/skillTrees/Duelist.xml | 16 +-
.../game/data/skillTrees/DwarvenFighter.xml | 7 +-
.../game/data/skillTrees/ElementalMaster.xml | 16 +-
.../game/data/skillTrees/ElemntalSummoner.xml | 8 +-
.../dist/game/data/skillTrees/ElvenElder.xml | 12 +-
.../game/data/skillTrees/ElvenFighter.xml | 7 +-
.../dist/game/data/skillTrees/ElvenMystic.xml | 7 +-
trunk/dist/game/data/skillTrees/EvaSaint.xml | 14 +-
.../dist/game/data/skillTrees/EvaTemplar.xml | 20 +-
.../dist/game/data/skillTrees/Eviscerator.xml | 10 +-
.../data/skillTrees/FemaleSoulBreaker.xml | 8 +-
.../game/data/skillTrees/FemaleSoulHound.xml | 18 +-
.../game/data/skillTrees/FemalerSoldier.xml | 9 +-
.../game/data/skillTrees/FeohArchmage.xml | 17 +-
.../game/data/skillTrees/FeohMysticMuse.xml | 17 +-
.../game/data/skillTrees/FeohSoulhound.xml | 9 +
.../game/data/skillTrees/FeohSoultaker.xml | 19 +-
.../data/skillTrees/FeohStormScreamer.xml | 18 +-
.../game/data/skillTrees/FortuneSeeker.xml | 20 +-
.../dist/game/data/skillTrees/GhostHunter.xml | 20 +-
.../game/data/skillTrees/GhostSentinel.xml | 16 +-
trunk/dist/game/data/skillTrees/Gladiator.xml | 8 +-
.../game/data/skillTrees/GrandKhavatari.xml | 18 +-
trunk/dist/game/data/skillTrees/Hawkeye.xml | 8 +-
.../dist/game/data/skillTrees/HellKnight.xml | 22 +-
.../dist/game/data/skillTrees/Hierophant.xml | 14 +-
.../game/data/skillTrees/HumanFighter.xml | 7 +-
.../dist/game/data/skillTrees/HumanMystic.xml | 7 +-
trunk/dist/game/data/skillTrees/Inspector.xml | 14 +-
.../game/data/skillTrees/IssDominator.xml | 14 +
.../game/data/skillTrees/IssDoomcryer.xml | 14 +
.../game/data/skillTrees/IssHierophant.xml | 14 +
.../data/skillTrees/IssSpectralDancer.xml | 14 +
.../game/data/skillTrees/IssSwordMuse.xml | 16 +-
trunk/dist/game/data/skillTrees/Judicator.xml | 6 +-
.../data/skillTrees/KamaelMaleSoldier.xml | 9 +-
trunk/dist/game/data/skillTrees/Maestro.xml | 18 +-
.../game/data/skillTrees/MaleSoulBreaker.xml | 8 +-
.../game/data/skillTrees/MaleSoulHound.xml | 18 +-
trunk/dist/game/data/skillTrees/Marauder.xml | 8 +-
.../data/skillTrees/MoonlightSentinel.xml | 16 +-
.../dist/game/data/skillTrees/MysticMuse.xml | 14 +-
.../dist/game/data/skillTrees/Necromancer.xml | 8 +-
.../dist/game/data/skillTrees/OrcFighter.xml | 7 +-
trunk/dist/game/data/skillTrees/OrcMystic.xml | 7 +-
.../game/data/skillTrees/OthellAdventurer.xml | 13 +-
.../data/skillTrees/OthellFortuneSeeker.xml | 13 +-
.../data/skillTrees/OthellGhostHunter.xml | 14 +-
.../game/data/skillTrees/OthellWindRider.xml | 14 +-
trunk/dist/game/data/skillTrees/Overlord.xml | 14 +-
trunk/dist/game/data/skillTrees/Paladin.xml | 8 +-
.../game/data/skillTrees/PhantomRanger.xml | 8 +-
.../game/data/skillTrees/PhantomSummoner.xml | 8 +-
.../game/data/skillTrees/PhoenixKnight.xml | 22 +-
.../game/data/skillTrees/PlainsWalker.xml | 10 +-
trunk/dist/game/data/skillTrees/Prophet.xml | 12 +-
trunk/dist/game/data/skillTrees/Rogue.xml | 8 +-
.../dist/game/data/skillTrees/Sagittarius.xml | 16 +-
.../dist/game/data/skillTrees/Sayha'sSeer.xml | 10 +-
.../game/data/skillTrees/ShillienElder.xml | 12 +-
.../game/data/skillTrees/ShillienKnight.xml | 8 +-
.../game/data/skillTrees/ShillienSaint.xml | 14 +-
.../game/data/skillTrees/ShillienTemplar.xml | 20 +-
.../data/skillTrees/SigelEva'sTemplar.xml | 26 +-
.../game/data/skillTrees/SigelHellKnight.xml | 26 +-
.../data/skillTrees/SigelPhoenixKnight.xml | 27 +-
.../data/skillTrees/SigelShillienTemplar.xml | 17 +-
.../game/data/skillTrees/SilverRanger.xml | 8 +-
trunk/dist/game/data/skillTrees/Sorcerer.xml | 8 +-
trunk/dist/game/data/skillTrees/Soultaker.xml | 14 +-
.../game/data/skillTrees/SpectralDancer.xml | 20 +-
.../game/data/skillTrees/SpectralMaster.xml | 16 +-
.../dist/game/data/skillTrees/Spelljowler.xml | 8 +-
.../dist/game/data/skillTrees/Spellsinger.xml | 8 +-
.../game/data/skillTrees/StormScreamer.xml | 14 +-
trunk/dist/game/data/skillTrees/Swordmuse.xml | 20 +-
.../dist/game/data/skillTrees/Swordsinger.xml | 13 +-
.../game/data/skillTrees/TempleKnight.xml | 8 +-
trunk/dist/game/data/skillTrees/Titan.xml | 16 +-
.../game/data/skillTrees/TreasureHunter.xml | 2 +-
trunk/dist/game/data/skillTrees/Trickster.xml | 14 +-
trunk/dist/game/data/skillTrees/Tyrant.xml | 8 +-
.../game/data/skillTrees/TyrrDoombringer.xml | 20 +-
.../game/data/skillTrees/TyrrDreadnought.xml | 20 +-
.../dist/game/data/skillTrees/TyrrDuelist.xml | 43 +-
.../data/skillTrees/TyrrGrandKhavatari.xml | 45 +-
.../dist/game/data/skillTrees/TyrrMaestro.xml | 14 +
trunk/dist/game/data/skillTrees/TyrrTitan.xml | 20 +-
trunk/dist/game/data/skillTrees/Warcryer.xml | 16 +-
trunk/dist/game/data/skillTrees/Warlock.xml | 8 +-
trunk/dist/game/data/skillTrees/Warlord.xml | 8 +-
trunk/dist/game/data/skillTrees/Warsmith.xml | 8 +-
trunk/dist/game/data/skillTrees/WindRider.xml | 20 +-
.../game/data/skillTrees/WynnArcanaLord.xml | 12 +
.../data/skillTrees/WynnElementalMaster.xml | 15 +
.../data/skillTrees/WynnSpectralMaster.xml | 14 +-
.../game/data/skillTrees/YulGhostSentinel.xml | 9 +
.../data/skillTrees/YulMoonlightSentinel.xml | 9 +
.../game/data/skillTrees/YulSagittarius.xml | 9 +
.../game/data/skillTrees/YulTrickster.xml | 9 +
.../data/skillTrees/revelationSkillTree.xml | 12 +
.../data/skillTrees/transferSkillTree.xml | 414 +-
.../stats/chars/baseStats/AbyssWalker.xml | 4 +-
.../data/stats/chars/baseStats/Adventurer.xml | 4 +-
.../stats/chars/baseStats/AeoreCardinal.xml | 2 +-
.../stats/chars/baseStats/AeoreEva'sSaint.xml | 2 +-
.../chars/baseStats/AeoreShillienSaint.xml | 2 +-
.../data/stats/chars/baseStats/Arbalester.xml | 4 +-
.../data/stats/chars/baseStats/ArcanaLord.xml | 2 +-
.../data/stats/chars/baseStats/Archmage.xml | 2 +-
.../data/stats/chars/baseStats/Artisan.xml | 4 +-
.../data/stats/chars/baseStats/Assassin.xml | 4 +-
.../data/stats/chars/baseStats/Berserker.xml | 4 +-
.../data/stats/chars/baseStats/Bishop.xml | 2 +-
.../stats/chars/baseStats/Bladedancer.xml | 4 +-
.../stats/chars/baseStats/BountyHunter.xml | 4 +-
.../data/stats/chars/baseStats/Cardinal.xml | 2 +-
.../data/stats/chars/baseStats/Cleric.xml | 2 +-
.../stats/chars/baseStats/CloudBreaker.xml | 2 +-
.../stats/chars/baseStats/DarkAvenger.xml | 4 +-
.../stats/chars/baseStats/DarkFighter.xml | 4 +-
.../data/stats/chars/baseStats/DarkMystic.xml | 2 +-
.../data/stats/chars/baseStats/DarkWizard.xml | 2 +-
.../data/stats/chars/baseStats/Destroyer.xml | 4 +-
.../data/stats/chars/baseStats/Dominator.xml | 2 +-
.../stats/chars/baseStats/Doombringer.xml | 4 +-
.../data/stats/chars/baseStats/Doomcryer.xml | 2 +-
.../stats/chars/baseStats/Dreadnought.xml | 4 +-
.../data/stats/chars/baseStats/Duelist.xml | 4 +-
.../stats/chars/baseStats/DwarvenFighter.xml | 4 +-
.../stats/chars/baseStats/ElementalMaster.xml | 2 +-
.../chars/baseStats/ElementalSummoner.xml | 2 +-
.../data/stats/chars/baseStats/ElvenElder.xml | 2 +-
.../stats/chars/baseStats/ElvenFighter.xml | 4 +-
.../stats/chars/baseStats/ElvenKnight.xml | 4 +-
.../stats/chars/baseStats/ElvenMystic.xml | 2 +-
.../stats/chars/baseStats/ElvenOracle.xml | 2 +-
.../data/stats/chars/baseStats/ElvenScout.xml | 4 +-
.../stats/chars/baseStats/ElvenWizard.xml | 2 +-
.../stats/chars/baseStats/ErtheiaFighter.xml | 4 +-
.../stats/chars/baseStats/ErtheiaWizard.xml | 2 +-
.../data/stats/chars/baseStats/Eva'sSaint.xml | 2 +-
.../stats/chars/baseStats/Eva'sTemplar.xml | 4 +-
.../stats/chars/baseStats/Eviscerator.xml | 4 +-
.../chars/baseStats/FemaleKamaelSoldier.xml | 4 +-
.../chars/baseStats/FemaleSoulBraker.xml | 4 +-
.../stats/chars/baseStats/FemaleSoulHound.xml | 4 +-
.../stats/chars/baseStats/FeohArchmage.xml | 2 +-
.../stats/chars/baseStats/FeohMysticMuse.xml | 2 +-
.../stats/chars/baseStats/FeohSoultaker.xml | 2 +-
.../chars/baseStats/FeohStormScreamer.xml | 2 +-
.../stats/chars/baseStats/FortuneSeeker.xml | 4 +-
.../stats/chars/baseStats/GhostHunter.xml | 4 +-
.../stats/chars/baseStats/GhostSentinel.xml | 4 +-
.../data/stats/chars/baseStats/Gladiator.xml | 4 +-
.../stats/chars/baseStats/GrandKhavatari.xml | 4 +-
.../data/stats/chars/baseStats/HawkEye.xml | 4 +-
.../data/stats/chars/baseStats/HellKnight.xml | 4 +-
.../data/stats/chars/baseStats/Hierophant.xml | 2 +-
.../stats/chars/baseStats/HumanFighter.xml | 4 +-
.../stats/chars/baseStats/HumanKnight.xml | 4 +-
.../stats/chars/baseStats/HumanMystic.xml | 2 +-
.../stats/chars/baseStats/HumanWizard.xml | 2 +-
.../data/stats/chars/baseStats/Inspector.xml | 4 +-
.../stats/chars/baseStats/IssDominator.xml | 2 +-
.../stats/chars/baseStats/IssDoomcryer.xml | 2 +-
.../stats/chars/baseStats/IssHierophant.xml | 2 +-
.../chars/baseStats/IssSpectralDancer.xml | 4 +-
.../stats/chars/baseStats/IssSwordMuse.xml | 4 +-
.../data/stats/chars/baseStats/Judicator.xml | 4 +-
.../data/stats/chars/baseStats/Maestro.xml | 4 +-
.../chars/baseStats/MaleKamaelSoldier.xml | 4 +-
.../stats/chars/baseStats/MaleSoulBraker.xml | 4 +-
.../stats/chars/baseStats/MaleSoulHound.xml | 4 +-
.../data/stats/chars/baseStats/Marauder.xml | 4 +-
.../game/data/stats/chars/baseStats/Monk.xml | 4 +-
.../chars/baseStats/MoonlightSentinel.xml | 4 +-
.../data/stats/chars/baseStats/MysticMuse.xml | 2 +-
.../stats/chars/baseStats/Necromancer.xml | 2 +-
.../data/stats/chars/baseStats/OrcFighter.xml | 4 +-
.../data/stats/chars/baseStats/OrcMystic.xml | 2 +-
.../data/stats/chars/baseStats/OrcRaider.xml | 4 +-
.../data/stats/chars/baseStats/OrcShaman.xml | 2 +-
.../chars/baseStats/OthellAdventurer.xml | 4 +-
.../chars/baseStats/OthellFortuneSeeker.xml | 4 +-
.../chars/baseStats/OthellGhostHunter.xml | 4 +-
.../stats/chars/baseStats/OthellWindRider.xml | 4 +-
.../data/stats/chars/baseStats/Overlord.xml | 2 +-
.../data/stats/chars/baseStats/Paladin.xml | 4 +-
.../stats/chars/baseStats/PallusKnight.xml | 4 +-
.../stats/chars/baseStats/PhantomRanger.xml | 4 +-
.../stats/chars/baseStats/PhantomSummoner.xml | 2 +-
.../stats/chars/baseStats/PhoenixKnight.xml | 4 +-
.../stats/chars/baseStats/PlainsWalker.xml | 4 +-
.../data/stats/chars/baseStats/Prophet.xml | 2 +-
.../data/stats/chars/baseStats/Ripper.xml | 4 +-
.../game/data/stats/chars/baseStats/Rogue.xml | 4 +-
.../stats/chars/baseStats/Sagittarius.xml | 4 +-
.../stats/chars/baseStats/Sayha'sSeer.xml | 2 +-
.../data/stats/chars/baseStats/Scavenger.xml | 4 +-
.../stats/chars/baseStats/ShillienElder.xml | 2 +-
.../stats/chars/baseStats/ShillienKnight.xml | 4 +-
.../stats/chars/baseStats/ShillienOracle.xml | 2 +-
.../stats/chars/baseStats/ShillienSaint.xml | 2 +-
.../stats/chars/baseStats/ShillienTemplar.xml | 4 +-
.../chars/baseStats/SigelEva'sTemplar.xml | 4 +-
.../stats/chars/baseStats/SigelHellKnight.xml | 4 +-
.../chars/baseStats/SigelPhoenixKnight.xml | 4 +-
.../chars/baseStats/SigelShillienTemplar.xml | 4 +-
.../stats/chars/baseStats/SilverRanger.xml | 4 +-
.../data/stats/chars/baseStats/Sorcerer.xml | 2 +-
.../data/stats/chars/baseStats/Soultaker.xml | 2 +-
.../stats/chars/baseStats/SpectralDancer.xml | 4 +-
.../stats/chars/baseStats/SpectralMaster.xml | 2 +-
.../stats/chars/baseStats/Spellhowler.xml | 2 +-
.../stats/chars/baseStats/Spellsinger.xml | 2 +-
.../stats/chars/baseStats/StormScreamer.xml | 2 +-
.../stats/chars/baseStats/Stratomancer.xml | 2 +-
.../data/stats/chars/baseStats/SwordMuse.xml | 4 +-
.../stats/chars/baseStats/SwordSinger.xml | 4 +-
.../stats/chars/baseStats/TempleKnight.xml | 4 +-
.../game/data/stats/chars/baseStats/Titan.xml | 4 +-
.../stats/chars/baseStats/TreasureHunter.xml | 4 +-
.../data/stats/chars/baseStats/Trickster.xml | 4 +-
.../data/stats/chars/baseStats/Trooper.xml | 4 +-
.../data/stats/chars/baseStats/Tyrant.xml | 4 +-
.../stats/chars/baseStats/TyrrDoombringer.xml | 4 +-
.../stats/chars/baseStats/TyrrDreadnought.xml | 4 +-
.../stats/chars/baseStats/TyrrDuelist.xml | 4 +-
.../chars/baseStats/TyrrGrandKhavatari.xml | 4 +-
.../stats/chars/baseStats/TyrrMaestro.xml | 4 +-
.../data/stats/chars/baseStats/TyrrTyrant.xml | 4 +-
.../data/stats/chars/baseStats/Warcryer.xml | 2 +-
.../data/stats/chars/baseStats/Warder.xml | 4 +-
.../data/stats/chars/baseStats/Warlock.xml | 2 +-
.../data/stats/chars/baseStats/Warlord.xml | 4 +-
.../data/stats/chars/baseStats/Warrior.xml | 4 +-
.../data/stats/chars/baseStats/Warsmith.xml | 4 +-
.../data/stats/chars/baseStats/WindRider.xml | 4 +-
.../stats/chars/baseStats/WynnArcanaLord.xml | 2 +-
.../chars/baseStats/WynnElementalMaster.xml | 2 +-
.../chars/baseStats/WynnSpectralMaster.xml | 2 +-
.../stats/chars/baseStats/YulGhostHunter.xml | 4 +-
.../chars/baseStats/YulMoonlightSentinel.xml | 4 +-
.../stats/chars/baseStats/YulSagittarius.xml | 4 +-
.../stats/chars/baseStats/YulTrickster.xml | 4 +-
.../game/data/stats/items/08100-08199.xml | 2 +
.../dist/game/data/stats/npcs/19500-19600.xml | 2 +-
.../dist/game/data/stats/npcs/23400-23500.xml | 480 +-
.../game/data/stats/skills/00000-00099.xml | 8 +-
.../game/data/stats/skills/00200-00299.xml | 8 +-
.../game/data/stats/skills/00300-00399.xml | 5 +-
.../game/data/stats/skills/00400-00499.xml | 3 +-
.../game/data/stats/skills/00700-00799.xml | 5 +-
.../game/data/stats/skills/00900-00999.xml | 9 +-
.../game/data/stats/skills/01100-01199.xml | 20 +-
.../game/data/stats/skills/01200-01299.xml | 35 +-
.../game/data/stats/skills/01300-01399.xml | 20 +-
.../game/data/stats/skills/01400-01499.xml | 15 +-
.../game/data/stats/skills/01900-01999.xml | 338 +-
.../game/data/stats/skills/05100-05199.xml | 18 +-
.../game/data/stats/skills/07000-07099.xml | 6 +-
.../game/data/stats/skills/08200-08299.xml | 2 +-
.../game/data/stats/skills/11000-11099.xml | 140 +-
.../game/data/stats/skills/11700-11799.xml | 135 +-
.../game/data/stats/skills/11800-11899.xml | 90 +-
.../game/data/stats/skills/21200-21299.xml | 20 +-
.../data/teleporters/TeleportDevice-Elven.xml | 30 +
.../teleporters/TeleportDevice-Kamael.xml | 30 +
trunk/dist/game/data/xsd/skills.xsd | 8 +-
trunk/dist/tools/sql/game/announcements.sql | 3 +-
.../dist/tools/sql/game/character_summons.sql | 1 +
trunk/dist/tools/sql/game/spawnlist.sql | 231 +-
trunk/java/com/l2jserver/Config.java | 69 +-
.../com/l2jserver/gameserver/GameServer.java | 119 +-
.../com/l2jserver/gameserver/GeoData.java | 48 +-
.../com/l2jserver/gameserver/MonsterRace.java | 2 +-
.../gameserver/RecipeController.java | 2 +-
.../com/l2jserver/gameserver/Shutdown.java | 4 +-
.../l2jserver/gameserver/ai/AbstractAI.java | 7 +-
.../gameserver/ai/L2AttackableAI.java | 8 +-
.../gameserver/ai/L2CharacterAI.java | 3 +-
.../l2jserver/gameserver/ai/L2SummonAI.java | 3 +-
.../communitybbs/Manager/TopicBBSManager.java | 2 +-
.../sql/impl}/AnnouncementsTable.java | 6 +-
.../sql/impl}/CharNameTable.java | 6 +-
.../sql/impl}/CharSummonTable.java | 62 +-
.../sql/impl}/ClanTable.java | 2 +-
.../sql/impl}/CrestTable.java | 3 +-
.../sql/impl}/NpcBufferTable.java | 2 +-
.../sql/impl}/OfflineTradersTable.java | 2 +-
.../sql/impl}/PetNameTable.java | 5 +-
.../sql/impl}/SummonEffectsTable.java | 2 +-
.../sql/impl}/SummonSkillsTable.java | 3 +-
.../sql/impl}/TeleportLocationTable.java | 2 +-
.../sql/impl}/TerritoryTable.java | 2 +-
.../xml/IXmlReader.java} | 6 +-
.../xml/impl}/AbilityPointsData.java | 6 +-
.../xml/impl/AdminData.java} | 23 +-
.../xml/impl}/ArmorSetsData.java | 9 +-
.../xml/impl}/BeautyShopData.java | 6 +-
.../xml/impl}/BuyListData.java | 8 +-
.../xml/impl}/CastleData.java | 6 +-
.../xml/impl}/CategoryData.java | 19 +-
.../xml/impl}/ClassListData.java | 15 +-
.../xml/impl/DoorData.java} | 14 +-
.../xml/impl}/EnchantItemData.java | 12 +-
.../xml/impl}/EnchantItemGroupsData.java | 7 +-
.../xml/impl}/EnchantItemHPBonusData.java | 7 +-
.../xml/impl}/EnchantItemOptionsData.java | 6 +-
.../xml/impl}/EnchantSkillGroupsData.java | 6 +-
.../xml/impl/ExperienceData.java} | 12 +-
.../xml/impl}/FishData.java | 12 +-
.../xml/impl}/FishingMonstersData.java | 8 +-
.../xml/impl}/FishingRodsData.java | 8 +-
.../xml/impl}/HennaData.java | 8 +-
.../xml/impl/HitConditionBonusData.java} | 32 +-
.../xml/impl}/InitialEquipmentData.java | 8 +-
.../xml/impl}/InitialShortcutData.java | 6 +-
.../xml/impl}/ItemCrystalizationData.java | 6 +-
.../xml/impl}/KarmaData.java | 6 +-
.../xml/impl}/MultisellData.java | 14 +-
.../xml/impl}/NpcData.java | 9 +-
.../xml/impl/OptionData.java} | 22 +-
.../xml/impl}/PetDataTable.java | 10 +-
.../xml/impl/PlayerTemplateData.java} | 36 +-
.../xml/impl}/PlayerXpPercentLostData.java | 8 +-
.../xml/impl}/RecipeData.java | 8 +-
.../xml/impl}/SecondaryAuthData.java | 8 +-
.../xml/impl}/ShuttleData.java | 6 +-
.../xml/impl}/SiegeScheduleData.java | 6 +-
.../xml/impl}/SkillLearnData.java | 6 +-
.../xml/impl}/SkillTreesData.java | 73 +-
.../xml/impl/StaticObjectData.java} | 14 +-
.../xml/impl}/TeleportersData.java | 6 +-
.../xml/impl}/TransformData.java | 6 +-
.../{datatables => data/xml/impl}/UIData.java | 6 +-
.../datatables/AugmentationData.java | 6 +-
.../gameserver/datatables/BotReportTable.java | 1 +
.../gameserver/datatables/ItemTable.java | 19 +-
.../datatables/MerchantPriceConfigTable.java | 1 +
.../gameserver/datatables/SkillData.java | 3 +-
.../gameserver/datatables/SpawnTable.java | 5 +-
.../gameserver/engines/DocumentBase.java | 18 +-
.../engines/skills/DocumentSkill.java | 2 +-
.../l2jserver/gameserver/enums/MountType.java | 2 +-
.../geoeditorcon/GeoEditorListener.java | 114 -
.../geoeditorcon/GeoEditorThread.java | 287 -
.../gameserver/idfactory/IdFactory.java | 3 +-
.../instancemanager/CastleManorManager.java | 4 +-
.../instancemanager/ClanHallManager.java | 2 +-
.../FortSiegeGuardManager.java | 2 +-
.../FourSepulchersManager.java | 6 +-
.../instancemanager/GrandBossManager.java | 2 +-
.../instancemanager/InstanceManager.java | 4 +-
.../instancemanager/MapRegionManager.java | 4 +-
.../instancemanager/MercTicketManager.java | 2 +-
.../instancemanager/PetitionManager.java | 4 +-
.../instancemanager/RaidBossSpawnManager.java | 2 +-
.../instancemanager/SiegeGuardManager.java | 2 +-
.../instancemanager/WalkingManager.java | 4 +-
.../instancemanager/ZoneManager.java | 4 +-
.../gameserver/model/AutoSpawnHandler.java | 2 +-
.../l2jserver/gameserver/model/BlockList.java | 2 +-
.../gameserver/model/CursedWeapon.java | 2 +-
.../gameserver/model/L2AccessLevel.java | 4 +-
.../model/L2AdminCommandAccessRight.java | 4 +-
.../gameserver/model/L2Augmentation.java | 4 +-
.../l2jserver/gameserver/model/L2Clan.java | 6 +-
.../gameserver/model/L2ContactList.java | 2 +-
.../gameserver/model/L2EnchantSkillLearn.java | 2 +-
.../gameserver/model/L2GroupSpawn.java | 2 +-
.../gameserver/model/L2ManufactureItem.java | 2 +-
.../l2jserver/gameserver/model/L2Object.java | 9 +-
.../l2jserver/gameserver/model/L2Party.java | 33 +-
.../gameserver/model/L2SkillLearn.java | 2 +-
.../l2jserver/gameserver/model/L2Spawn.java | 4 +-
.../l2jserver/gameserver/model/L2World.java | 6 +-
.../l2jserver/gameserver/model/TradeList.java | 3 +
.../gameserver/model/UIKeysSettings.java | 2 +-
.../gameserver/model/actor/L2Attackable.java | 49 +-
.../gameserver/model/actor/L2Character.java | 84 +-
.../gameserver/model/actor/L2Npc.java | 14 +-
.../gameserver/model/actor/L2Summon.java | 69 +-
.../actor/instance/L2BabyPetInstance.java | 2 +-
.../model/actor/instance/L2ChestInstance.java | 2 +-
.../instance/L2ClanHallDoormenInstance.java | 2 +-
.../instance/L2ClanHallManagerInstance.java | 2 +-
.../actor/instance/L2ClassMasterInstance.java | 2 +-
.../model/actor/instance/L2CubicInstance.java | 65 +-
.../model/actor/instance/L2DoorInstance.java | 8 +-
.../actor/instance/L2DoormenInstance.java | 8 +-
.../actor/instance/L2FishermanInstance.java | 42 +-
.../instance/L2FortLogisticsInstance.java | 2 +-
.../actor/instance/L2FortManagerInstance.java | 2 +-
.../actor/instance/L2MerchantInstance.java | 2 +-
.../model/actor/instance/L2NpcInstance.java | 2 +-
.../model/actor/instance/L2PcInstance.java | 558 +-
.../model/actor/instance/L2PetInstance.java | 13 +-
.../instance/L2SepulcherNpcInstance.java | 6 +-
.../actor/instance/L2ServitorInstance.java | 10 +-
.../actor/instance/L2TamedBeastInstance.java | 18 +-
.../actor/instance/L2TeleporterInstance.java | 6 +-
.../instance/L2VillageMasterInstance.java | 572 +-
.../L2VillageMasterKamaelInstance.java | 43 -
.../gameserver/model/actor/stat/PcStat.java | 25 +-
.../gameserver/model/actor/stat/PetStat.java | 6 +-
.../model/actor/stat/PlayableStat.java | 8 +-
.../model/actor/status/PcStatus.java | 14 +-
.../model/actor/tasks/cubics/CubicAction.java | 10 +-
.../tasks/player/GameGuardCheckTask.java | 4 +-
.../tasks/player/IllegalPlayerActionTask.java | 4 +-
.../model/actor/templates/L2NpcTemplate.java | 2 +-
.../model/actor/templates/L2PcTemplate.java | 14 +-
.../model/actor/transform/Transform.java | 2 +-
.../gameserver/model/base/PlayerClass.java | 113 +-
.../gameserver/model/base/SubClass.java | 14 +-
.../model/clan/entry/PledgeRecruitInfo.java | 2 +-
....java => ConditionPlayerCanSummonPet.java} | 22 +-
.../ConditionPlayerCanSummonServitor.java | 60 +
.../conditions/ConditionPlayerCanSweep.java | 2 +-
.../ConditionPlayerCanUntransform.java | 2 +-
.../ConditionPlayerHasFreeSummonPoints.java | 66 +
.../conditions/ConditionPlayerHasPet.java | 6 +-
.../ConditionPlayerServitorNpcId.java | 14 +-
.../model/entity/AbstractResidence.java | 2 +-
.../gameserver/model/entity/Auction.java | 2 +-
.../model/entity/BlockCheckerEngine.java | 10 +-
.../gameserver/model/entity/Castle.java | 12 +-
.../gameserver/model/entity/ClanHall.java | 2 +-
.../gameserver/model/entity/Fort.java | 12 +-
.../gameserver/model/entity/FortSiege.java | 4 +-
.../gameserver/model/entity/Hero.java | 8 +-
.../gameserver/model/entity/Instance.java | 6 +-
.../gameserver/model/entity/L2Event.java | 2 +-
.../gameserver/model/entity/Message.java | 2 +-
.../gameserver/model/entity/Siege.java | 65 +-
.../gameserver/model/entity/TvTEvent.java | 8 +-
.../model/entity/TvTEventTeleporter.java | 4 +-
.../entity/clanhall/AuctionableHall.java | 2 +-
.../entity/clanhall/ClanHallSiegeEngine.java | 4 +-
.../gameserver/model/event/LongTimeEvent.java | 4 +-
.../model/events/AbstractScript.java | 32 +-
.../gameserver/model/events/EventType.java | 2 +
.../impl/character/npc/OnNpcMenuSelect.java | 75 +
.../gameserver/model/fishing/L2Fishing.java | 2 +-
.../model/holders/PlayerEventHolder.java | 2 +-
.../model/holders/PlayerSkillHolder.java | 2 +-
.../itemauction/ItemAuctionInstance.java | 2 +-
.../model/itemcontainer/Inventory.java | 2 +-
.../model/itemcontainer/PcInventory.java | 3 +
.../model/items/enchant/EnchantScroll.java | 2 +-
.../model/items/instance/L2ItemInstance.java | 16 +-
.../model/olympiad/AbstractOlympiadGame.java | 40 +-
.../gameserver/model/quest/Quest.java | 12 +-
.../model/shuttle/L2ShuttleEngine.java | 6 +-
.../gameserver/model/skills/Skill.java | 26 +-
.../model/skills/targets/L2TargetType.java | 1 +
.../gameserver/model/stats/BaseStats.java | 8 +-
.../gameserver/model/stats/Formulas.java | 6 +-
.../gameserver/model/stats/Stats.java | 5 +-
.../model/stats/functions/FuncEnchantHp.java | 2 +-
.../functions/formulas/FuncArmorSet.java | 4 +-
.../model/zone/type/L2BattalionZone.java | 6 +-
.../zone/type/L2OlympiadStadiumZone.java | 12 +-
.../gameserver/network/L2GameClient.java | 33 +-
.../network/clientpackets/AllyDismiss.java | 2 +-
.../clientpackets/CharacterCreate.java | 12 +-
.../clientpackets/CharacterSelect.java | 4 +-
.../network/clientpackets/DlgAnswer.java | 4 +-
.../network/clientpackets/EnterWorld.java | 24 +-
.../clientpackets/MoveBackwardToLocation.java | 22 +-
.../clientpackets/MultiSellChoose.java | 2 +-
.../network/clientpackets/NewCharacter.java | 28 +-
.../RequestAcquireAbilityList.java | 2 +-
.../clientpackets/RequestAcquireSkill.java | 22 +-
.../RequestAcquireSkillInfo.java | 2 +-
.../clientpackets/RequestActionUse.java | 343 +-
.../clientpackets/RequestAutoSoulShot.java | 177 +-
.../network/clientpackets/RequestBlock.java | 2 +-
.../network/clientpackets/RequestBuyItem.java | 2 +-
.../clientpackets/RequestBypassToServer.java | 19 +-
.../RequestChangeAbilityPoint.java | 2 +-
.../clientpackets/RequestChangePetName.java | 4 +-
.../RequestCharacterNameCreatable.java | 2 +-
.../RequestConfirmSiegeWaitingList.java | 2 +-
.../clientpackets/RequestCrystallizeItem.java | 2 +-
.../clientpackets/RequestDestroyItem.java | 6 +-
.../network/clientpackets/RequestDispel.java | 11 +-
.../clientpackets/RequestDropItem.java | 4 +-
.../clientpackets/RequestEnchantItem.java | 5 +-
.../RequestEx2ndPasswordCheck.java | 2 +-
.../RequestEx2ndPasswordReq.java | 2 +-
.../RequestEx2ndPasswordVerify.java | 2 +-
.../RequestExAddEnchantScrollItem.java | 7 +-
.../clientpackets/RequestExEnchantSkill.java | 2 +-
.../RequestExEnchantSkillInfo.java | 2 +-
.../RequestExEnchantSkillInfoDetail.java | 2 +-
.../RequestExEnchantSkillRouteChange.java | 2 +-
.../RequestExEnchantSkillSafe.java | 2 +-
.../RequestExEnchantSkillUntrain.java | 2 +-
.../RequestExPledgeCrestLarge.java | 2 +-
.../RequestExRemoveEnchantSupportItem.java | 6 +-
.../RequestExSetPledgeCrestLarge.java | 2 +-
.../RequestExTryToPutEnchantSupportItem.java | 2 +-
.../RequestExTryToPutEnchantTargetItem.java | 2 +-
.../clientpackets/RequestGMCommand.java | 2 +-
.../clientpackets/RequestGetItemFromPet.java | 2 +-
.../clientpackets/RequestGiveItemToPet.java | 2 +-
.../network/clientpackets/RequestGmList.java | 4 +-
.../clientpackets/RequestHennaEquip.java | 2 +-
.../clientpackets/RequestHennaItemInfo.java | 2 +-
.../RequestHennaItemRemoveInfo.java | 2 +-
.../clientpackets/RequestMagicSkillUse.java | 2 +-
.../clientpackets/RequestPetGetItem.java | 2 +-
.../clientpackets/RequestPetUseItem.java | 2 +-
.../clientpackets/RequestPetition.java | 4 +-
.../clientpackets/RequestPetitionCancel.java | 4 +-
.../clientpackets/RequestPledgeInfo.java | 2 +-
.../RequestPledgeRecruitInfo.java | 2 +-
.../RequestPledgeWaitingApply.java | 5 +-
.../clientpackets/RequestPreviewItem.java | 5 +-
.../clientpackets/RequestPrivateStoreBuy.java | 2 +-
.../RequestPrivateStoreSell.java | 2 +-
.../RequestRecipeBookDestroy.java | 2 +-
.../RequestRecipeShopListSet.java | 8 +-
.../clientpackets/RequestRefundItem.java | 2 +-
.../clientpackets/RequestRegistBeauty.java | 2 +-
.../RequestReplyStartPledgeWar.java | 2 +-
.../RequestReplyStopPledgeWar.java | 2 +-
.../RequestReplySurrenderPledgeWar.java | 2 +-
.../RequestResetAbilityPoint.java | 2 +-
.../clientpackets/RequestSaveKeyMapping.java | 2 +-
.../clientpackets/RequestSellItem.java | 2 +-
.../clientpackets/RequestSendPost.java | 6 +-
.../clientpackets/RequestSetAllyCrest.java | 4 +-
.../clientpackets/RequestSetPledgeCrest.java | 2 +-
.../RequestShowResetShopList.java | 2 +-
.../clientpackets/RequestStartPledgeWar.java | 2 +-
.../clientpackets/RequestStopPledgeWar.java | 2 +-
.../RequestSurrenderPledgeWar.java | 2 +-
.../clientpackets/SendBypassBuildCmd.java | 4 +-
.../clientpackets/ValidatePosition.java | 11 +-
.../RequestCrystallizeEstimate.java | 2 +-
.../friend/RequestFriendDel.java | 2 +-
.../friend/RequestFriendList.java | 2 +-
.../mentoring/RequestMentorCancel.java | 2 +-
.../serverpackets/AbstractMessagePacket.java | 6 +-
.../serverpackets/AbstractNpcInfo.java | 96 -
.../serverpackets/AcquireSkillList.java | 18 +-
.../network/serverpackets/AgitDecoInfo.java | 6 +-
.../network/serverpackets/AllianceInfo.java | 2 +-
.../network/serverpackets/AllyCrest.java | 2 +-
.../serverpackets/BlockListPacket.java | 2 +-
.../serverpackets/CharSelectionInfo.java | 14 +-
.../network/serverpackets/EnchantResult.java | 2 +-
.../network/serverpackets/EquipUpdate.java | 95 -
.../serverpackets/ExAcquireAPSkillList.java | 4 +-
.../serverpackets/ExAcquireSkillInfo.java | 21 +-
.../serverpackets/ExAlchemySkillList.java | 2 +-
.../serverpackets/ExBeautyItemList.java | 2 +-
.../serverpackets/ExEnchantSkillInfo.java | 4 +-
.../ExEnchantSkillInfoDetail.java | 2 +-
.../network/serverpackets/ExPetInfo.java | 391 +
.../serverpackets/ExPledgeRecruitInfo.java | 2 +-
.../serverpackets/ExResponseBeautyList.java | 2 +-
.../network/serverpackets/ExShowAgitInfo.java | 2 +-
.../serverpackets/ExShowCastleInfo.java | 2 +-
.../network/serverpackets/FlyToLocation.java | 2 +-
.../serverpackets/GMViewCharacterInfo.java | 4 +-
.../network/serverpackets/HennaEquipList.java | 2 +-
.../network/serverpackets/KeyPacket.java | 5 +-
.../network/serverpackets/MultiSellList.java | 2 +-
.../network/serverpackets/NpcInfo.java | 2 +-
.../NpcInfoAbnormalVisualEffect.java | 53 +
.../serverpackets/PartySmallWindowAll.java | 36 +-
.../network/serverpackets/PetInfo.java | 27 +-
.../network/serverpackets/PledgeCrest.java | 2 +-
.../serverpackets/PledgeReceiveWarList.java | 2 +-
.../serverpackets/RecipeItemMakeInfo.java | 2 +-
.../network/serverpackets/SellList.java | 4 +-
.../serverpackets/SiegeAttackerList.java | 2 +-
.../serverpackets/SiegeDefenderList.java | 2 +-
.../network/serverpackets/SiegeInfo.java | 2 +-
.../SortedWareHouseWithdrawalList.java | 2 +-
.../network/serverpackets/SummonInfo.java | 390 +
.../network/serverpackets/UserInfo.java | 4 +-
.../serverpackets/friend/FriendList.java | 2 +-
.../serverpackets/friend/L2Friend.java | 2 +-
.../serverpackets/friend/L2FriendList.java | 2 +-
.../gameserver/pathfinding/PathFinding.java | 2 +-
.../script/faenor/FaenorInterface.java | 2 +-
.../security/SecondaryPasswordAuth.java | 2 +-
.../taskmanager/AttackStanceTaskManager.java | 8 +-
.../taskmanager/DecayTaskManager.java | 2 +-
.../taskmanager/tasks/TaskBirthday.java | 2 +-
.../tasks/TaskClanLeaderApply.java | 2 +-
.../tasks/TaskRaidPointsReset.java | 2 +-
.../l2jserver/gameserver/util/Broadcast.java | 20 +-
.../com/l2jserver/gameserver/util/Evolve.java | 12 +-
.../l2jserver/gameserver/util/MinionList.java | 2 +-
1012 files changed, 23069 insertions(+), 6307 deletions(-)
delete mode 100644 trunk/dist/game/data/html/teleporter/30146-1.htm
delete mode 100644 trunk/dist/game/data/html/teleporter/30146-2.htm
delete mode 100644 trunk/dist/game/data/html/teleporter/30146-3.htm
delete mode 100644 trunk/dist/game/data/html/teleporter/32163-1.htm
delete mode 100644 trunk/dist/game/data/html/teleporter/32163-2.htm
delete mode 100644 trunk/dist/game/data/html/teleporter/32163-3.htm
delete mode 100644 trunk/dist/game/data/html/teleporter/32163-4.htm
delete mode 100644 trunk/dist/game/data/html/teleporter/32163-5.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_Add.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_AddOk.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_Change.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_ChangeNo.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_ChangeNotFound.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_Current.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_Fail.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_Fail_Elves.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_Fail_Kamael.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_Modify.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice1.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice2.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_ModifyChoice3.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_ModifyCustom.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_ModifyEmpty.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_ModifyOk.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_NoKamael.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_NoOther.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_NoSummon.htm
delete mode 100644 trunk/dist/game/data/html/villagemaster/SubClass_NoTransformed.htm
create mode 100644 trunk/dist/game/data/multisell/2027.xml
create mode 100644 trunk/dist/game/data/multisell/779.xml
create mode 100644 trunk/dist/game/data/multisell/857.xml
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/33491-01.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/33491-02.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/33491-03.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/33491-04.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/33491-05.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/33491.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/Raina.java
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/addConfirm.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/addConfirm2.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheia.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheiaFailed.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheiaList.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/addFailed.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/addSuccess.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/inventoryLimit.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/noCertificate.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/noErtheia.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/noQuest.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/noSubChange.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/noSummon.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/noTransform.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/onlyErtheia.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/reawaken.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/reawakenCancel.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/reawakenClassList.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/reawakenList.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/reawakenNoDual.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/reawakenNoFee.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/removeSubclassList.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/subclassList.html
create mode 100644 trunk/dist/game/data/scripts/ai/npc/Raina/subclassRemoveList.html
delete mode 100644 trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/32163-no.htm
delete mode 100644 trunk/dist/game/data/scripts/ai/npc/Teleports/StrongholdsTeleports/32163.htm
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-00.htm (76%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-01.htm (64%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-02.htm (63%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-03.htm (63%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-04.htm (63%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-05.htm (62%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-06.htm (62%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-07.htm (62%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-08.htm (62%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-09.htm (75%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-10.htm (100%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/32530-11.htm (100%)
rename trunk/dist/game/data/scripts/gracia/instances/SeedOfInfinity/{ => HallOfSuffering}/HallOfSuffering.java (72%)
delete mode 100644 trunk/dist/game/data/scripts/handlers/admincommandhandlers/AdminGeoEditor.java
create mode 100644 trunk/dist/game/data/scripts/handlers/targethandlers/OneFriendly.java
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-01.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-01a.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-02.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-03.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-04.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-05.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-06.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-07.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-08.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-09.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-10.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-11.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-12.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-13.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-14.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-15.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-16.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-17.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-18.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-19.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-20.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-21.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31328-22.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-01.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-02.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-03.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31386-04.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-01.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-02.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-03.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-04.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-05.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31523-06.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-01.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-02.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-03.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-04.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-05.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31524-06.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-01.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-02.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-03.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-04.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-05.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-06.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-07.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-07a.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-08.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-09.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-10.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-11.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-12.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31526-13.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-01.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-02.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/31530-03.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00023_LidiasHeart/Q00023_LidiasHeart.java
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-01.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-02.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-03.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-04.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-05.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-06.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-06a.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-07.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-08.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-09.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-10.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/35627-11.html
create mode 100644 trunk/dist/game/data/scripts/quests/Q00655_AGrandPlanForTamingWildBeasts/Q00655_AGrandPlanForTamingWildBeasts.java
create mode 100644 trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-01.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-02.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-03.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-04.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33951-05.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33952-01.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/33952-02.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10741_ADraughtForTheCold/Q10741_ADraughtForTheCold.java
create mode 100644 trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-01.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-02.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-03.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-04.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33952-05.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-01.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-02.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/33995-03.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10742_AFurryFriend/Q10742_AFurryFriend.java
create mode 100644 trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-01.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-02.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33952-03.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-01.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-02.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/33953-03.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10743_StrangeFungus/Q10743_StrangeFungus.java
create mode 100644 trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-01.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-02.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33953-03.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-01.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-02.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-03.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/33954-04.htm
create mode 100644 trunk/dist/game/data/scripts/quests/Q10744_StrongerThanSteel/Q10744_StrongerThanSteel.java
delete mode 100644 trunk/dist/game/data/scripts/vehicles/BoatGiranTalking.java
delete mode 100644 trunk/dist/game/data/scripts/vehicles/BoatTalkingGludin.java
create mode 100644 trunk/dist/game/data/teleporters/TeleportDevice-Elven.xml
create mode 100644 trunk/dist/game/data/teleporters/TeleportDevice-Kamael.xml
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/AnnouncementsTable.java (94%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/CharNameTable.java (94%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/CharSummonTable.java (75%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/ClanTable.java (96%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/CrestTable.java (95%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/NpcBufferTable.java (95%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/OfflineTradersTable.java (96%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/PetNameTable.java (90%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/SummonEffectsTable.java (94%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/SummonSkillsTable.java (94%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/TeleportLocationTable.java (95%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/sql/impl}/TerritoryTable.java (94%)
rename trunk/java/com/l2jserver/gameserver/{engines/DocumentParser.java => data/xml/IXmlReader.java} (95%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/AbilityPointsData.java (91%)
rename trunk/java/com/l2jserver/gameserver/{datatables/AdminTable.java => data/xml/impl/AdminData.java} (89%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/ArmorSetsData.java (91%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/BeautyShopData.java (93%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/BuyListData.java (92%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/CastleData.java (92%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/CategoryData.java (83%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/ClassListData.java (83%)
rename trunk/java/com/l2jserver/gameserver/{datatables/DoorTable.java => data/xml/impl/DoorData.java} (93%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/EnchantItemData.java (89%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/EnchantItemGroupsData.java (93%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/EnchantItemHPBonusData.java (92%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/EnchantItemOptionsData.java (92%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/EnchantSkillGroupsData.java (94%)
rename trunk/java/com/l2jserver/gameserver/{datatables/ExperienceTable.java => data/xml/impl/ExperienceData.java} (86%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/FishData.java (87%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/FishingMonstersData.java (89%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/FishingRodsData.java (88%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/HennaData.java (91%)
rename trunk/java/com/l2jserver/gameserver/{datatables/HitConditionBonus.java => data/xml/impl/HitConditionBonusData.java} (84%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/InitialEquipmentData.java (92%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/InitialShortcutData.java (94%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/ItemCrystalizationData.java (91%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/KarmaData.java (90%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/MultisellData.java (95%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/NpcData.java (96%)
rename trunk/java/com/l2jserver/gameserver/{datatables/OptionsData.java => data/xml/impl/OptionData.java} (87%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/PetDataTable.java (92%)
rename trunk/java/com/l2jserver/gameserver/{datatables/CharTemplateTable.java => data/xml/impl/PlayerTemplateData.java} (79%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/PlayerXpPercentLostData.java (87%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/RecipeData.java (94%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/SecondaryAuthData.java (92%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/ShuttleData.java (94%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/SiegeScheduleData.java (91%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/SkillLearnData.java (91%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/SkillTreesData.java (93%)
rename trunk/java/com/l2jserver/gameserver/{datatables/StaticObjects.java => data/xml/impl/StaticObjectData.java} (85%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/TeleportersData.java (92%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/TransformData.java (94%)
rename trunk/java/com/l2jserver/gameserver/{datatables => data/xml/impl}/UIData.java (92%)
delete mode 100644 trunk/java/com/l2jserver/gameserver/geoeditorcon/GeoEditorListener.java
delete mode 100644 trunk/java/com/l2jserver/gameserver/geoeditorcon/GeoEditorThread.java
rename trunk/java/com/l2jserver/gameserver/model/conditions/{ConditionPlayerCanSummon.java => ConditionPlayerCanSummonPet.java} (70%)
create mode 100644 trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerCanSummonServitor.java
create mode 100644 trunk/java/com/l2jserver/gameserver/model/conditions/ConditionPlayerHasFreeSummonPoints.java
create mode 100644 trunk/java/com/l2jserver/gameserver/model/events/impl/character/npc/OnNpcMenuSelect.java
delete mode 100644 trunk/java/com/l2jserver/gameserver/network/serverpackets/EquipUpdate.java
create mode 100644 trunk/java/com/l2jserver/gameserver/network/serverpackets/ExPetInfo.java
create mode 100644 trunk/java/com/l2jserver/gameserver/network/serverpackets/NpcInfoAbnormalVisualEffect.java
create mode 100644 trunk/java/com/l2jserver/gameserver/network/serverpackets/SummonInfo.java
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;
-The Town of Gludio - 9200 Adena
-The Village of Gludin - 18000 Adena
-Dwarven Village - 23000 Adena
-Talking Island Village - 23000 Adena
-Orc Village - 18000 Adena
-Kamael Village - 16000 Adena
-Elven Forest - 710 Adena
-Elven Fortress - 820 Adena
-Neutral Zone - 1700 Adena
-
\ 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;
-Gludin Arena - 1000 Adena
-Giran Arena - 1000 Adena
-The Center of the Neutral Zone - 1000 Adena
-Coliseum - 1000 Adena
-
\ 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;
-Gludin Arena - 1 Olympiad Token
-Giran Arena - 1 Olympiad Token
-The Center of the Neutral Zone - 1 Olympiad Token
-Coliseum - 1 Olympiad Token
-
\ 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;
-The Town of Gludio - 12000 Adena
-The Village of Gludin - 18000 Adena
-Town of Aden - 26000 Adena
-Talking Island Village - 20000 Adena
-Dark Elf Village - 13000 Adena
-Elven Village - 16000 Adena
-Dwarven Village - 32000 Adena
-Orc Village - 17000 Adena
-Stronghold I - 2600 Adena
-Stronghold II - 2200 Adena
-Stronghold III - 3200 Adena
-Isle of Souls Harbor - 4300 Adena
-
\ 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;
-Gludin Arena - 1000 Adena
-Giran Arena - 1000 Adena
-Coliseum - 1000 Adena
-
\ 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;
-Gludin Arena - 1 Olympiad Token
-Giran Arena - 1 Olympiad Token
-Coliseum - 1 Olympiad Token
-
\ 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;
-Stronghold I
-Stronghold II
-Stronghold III
-
\ 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:
-Add subclass.
-Change subclass.
-Cancel current subclass and change to a new subclass.
-Subclass skill certification.
-
\ 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.
-Add subclass.
-
\ 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.
-Add Sub Class.
-
\ 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.
-Change subclasses.
-
\ 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
-%sub1%
-Sub-class 2
-%sub2%
-Sub-class 3
-%sub3%
-
-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:
Craft R-Grade Dual Weapon
-Bestow Special Ability on R-Grade Weapon
+Bestow Special Ability on R-Grade Weapon
Change Special Ability of R-Grade Weapon
Change Special Ability of R95-Grade Weapon
\ 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.
- Receive the Revelation of Chaos.
- Reset the Revelation skill.(100,000,000 Adena)
- "Who are Monks of Chaos?"
-
-
\ 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.
+Receive the Revelation of Chaos.
+Reset the Revelation skill.(100,000,000 Adena)
+"Who are Monks of Chaos?"
+
\ 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.
- "So tell me about this Revelation of Chaos."
-
\ 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.
+"So tell me about this Revelation of Chaos."
+
\ 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 .
+ "I'll add a new subclass (create new)."
+(Change dual classes and your level will be reset to level 40 .)
+ "I'll eliminate a subclass and add another one (reset)."
+Maintain your level while changing classes .
+ "I'll change my subclass (requires Subclass Change Certificate)."
+
\ 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?
+"Yes, on with a dual class!"
+
\ 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 ).
+"I'll reawaken."
+
\ 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 .
+"Let me take a look at the items for dual classes."
+
\ 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?
+"I have XP bottles right here."
+
\ 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?
+"Yeah. How do I create or reset a subclass?"
+"I want to add a dual class." (for Ertheia only)
+"Can I reawaken my Awakened dual class?"
+"So...what are the items for dual classes?"
+"What's with these XP Bottles?"
+Quest
+
\ 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(" ");
+ }
+ }
+ html.replace("%dualclassList%", sb.toString());
+ player.sendPacket(html);
+ break;
+ }
+ case "reawekenDualclass":
+ {
+ if (player.isTransformed())
+ {
+ htmltext = "noTransform.html";
+ break;
+ }
+ else if (player.hasSummon())
+ {
+ htmltext = "noSummon.html";
+ break;
+ }
+ else if (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
+ {
+ htmltext = "reawakenNoDual.html";
+ break;
+ }
+
+ final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawaken.html");
+ final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
+ html.replace("%price%", REAWAKEN_PRICE[index]);
+ player.sendPacket(html);
+ break;
+ }
+ case "reawakenDualclassConfirm":
+ {
+ final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
+ if (player.isTransformed())
+ {
+ htmltext = "noTransform.html";
+ break;
+ }
+ else if (player.hasSummon())
+ {
+ htmltext = "noSummon.html";
+ break;
+ }
+ else if (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal()))
+ {
+ htmltext = "reawakenNoDual.html";
+ break;
+ }
+ else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
+ {
+ final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
+ html.replace("%price%", REAWAKEN_PRICE[index]);
+ player.sendPacket(html);
+ break;
+ }
+
+ final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenList.html");
+ player.sendPacket(html);
+ break;
+ }
+ case "reawaken_SIGEL_GROUP":
+ case "reawaken_TYRR_GROUP":
+ case "reawaken_OTHELL_GROUP":
+ case "reawaken_YUL_GROUP":
+ case "reawaken_FEOH_GROUP":
+ case "reawaken_ISS_GROUP":
+ case "reawaken_WYNN_GROUP":
+ case "reawaken_AEORE_GROUP":
+ {
+ final CategoryType cType = CategoryType.valueOf(event.replace("reawaken_", ""));
+
+ 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, "reawakenClassList.html");
+
+ for (PlayerClass dualClasses : getDualClasses(player, cType))
+ {
+ if (dualClasses != null)
+ {
+ sb.append(" ");
+ }
+ }
+ html.replace("%dualclassList%", sb.toString());
+ player.sendPacket(html);
+ break;
+ }
+ }
+ return htmltext;
+ }
+
+ @RegisterEvent(EventType.ON_NPC_MENU_SELECT)
+ @RegisterType(ListenerRegisterType.NPC)
+ @Id(RAINA)
+ public final void OnNpcMenuSelect(OnNpcMenuSelect event)
+ {
+ final L2PcInstance player = event.getTalker();
+ final L2Npc npc = event.getNpc();
+ final int ask = event.getAsk();
+
+ switch (ask)
+ {
+ case 0: // Add subclass confirm menu
+ {
+ final int classId = event.getReply();
+ final StringBuilder sb = new StringBuilder();
+ final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addConfirm.html");
+
+ if (!isValidNewSubClass(player, classId))
+ {
+ return;
+ }
+
+ final int npcStringId = 11170000 + classId;
+ sb.append("" + npcStringId + " ");
+ html.replace("%confirmButton%", sb.toString());
+ player.sendPacket(html);
+ break;
+ }
+ case 1: // Add subclass
+ {
+ final int classId = event.getReply();
+ if (!isValidNewSubClass(player, classId))
+ {
+ return;
+ }
+
+ if (!player.addSubClass(classId, player.getTotalSubClasses() + 1, false))
+ {
+ return;
+ }
+
+ final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addSuccess.html");
+ player.setActiveClass(player.getTotalSubClasses());
+ player.sendPacket(SystemMessageId.THE_NEW_SUBCLASS_HAS_BEEN_ADDED);
+ player.sendPacket(html);
+ break;
+ }
+ case 2: // Remove (change) subclass list
+ {
+ final int subclassIndex = event.getReply();
+ final Set availSubs = getAvailableSubClasses(player);
+ final StringBuilder sb = new StringBuilder();
+ final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "removeSubclassList.html");
+
+ if ((availSubs == null) || availSubs.isEmpty())
+ {
+ return;
+ }
+
+ for (PlayerClass subClass : availSubs)
+ {
+ if (subClass != null)
+ {
+ final int classId = subClass.ordinal();
+ final int npcStringId = 11170000 + classId;
+ sb.append("" + npcStringId + " ");
+ }
+ }
+ npc.getVariables().set("SUBCLASS_INDEX_" + player.getObjectId(), subclassIndex);
+ html.replace("%subclassList%", sb.toString());
+ player.sendPacket(html);
+ break;
+ }
+ case 3: // Remove (change) subclass confirm menu
+ {
+ final int classId = event.getReply();
+ final int classIndex = npc.getVariables().getInt("SUBCLASS_INDEX_" + player.getObjectId(), -1);
+ if (classIndex < 0)
+ {
+ return;
+ }
+
+ final StringBuilder sb = new StringBuilder();
+ final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addConfirm2.html");
+ final int npcStringId = 11170000 + classId;
+ sb.append("" + npcStringId + " ");
+ html.replace("%confirmButton%", sb.toString());
+ player.sendPacket(html);
+ break;
+ }
+ case 4: // Remove (change) subclass
+ {
+ final int classId = event.getReply();
+ final int classIndex = npc.getVariables().getInt("SUBCLASS_INDEX_" + player.getObjectId(), -1);
+ if (classIndex < 0)
+ {
+ return;
+ }
+
+ if (player.modifySubClass(classIndex, classId, false))
+ {
+ player.abortCast();
+ player.stopAllEffectsExceptThoseThatLastThroughDeath();
+ player.stopAllEffectsNotStayOnSubclassChange();
+ player.stopCubics();
+ player.setActiveClass(classIndex);
+
+ final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addSuccess.html");
+
+ player.sendPacket(html);
+ player.sendPacket(SystemMessageId.THE_NEW_SUBCLASS_HAS_BEEN_ADDED);
+ }
+ break;
+ }
+ case 5: // Reawaken (change dual class)
+ {
+ final int classId = event.getReply();
+ if (player.isTransformed() || player.hasSummon() || (!player.hasDualClass() || !player.isDualClassActive() || (player.getClassId().level() != ClassLevel.AWAKEN.ordinal())))
+ {
+ break;
+ }
+
+ // Validating classId
+ if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
+ {
+ break;
+ }
+
+ final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
+ if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
+ {
+ final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
+ html.replace("%price%", REAWAKEN_PRICE[index]);
+ player.sendPacket(html);
+ break;
+ }
+
+ player.reduceAdena((getClass().getSimpleName() + "_Reawaken"), REAWAKEN_PRICE[index], npc, true);
+ takeItems(player, getCloakId(player), 1);
+
+ final int classIndex = player.getClassIndex();
+ if (player.modifySubClass(classIndex, classId, true))
+ {
+ player.abortCast();
+ player.stopAllEffectsExceptThoseThatLastThroughDeath();
+ player.stopAllEffectsNotStayOnSubclassChange();
+ player.stopCubics();
+ player.setActiveClass(classIndex);
+
+ final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenSuccess.html");
+ player.sendPacket(html);
+ SkillTreesData.getInstance().cleanSkillUponAwakening(player);
+ player.sendPacket(new AcquireSkillList(player));
+ player.sendSkillList();
+ addPowerItem(player);
+ }
+ break;
+ }
+ case 6: // Add dual class for ertheia
+ {
+ final int classId = event.getReply();
+ if (player.isTransformed() || player.hasSummon())
+ {
+ break;
+ }
+
+ // Validating classId
+ if (!getDualClasses(player, null).contains(PlayerClass.values()[classId]))
+ {
+ break;
+ }
+
+ if (player.addSubClass(classId, player.getTotalSubClasses() + 1, true))
+ {
+ final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "addSuccess.html");
+ player.setActiveClass(player.getTotalSubClasses());
+ player.sendPacket(SystemMessageId.THE_NEW_SUBCLASS_HAS_BEEN_ADDED);
+ player.sendPacket(html);
+ SkillTreesData.getInstance().cleanSkillUponAwakening(player);
+ player.sendPacket(new AcquireSkillList(player));
+ player.sendSkillList();
+ addPowerItem(player);
+ }
+ break;
+ }
+ }
+ }
+
+ private void addPowerItem(L2PcInstance player)
+ {
+ int itemId = ABELIUS_POWER; // Sigel
+ if (player.isInCategory(CategoryType.TYRR_GROUP))
+ {
+ itemId = SAPYROS_POWER;
+ }
+ else if (player.isInCategory(CategoryType.OTHELL_GROUP))
+ {
+ itemId = ASHAGEN_POWER;
+ }
+ else if (player.isInCategory(CategoryType.YUL_GROUP))
+ {
+ itemId = CRANIGG_POWER;
+ }
+ else if (player.isInCategory(CategoryType.FEOH_GROUP))
+ {
+ itemId = SOLTKREIG_POWER;
+ }
+ else if (player.isInCategory(CategoryType.ISS_GROUP))
+ {
+ itemId = NAVIAROPE_POWER;
+ }
+ else if (player.isInCategory(CategoryType.WYNN_GROUP))
+ {
+ itemId = LEISTER_POWER;
+ }
+ else if (player.isInCategory(CategoryType.AEORE_GROUP))
+ {
+ itemId = LAKCIS_POWER;
+ }
+ giveItems(player, itemId, 1);
+ }
+
+ /**
+ * Returns list of available subclasses Base class and already used subclasses removed
+ * @param player
+ * @return
+ */
+ private Set getAvailableSubClasses(L2PcInstance player)
+ {
+ final int currentBaseId = player.getBaseClass();
+ final ClassId baseCID = ClassId.getClassId(currentBaseId);
+ int baseClassId = (baseCID.level() > 2) ? baseCID.getParent().ordinal() : currentBaseId;
+
+ final Set availSubs = getSubclasses(player, baseClassId);
+
+ if ((availSubs != null) && !availSubs.isEmpty())
+ {
+ for (PlayerClass pclass : availSubs)
+ {
+ // scan for already used subclasses
+ final int availClassId = pclass.ordinal();
+ final ClassId cid = ClassId.getClassId(availClassId);
+
+ for (SubClass subList : player.getSubClasses().values())
+ {
+ final ClassId subId = ClassId.getClassId(subList.getClassId());
+
+ if (subId.equalsOrChildOf(cid))
+ {
+ availSubs.remove(cid);
+ break;
+ }
+ }
+ }
+ }
+ return availSubs;
+ }
+
+ private boolean haveDoneQuest(L2PcInstance player)
+ {
+ final QuestState qs = player.getQuestState("Q10385_RedThreadOfFate"); // TODO: Replace with class name
+ return qs == null ? false : qs.isCompleted();
+ }
+
+ /**
+ * Check new subclass classId for validity. Base class not added into allowed subclasses.
+ * @param player
+ * @param classId
+ * @return
+ */
+ private boolean isValidNewSubClass(L2PcInstance player, int classId)
+ {
+ final ClassId cid = ClassId.values()[classId];
+ ClassId subClassId;
+ for (SubClass subList : player.getSubClasses().values())
+ {
+ subClassId = ClassId.values()[subList.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 = baseCID.level() > 2 ? baseCID.getParent().ordinal() : currentBaseId;
+ final Set availSubs = getSubclasses(player, baseClassId);
+
+ if ((availSubs == null) || availSubs.isEmpty())
+ {
+ return false;
+ }
+
+ boolean found = false;
+ for (PlayerClass pclass : availSubs)
+ {
+ if (pclass.ordinal() == classId)
+ {
+ found = true;
+ break;
+ }
+ }
+ return found;
+ }
+
+ private boolean hasAllSubclassLeveled(L2PcInstance player)
+ {
+ boolean leveled = true;
+
+ for (SubClass sub : player.getSubClasses().values())
+ {
+ if ((sub != null) && (sub.getLevel() < 75))
+ {
+ leveled = false;
+ }
+ }
+ return leveled;
+ }
+
+ public final List getAvailableDualclasses(L2PcInstance player)
+ {
+ final List dualClasses = new ArrayList<>();
+
+ for (PlayerClass playerClass : PlayerClass.values())
+ {
+ if (!playerClass.isOfRace(Race.ERTHEIA) && playerClass.isOfLevel(ClassLevel.AWAKEN) && (playerClass.ordinal() != player.getClassId().getId()))
+ {
+ dualClasses.add(playerClass);
+ }
+ }
+ return dualClasses;
+ }
+
+ private List getDualClasses(L2PcInstance player, CategoryType cType)
+ {
+ final List tempList = new ArrayList<>();
+ final int baseClassId = player.getBaseClass();
+ final int dualClassId = player.getClassId().getId();
+
+ for (PlayerClass temp : dualClassList)
+ {
+ if ((temp.ordinal() != baseClassId) && (temp.ordinal() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.ordinal())))
+ {
+ tempList.add(temp);
+ }
+ }
+ return tempList;
+ }
+
+ public final Set getSubclasses(L2PcInstance player, int classId)
+ {
+ Set subclasses = null;
+ final PlayerClass pClass = PlayerClass.values()[classId];
+
+ if ((pClass.getLevel() == ClassLevel.THIRD) || (pClass.getLevel() == ClassLevel.FOURTH))
+ {
+ subclasses = EnumSet.copyOf(mainSubclassSet);
+
+ subclasses.remove(this);
+
+ subclasses.removeAll(PlayerClass.getSet(Race.ERTHEIA, THIRD));
+
+ if (player.getRace() == Race.KAMAEL)
+ {
+ if (player.getAppearance().getSex())
+ {
+ subclasses.remove(PlayerClass.femaleSoulbreaker);
+ }
+ else
+ {
+ subclasses.remove(PlayerClass.maleSoulbreaker);
+ }
+
+ if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
+ {
+ subclasses.remove(PlayerClass.inspector);
+ }
+ }
+ else
+ {
+ // Only Kamael can take Kamael classes as subclasses.
+ subclasses.removeAll(PlayerClass.getSet(Race.KAMAEL, THIRD));
+ }
+
+ Set unavailableClasses = subclassSetMap.get(this);
+
+ if (unavailableClasses != null)
+ {
+ subclasses.removeAll(unavailableClasses);
+ }
+ }
+ return subclasses;
+ }
+
+ private NpcHtmlMessage getNpcHtmlMessage(L2PcInstance player, L2Npc npc, String fileName)
+ {
+ final NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
+ html.setHtml(HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "data/scripts/ai/npc/Raina/" + fileName));
+ return html;
+ }
+
+ private int getCloakId(L2PcInstance player)
+ {
+ CategoryType catType = null;
+
+ if (player.isInCategory(CategoryType.SIGEL_GROUP))
+ {
+ catType = CategoryType.SIGEL_GROUP;
+ }
+ else if (player.isInCategory(CategoryType.TYRR_GROUP))
+ {
+ catType = CategoryType.TYRR_GROUP;
+ }
+ else if (player.isInCategory(CategoryType.OTHELL_GROUP))
+ {
+ catType = CategoryType.OTHELL_GROUP;
+ }
+ else if (player.isInCategory(CategoryType.YUL_GROUP))
+ {
+ catType = CategoryType.YUL_GROUP;
+ }
+ else if (player.isInCategory(CategoryType.FEOH_GROUP))
+ {
+ catType = CategoryType.FEOH_GROUP;
+ }
+ else if (player.isInCategory(CategoryType.ISS_GROUP))
+ {
+ catType = CategoryType.ISS_GROUP;
+ }
+ else if (player.isInCategory(CategoryType.WYNN_GROUP))
+ {
+ catType = CategoryType.WYNN_GROUP;
+ }
+ else if (player.isInCategory(CategoryType.AEORE_GROUP))
+ {
+ catType = CategoryType.AEORE_GROUP;
+ }
+ return classCloak.get(catType);
+ }
+
+ public static void main(String[] args)
+ {
+ new Raina();
+ }
+}
\ No newline at end of file
diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/addConfirm.html b/trunk/dist/game/data/scripts/ai/npc/Raina/addConfirm.html
new file mode 100644
index 0000000000..8aee232575
--- /dev/null
+++ b/trunk/dist/game/data/scripts/ai/npc/Raina/addConfirm.html
@@ -0,0 +1,6 @@
+Subclass/Dual Class Master Raina:
+The choice is no easy one.
+The new subclass will be a level 40, 2nd-transfer class.
+Are you sure you want to go ahead with this decision?
+%confirmButton%
+
\ No newline at end of file
diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/addConfirm2.html b/trunk/dist/game/data/scripts/ai/npc/Raina/addConfirm2.html
new file mode 100644
index 0000000000..e6a18dce03
--- /dev/null
+++ b/trunk/dist/game/data/scripts/ai/npc/Raina/addConfirm2.html
@@ -0,0 +1,6 @@
+Subclass/Dual Class Master Raina:
+The choice is no easy one.
+The new subclass will have none of the skill enchants or the skills you learned through codices. Think carefully.
+Are you sure you want to go ahead with this decision?
+%confirmButton%
+
\ No newline at end of file
diff --git a/trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheia.html b/trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheia.html
new file mode 100644
index 0000000000..39b7f96ab3
--- /dev/null
+++ b/trunk/dist/game/data/scripts/ai/npc/Raina/addDualClassErtheia.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.
+"I will change to the Knight class."
+"I will change to the Warrior class."
+"I will change to the Rogue class."
+"I will change to the Archer class."
+"I will change to the Wizard class."
+"I will change to the Enchanter class."
+"I will change to the Summoner class."
+"I will change to the Healer class."
+
\ 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.)
+"I'll reawaken."
+"I will think about it."
+
\ 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.
+"I will change to the Knight class."
+"I will change to the Warrior class."
+"I will change to the Rogue class."
+"I will change to the Archer class."
+"I will change to the Wizard class."
+"I will change to the Enchanter class."
+"I will change to the Summoner class."
+"I will change to the Healer class."
+
\ 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.
-Teleport
-Move to a stronghold (free).
-Exchange Dimension Diamonds.
-Noblesse Exclusive Teleport
-Receive your Birthday Gift!
-Quest
-
\ 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.
-Teleport
-Move to a stronghold (free).
-Exchange Dimension Diamonds.
-Noblesse Exclusive Teleport
-Receive your Birthday Gift!
-Quest
-
\ 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
+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
+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.
+Receive the supply.