Support for Artifact item slots.
Contributed by hlwrave.
This commit is contained in:
parent
adc5bbc219
commit
866bbde935
9
L2J_Mobius_5.5_EtinasFate/dist/game/data/html/default/30098.htm
vendored
Normal file
9
L2J_Mobius_5.5_EtinasFate/dist/game/data/html/default/30098.htm
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
<html><body>Trader Alexandria:<br>
|
||||
Welcome. Thank you for visiting the Luxury goods store. We have many precious items that you can't find anywhere else.<br>
|
||||
We've recently added <font color="LEVEL">Artifacts</font> and <font color="LEVEL">Artifact Books</font> so make sure to take a look around.<br>
|
||||
Do you have <font color="LEVEL">Artifact Fragments</font> by any chance? If so, you can exchange them for Artifacts with special abilities as well. Make sure to try them out.<br>
|
||||
<button align="LEFT" icon="NORMAL" action="bypass -h npc_%objectId%_multisell 2310">"I want to purchase Artifacts."</button>
|
||||
<button align="LEFT" icon="NORMAL" action="bypass -h npc_%objectId%_multisell 2311">"I want to take a chance and exchange 30 Artifact Fragments."</button>
|
||||
<button align="LEFT" icon="NORMAL" action="bypass -h npc_%objectId%_multisell 2312">"I want to exchange 300 Artifact Fragments for a 100% chance."</button>
|
||||
<button align="LEFT" icon="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</button>
|
||||
</body></html>
|
18
L2J_Mobius_5.5_EtinasFate/dist/game/data/multisell/2310.xml
vendored
Normal file
18
L2J_Mobius_5.5_EtinasFate/dist/game/data/multisell/2310.xml
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/multisell.xsd">
|
||||
<npcs>
|
||||
<npc>30098</npc> <!-- Alexandria -->
|
||||
</npcs>
|
||||
<item>
|
||||
<ingredient count="560000000" id="57" /> <!-- Adena -->
|
||||
<production count="1" id="48954" /> <!-- Artifact Book - Level 1 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient count="600000000" id="57" /> <!-- Adena -->
|
||||
<production count="1" id="48980" /> <!-- Artifact - Attack Attribute Balance -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient count="600000000" id="57" /> <!-- Adena -->
|
||||
<production count="1" id="48981" /> <!-- Artifact - Defense Attribute Balance -->
|
||||
</item>
|
||||
</list>
|
24
L2J_Mobius_5.5_EtinasFate/dist/game/data/multisell/2311.xml
vendored
Normal file
24
L2J_Mobius_5.5_EtinasFate/dist/game/data/multisell/2311.xml
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list isChanceMultisell="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/multisell.xsd">
|
||||
<npcs>
|
||||
<npc>30098</npc> <!-- Alexandria -->
|
||||
</npcs>
|
||||
<item>
|
||||
<ingredient count="30" id="80000" /> <!-- Artifact Fragment -->
|
||||
<production count="1" id="48982" /> <!-- Artifact - Received Damage Reduction When Imobilized Balance -->
|
||||
<production count="1" id="48982" chance="10" /> <!-- Artifact - Received Damage Reduction When Imobilized Balance -->
|
||||
<production count="5" id="80000" chance="90" /> <!-- Artifact Fragment -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient count="30" id="80000" /> <!-- Artifact Fragment -->
|
||||
<production count="1" id="48983" /> <!-- Artifact - P. Skill Power Balance -->
|
||||
<production count="1" id="48983" chance="10" /> <!-- Artifact - P. Skill Power Balance -->
|
||||
<production count="5" id="80000" chance="90" /> <!-- Artifact Fragment -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient count="30" id="80000" /> <!-- Artifact Fragment -->
|
||||
<production count="1" id="48984" /> <!-- Artifact - M. Skill Power Balance -->
|
||||
<production count="1" id="48984" chance="10" /> <!-- Artifact - M. Skill Power Balance -->
|
||||
<production count="5" id="80000" chance="90" /> <!-- Artifact Fragment -->
|
||||
</item>
|
||||
</list>
|
18
L2J_Mobius_5.5_EtinasFate/dist/game/data/multisell/2312.xml
vendored
Normal file
18
L2J_Mobius_5.5_EtinasFate/dist/game/data/multisell/2312.xml
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/multisell.xsd">
|
||||
<npcs>
|
||||
<npc>30098</npc> <!-- Alexandria -->
|
||||
</npcs>
|
||||
<item>
|
||||
<ingredient count="300" id="80000" /> <!-- Artifact Fragment -->
|
||||
<production count="1" id="48982" /> <!-- Artifact - Received Damage Reduction When Imobilized Balance -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient count="300" id="80000" /> <!-- Artifact Fragment -->
|
||||
<production count="1" id="48983" /> <!-- Artifact - P. Skill Power Balance -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient count="300" id="80000" /> <!-- Artifact Fragment -->
|
||||
<production count="1" id="48984" /> <!-- Artifact - M. Skill Power Balance -->
|
||||
</item>
|
||||
</list>
|
@ -1,9 +0,0 @@
|
||||
<html><body>Trader Alexandria:<br><br>
|
||||
Ah, you have excellent taste! This bracelet is truly unique. In fact, it is said that it contains an <font color="LEVEL">Agathion</font>. Quite a find, eh? Wondering if it is for sale? Of course it is -- that's why I'm here!<br>
|
||||
Both this <font color="LEVEL">Little Angel Agathion Bracelet</font> and this <font color="LEVEL">Little Devil Agathion Bracelet</font> were discovered by another group of adventurers while exploring some ancient ruins. I am positive that they contain Agathions! Of course, no one knows for sure the power an Agathion possesses or how long it lasts. I have been reluctant to experiment on them because it's clear that some of the bracelets possess only limited magic power.<br>
|
||||
Others have more, however. What you get depends on your luck, I'm afraid.<br>
|
||||
To get either the angel or devil bracelet, you must bring me <font color="LEVEL">10 Fish Bones</font>, <font color="LEVEL">10 Fish Scales</font>, <font color="LEVEL">10 units of Fish Oil</font>, <font color="LEVEL">10 Fish Fins</font>, <font color="LEVEL">10 Fish Gems</font>, <font color="LEVEL">5 units of Whale Blubber</font>, and <font color="LEVEL">3,000,000 Adena</font>. I wish I could part with them in exchange for crystals as I normally would, but the adventurers who delivered the bracelets here insisted on these other items for payment.<br>
|
||||
Even so, I still believe this is a reasonable price. After all, an Agathion isn't something you run across every day, eh? So, would you like to buy one?<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Alexandria littleAngel">Purchase the Little Angel Agathion Bracelet</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Alexandria littleDevil">Purchase the Little Devil Agathion Bracelet</Button>
|
||||
</body></html>
|
@ -1,4 +0,0 @@
|
||||
<html><body>Trader Alexandria:<br>
|
||||
Yes, I've checked the necessary items. Thank you for your hard work.<br>
|
||||
I'm telling you ahead that I don't know for sure what kind of power each bracelet has. I only can tell you that the angel-engraved bracelet has an angel-type Agathion, and the devil-engraved one has a devil-type Agathion. You can find out the capability and magic power of each Agathion on your own.
|
||||
</body></html>
|
@ -1,6 +0,0 @@
|
||||
<html><body>Trader Alexandria:<br>
|
||||
Yes, I checked the necessary items. It must have been difficult to obtain them all!<br>
|
||||
I must warn you that I do not know for sure what kind of power posessed by each bracelet. I only can tell you that the Angel's Bracelet contains an angel-type Agathion, while the Devil's Bracelet contains a devil-type Agathion. You must discover the capability and magic power of each on your own.<br>
|
||||
Here, please take this as an extra token of my appreciation for your business...<br>
|
||||
(I have a strange feeling about that bracelet -- I hope this adventurer will simply take this and leave here immediately.)
|
||||
</body></html>
|
@ -1,3 +0,0 @@
|
||||
<html><body>Trader Alexandria:<br>
|
||||
Oh, you don't have the items required to buy either the Angel's Bracelet or the Devil's Bracelet. In order to obtain one, you must first bring me <font color="LEVEL">25 Big Red Nimble Fish</font>, <font color="LEVEL">50 Great Codrans</font>, and <font color="LEVEL">4 Memento Moris, 5 Earth Eggs, 5 Nonliving Nuclei, 3 Dragon Hearts</font>, and <font color="LEVEL">7,500,000 Adena</font>.
|
||||
</body></html>
|
@ -1,9 +0,0 @@
|
||||
<html><body>Trader Alexandria:<br>
|
||||
Welcome! Thank you so much for visiting our boutique. We sell precious and valuable things that you would never find anywhere else. We've also added some luxury accessories this time. Look around see if you can find anything you like.<br>
|
||||
Ah! Now, you can use <font color="LEVEL">Adena</font> to pay for your goods.<br>
|
||||
If you would like to purchase a weapon, please ask my husband.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 300984001">Purchase Armor</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_multisell 300984002">Purchase supplies</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Alexandria 30098-02.html">Purchase an Agathion Bracelet</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@ -1,145 +0,0 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* This program 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ai.areas.TownOfGiran.Alexandria;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import com.l2jmobius.gameserver.model.holders.QuestItemHolder;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Alexandria (Armor Merchant) AI.
|
||||
* @author xban1x
|
||||
*/
|
||||
public final class Alexandria extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int ALEXANDRIA = 30098;
|
||||
// Items
|
||||
private static final ItemHolder[] REQUIRED_ITEMS = new ItemHolder[]
|
||||
{
|
||||
new ItemHolder(57, 3550000),
|
||||
new ItemHolder(5094, 400),
|
||||
new ItemHolder(6471, 200),
|
||||
new ItemHolder(9814, 40),
|
||||
new ItemHolder(9815, 30),
|
||||
new ItemHolder(9816, 50),
|
||||
new ItemHolder(9817, 50),
|
||||
};
|
||||
// Agathions
|
||||
private static final QuestItemHolder[] LITTLE_DEVILS = new QuestItemHolder[]
|
||||
{
|
||||
new AdditionalQuestItemHolder(10321, 600, 1, 10408),
|
||||
new QuestItemHolder(10322, 10),
|
||||
new QuestItemHolder(10323, 10),
|
||||
new QuestItemHolder(10324, 5),
|
||||
new QuestItemHolder(10325, 5),
|
||||
new QuestItemHolder(10326, 370),
|
||||
};
|
||||
private static final QuestItemHolder[] LITTLE_ANGELS = new QuestItemHolder[]
|
||||
{
|
||||
new AdditionalQuestItemHolder(10315, 600, 1, 10408),
|
||||
new QuestItemHolder(10316, 10),
|
||||
new QuestItemHolder(10317, 10),
|
||||
new QuestItemHolder(10318, 5),
|
||||
new QuestItemHolder(10319, 5),
|
||||
new QuestItemHolder(10320, 370),
|
||||
};
|
||||
private static final Map<String, List<QuestItemHolder>> AGATHIONS = new HashMap<>();
|
||||
|
||||
static
|
||||
{
|
||||
AGATHIONS.put("littleAngel", Arrays.asList(LITTLE_ANGELS));
|
||||
AGATHIONS.put("littleDevil", Arrays.asList(LITTLE_DEVILS));
|
||||
}
|
||||
|
||||
private Alexandria()
|
||||
{
|
||||
addStartNpc(ALEXANDRIA);
|
||||
addTalkId(ALEXANDRIA);
|
||||
addFirstTalkId(ALEXANDRIA);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
String htmltext = null;
|
||||
if (event.equals("30098-02.html"))
|
||||
{
|
||||
htmltext = event;
|
||||
}
|
||||
else if (AGATHIONS.containsKey(event))
|
||||
{
|
||||
final int chance = getRandom(1000);
|
||||
int chance2 = 0;
|
||||
int chance3 = 0;
|
||||
for (QuestItemHolder agathion : AGATHIONS.get(event))
|
||||
{
|
||||
chance3 += agathion.getChance();
|
||||
if ((chance >= chance2) && (chance2 < chance3))
|
||||
{
|
||||
if (takeAllItems(player, REQUIRED_ITEMS))
|
||||
{
|
||||
giveItems(player, agathion);
|
||||
htmltext = "30098-03.html";
|
||||
|
||||
if (agathion instanceof AdditionalQuestItemHolder)
|
||||
{
|
||||
giveItems(player, ((AdditionalQuestItemHolder) agathion).getAdditionalId(), 1);
|
||||
htmltext = "30098-03a.html";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
htmltext = "30098-04.html";
|
||||
}
|
||||
break;
|
||||
}
|
||||
chance2 += agathion.getChance();
|
||||
}
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
private static class AdditionalQuestItemHolder extends QuestItemHolder
|
||||
{
|
||||
private final int _additionalId;
|
||||
|
||||
public AdditionalQuestItemHolder(int id, int chance, long count, int additionalId)
|
||||
{
|
||||
super(id, chance, count);
|
||||
_additionalId = additionalId;
|
||||
}
|
||||
|
||||
public int getAdditionalId()
|
||||
{
|
||||
return _additionalId;
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Alexandria();
|
||||
}
|
||||
}
|
@ -42,6 +42,7 @@ public final class EffectMasterHandler
|
||||
EffectHandler.getInstance().registerHandler("AgathionSlot", AgathionSlot::new);
|
||||
EffectHandler.getInstance().registerHandler("AirBind", AirBind::new);
|
||||
EffectHandler.getInstance().registerHandler("AreaDamage", AreaDamage::new);
|
||||
EffectHandler.getInstance().registerHandler("ArtifactSlot", ArtifactSlot::new);
|
||||
EffectHandler.getInstance().registerHandler("AttackAttribute", AttackAttribute::new);
|
||||
EffectHandler.getInstance().registerHandler("AttackAttributeAdd", AttackAttributeAdd::new);
|
||||
EffectHandler.getInstance().registerHandler("AttackBehind", AttackBehind::new);
|
||||
|
31
L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/ArtifactSlot.java
vendored
Normal file
31
L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/ArtifactSlot.java
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* This program 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
||||
|
||||
/**
|
||||
* @author hlwrave
|
||||
*/
|
||||
public class ArtifactSlot extends AbstractStatAddEffect
|
||||
{
|
||||
public ArtifactSlot(StatsSet params)
|
||||
{
|
||||
super(params, Stats.ARTIFACT_SLOTS);
|
||||
}
|
||||
}
|
@ -38,14 +38,14 @@ import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||
public final class Disarmor extends AbstractEffect
|
||||
{
|
||||
private final Map<Integer, Integer> _unequippedItems; // PlayerObjId, ItemObjId
|
||||
private final int _slot;
|
||||
private final long _slot;
|
||||
|
||||
public Disarmor(StatsSet params)
|
||||
{
|
||||
_unequippedItems = new ConcurrentHashMap<>();
|
||||
|
||||
final String slot = params.getString("slot", "chest");
|
||||
_slot = ItemTable.SLOTS.getOrDefault(slot, L2Item.SLOT_NONE);
|
||||
_slot = ItemTable.SLOTS.getOrDefault(slot, (long) L2Item.SLOT_NONE);
|
||||
if (_slot == L2Item.SLOT_NONE)
|
||||
{
|
||||
LOGGER.severe("Unknown bodypart slot for effect: " + slot);
|
||||
|
@ -73,7 +73,7 @@ public class EquipArmorSkillCondition implements ISkillCondition
|
||||
|
||||
// So from here, chest armor matches conditions
|
||||
|
||||
final int chestBodyPart = chest.getItem().getBodyPart();
|
||||
final long chestBodyPart = chest.getItem().getBodyPart();
|
||||
// return True if chest armor is a Full Armor
|
||||
if (chestBodyPart == L2Item.SLOT_FULL_ARMOR)
|
||||
{
|
||||
|
@ -7885,4 +7885,112 @@
|
||||
<skill id="13568" level="1" optional="true" /> <!-- Talisman Energy -->
|
||||
</skills>
|
||||
</set>
|
||||
<set id="415" minimumPieces="0">
|
||||
<requiredItems>
|
||||
<item id="48957" /> <!-- Artifact - P. Atk. Fighting Spirit -->
|
||||
<item id="48958" /> <!-- Artifact - M. Atk. Fighting Spirit -->
|
||||
<item id="48959" /> <!-- Artifact - Atk. Spd. Fighting Spirit -->
|
||||
<item id="48960" /> <!-- Artifact - Casting Spd. Fighting Spirit -->
|
||||
<item id="48961" /> <!-- Artifact - P. Def. Protection -->
|
||||
<item id="48962" /> <!-- Artifact - M. Def. Protection -->
|
||||
<item id="48963" /> <!-- Artifact - Max HP Protection -->
|
||||
<item id="48964" /> <!-- Artifact - Max MP Protection -->
|
||||
<item id="48965" /> <!-- Artifact - XP Gain Support -->
|
||||
<item id="48966" /> <!-- Artifact - HP Absorption Support -->
|
||||
<item id="48967" /> <!-- Artifact - Speed Support -->
|
||||
<item id="48968" /> <!-- Artifact - Received Heal Amount Support -->
|
||||
<item id="48969" /> <!-- Artifact - P. Atk. Balance -->
|
||||
<item id="48970" /> <!-- Artifact - M. Atk. Balance -->
|
||||
<item id="48971" /> <!-- Artifact - P. Accuracy Balance -->
|
||||
<item id="48972" /> <!-- Artifact - M. Accuracy Balance -->
|
||||
<item id="48973" /> <!-- Artifact - P. Critical Rate Balance -->
|
||||
<item id="48974" /> <!-- Artifact - P. Skill Critical Rate Balance -->
|
||||
<item id="48975" /> <!-- Artifact - M. Skill Critical Rate Balance -->
|
||||
<item id="48976" /> <!-- Artifact - Potion / Elixir Effect Bonus Balance -->
|
||||
<item id="48977" /> <!-- Artifact - Received Damage Reduction When Imobilized Balance -->
|
||||
<item id="48980" /> <!-- Artifact - Attack Attribute Balance -->
|
||||
<item id="48981" /> <!-- Artifact - Defense Attribute Balance -->
|
||||
<item id="48982" /> <!-- Artifact - Received Damage Reduction When Imobilized Balance -->
|
||||
<item id="48983" /> <!-- Artifact - P. Skill Power Balance -->
|
||||
<item id="48984" /> <!-- Artifact - M. Skill Power Balance -->
|
||||
<item id="48985" /> <!-- Artifact - Fixed Damage Reduction Balance -->
|
||||
</requiredItems>
|
||||
<skills>
|
||||
<!-- {slotMask;bookSlot;} used only for Artifact System -->
|
||||
<skill id="35227" level="1" slotMask="317" bookSlot="1" /> <!-- Artifact Set Effect Level 1 -->
|
||||
</skills>
|
||||
</set>
|
||||
<set id="416" minimumPieces="0">
|
||||
<requiredItems>
|
||||
<item id="48957" /> <!-- Artifact - P. Atk. Fighting Spirit -->
|
||||
<item id="48958" /> <!-- Artifact - M. Atk. Fighting Spirit -->
|
||||
<item id="48959" /> <!-- Artifact - Atk. Spd. Fighting Spirit -->
|
||||
<item id="48960" /> <!-- Artifact - Casting Spd. Fighting Spirit -->
|
||||
<item id="48961" /> <!-- Artifact - P. Def. Protection -->
|
||||
<item id="48962" /> <!-- Artifact - M. Def. Protection -->
|
||||
<item id="48963" /> <!-- Artifact - Max HP Protection -->
|
||||
<item id="48964" /> <!-- Artifact - Max MP Protection -->
|
||||
<item id="48965" /> <!-- Artifact - XP Gain Support -->
|
||||
<item id="48966" /> <!-- Artifact - HP Absorption Support -->
|
||||
<item id="48967" /> <!-- Artifact - Speed Support -->
|
||||
<item id="48968" /> <!-- Artifact - Received Heal Amount Support -->
|
||||
<item id="48969" /> <!-- Artifact - P. Atk. Balance -->
|
||||
<item id="48970" /> <!-- Artifact - M. Atk. Balance -->
|
||||
<item id="48971" /> <!-- Artifact - P. Accuracy Balance -->
|
||||
<item id="48972" /> <!-- Artifact - M. Accuracy Balance -->
|
||||
<item id="48973" /> <!-- Artifact - P. Critical Rate Balance -->
|
||||
<item id="48974" /> <!-- Artifact - P. Skill Critical Rate Balance -->
|
||||
<item id="48975" /> <!-- Artifact - M. Skill Critical Rate Balance -->
|
||||
<item id="48976" /> <!-- Artifact - Potion / Elixir Effect Bonus Balance -->
|
||||
<item id="48977" /> <!-- Artifact - Received Damage Reduction When Imobilized Balance -->
|
||||
<item id="48980" /> <!-- Artifact - Attack Attribute Balance -->
|
||||
<item id="48981" /> <!-- Artifact - Defense Attribute Balance -->
|
||||
<item id="48982" /> <!-- Artifact - Received Damage Reduction When Imobilized Balance -->
|
||||
<item id="48983" /> <!-- Artifact - P. Skill Power Balance -->
|
||||
<item id="48984" /> <!-- Artifact - M. Skill Power Balance -->
|
||||
<item id="48985" /> <!-- Artifact - Fixed Damage Reduction Balance -->
|
||||
</requiredItems>
|
||||
<skills>
|
||||
<!-- {slotMask;bookSlot;} used only for Artifact System -->
|
||||
<skill id="35227" level="1" slotMask="317" bookSlot="1" /> <!-- Artifact Set Effect Level 1 -->
|
||||
<skill id="35228" level="1" slotMask="336" bookSlot="2" /> <!-- Artifact Set Effect Level 2 -->
|
||||
</skills>
|
||||
</set>
|
||||
<set id="417" minimumPieces="0">
|
||||
<requiredItems>
|
||||
<item id="48957" /> <!-- Artifact - P. Atk. Fighting Spirit -->
|
||||
<item id="48958" /> <!-- Artifact - M. Atk. Fighting Spirit -->
|
||||
<item id="48959" /> <!-- Artifact - Atk. Spd. Fighting Spirit -->
|
||||
<item id="48960" /> <!-- Artifact - Casting Spd. Fighting Spirit -->
|
||||
<item id="48961" /> <!-- Artifact - P. Def. Protection -->
|
||||
<item id="48962" /> <!-- Artifact - M. Def. Protection -->
|
||||
<item id="48963" /> <!-- Artifact - Max HP Protection -->
|
||||
<item id="48964" /> <!-- Artifact - Max MP Protection -->
|
||||
<item id="48965" /> <!-- Artifact - XP Gain Support -->
|
||||
<item id="48966" /> <!-- Artifact - HP Absorption Support -->
|
||||
<item id="48967" /> <!-- Artifact - Speed Support -->
|
||||
<item id="48968" /> <!-- Artifact - Received Heal Amount Support -->
|
||||
<item id="48969" /> <!-- Artifact - P. Atk. Balance -->
|
||||
<item id="48970" /> <!-- Artifact - M. Atk. Balance -->
|
||||
<item id="48971" /> <!-- Artifact - P. Accuracy Balance -->
|
||||
<item id="48972" /> <!-- Artifact - M. Accuracy Balance -->
|
||||
<item id="48973" /> <!-- Artifact - P. Critical Rate Balance -->
|
||||
<item id="48974" /> <!-- Artifact - P. Skill Critical Rate Balance -->
|
||||
<item id="48975" /> <!-- Artifact - M. Skill Critical Rate Balance -->
|
||||
<item id="48976" /> <!-- Artifact - Potion / Elixir Effect Bonus Balance -->
|
||||
<item id="48977" /> <!-- Artifact - Received Damage Reduction When Imobilized Balance -->
|
||||
<item id="48980" /> <!-- Artifact - Attack Attribute Balance -->
|
||||
<item id="48981" /> <!-- Artifact - Defense Attribute Balance -->
|
||||
<item id="48982" /> <!-- Artifact - Received Damage Reduction When Imobilized Balance -->
|
||||
<item id="48983" /> <!-- Artifact - P. Skill Power Balance -->
|
||||
<item id="48984" /> <!-- Artifact - M. Skill Power Balance -->
|
||||
<item id="48985" /> <!-- Artifact - Fixed Damage Reduction Balance -->
|
||||
</requiredItems>
|
||||
<skills>
|
||||
<!-- {slotMask;bookSlot;} used only for Artifact System -->
|
||||
<skill id="35227" level="1" slotMask="317" bookSlot="1" /> <!-- Artifact Set Effect Level 1 -->
|
||||
<skill id="35228" level="1" slotMask="336" bookSlot="2" /> <!-- Artifact Set Effect Level 2 -->
|
||||
<skill id="35229" level="1" slotMask="355" bookSlot="3" /> <!-- Artifact Set Effect Level 3 -->
|
||||
</skills>
|
||||
</set>
|
||||
</list>
|
215
L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/items/48900-48999.xml
vendored
Normal file
215
L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/items/48900-48999.xml
vendored
Normal file
@ -0,0 +1,215 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/items.xsd">
|
||||
<item id="48954" name="Artifact Book - Level 1" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifactbook" />
|
||||
<set name="immediate_effect" val="true" />
|
||||
<set name="material" val="GOLD" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<cond msgId="113">
|
||||
<player level="100" />
|
||||
</cond>
|
||||
<skills>
|
||||
<skill id="39393" level="1" /> <!-- Artifact Book (Open 1 Slot) -->
|
||||
</skills>
|
||||
</item>
|
||||
<item id="48955" name="Artifact Book - Level 2" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifactbook" />
|
||||
<set name="immediate_effect" val="true" />
|
||||
<set name="material" val="GOLD" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<cond msgId="113">
|
||||
<player level="105" />
|
||||
</cond>
|
||||
<skills>
|
||||
<skill id="39394" level="1" /> <!-- Artifact Book (Open 2 Slot) -->
|
||||
</skills>
|
||||
</item>
|
||||
<item id="48956" name="Artifact Book - Level 3" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifactbook" />
|
||||
<set name="immediate_effect" val="true" />
|
||||
<set name="material" val="GOLD" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<cond msgId="113">
|
||||
<player level="110" />
|
||||
</cond>
|
||||
<skills>
|
||||
<skill id="39395" level="1" /> <!-- Artifact Book (Open 3 Slot) -->
|
||||
</skills>
|
||||
</item>
|
||||
<item id="48957" name="Artifact - P. Atk. Fighting Spirit" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48958" name="Artifact - M. Atk. Fighting Spirit" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48959" name="Artifact - Atk. Spd. Fighting Spirit" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48960" name="Artifact - Casting Spd. Fighting Spirit" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48961" name="Artifact - P. Def. Protection" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48962" name="Artifact - M. Def. Protection" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48963" name="Artifact - Max HP Protection" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48964" name="Artifact - Max MP Protection" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48965" name="Artifact - XP Gain Support" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48966" name="Artifact - HP Absorption Support" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48967" name="Artifact - Speed Support" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48968" name="Artifact - Received Heal Amount Support" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48969" name="Artifact - P. Atk. Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48970" name="Artifact - M. Atk. Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48971" name="Artifact - P. Accuracy Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48972" name="Artifact - M. Accuracy Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48973" name="Artifact - P. Critical Rate Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48974" name="Artifact - P. Skill Critical Rate Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48975" name="Artifact - M. Skill Critical Rate Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48976" name="Artifact - Potion / Elixir Effect Bonus Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48977" name="Artifact - Received Damage Reduction When Imobilized Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
<item id="48980" name="Artifact - Attack Attribute Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<skills>
|
||||
<skill id="35252" level="1" /> <!-- Artifact - Attack Attribute -->
|
||||
</skills>
|
||||
</item>
|
||||
<item id="48981" name="Artifact - Defense Attribute Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<skills>
|
||||
<skill id="35253" level="1" /> <!-- Artifact - Defense Attribute -->
|
||||
</skills>
|
||||
</item>
|
||||
<item id="48982" name="Artifact - Received Damage Reduction When Imobilized Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<skills>
|
||||
<skill id="35254" level="1" /> <!-- Artifact - Received Damage When Imobilized -->
|
||||
</skills>
|
||||
</item>
|
||||
<item id="48983" name="Artifact - P. Skill Power Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<skills>
|
||||
<skill id="35255" level="1" /> <!-- Artifact - P. Skill Power -->
|
||||
</skills>
|
||||
</item>
|
||||
<item id="48984" name="Artifact - M. Skill Power Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<skills>
|
||||
<skill id="35256" level="1" /> <!-- Artifact - M. Skill Power -->
|
||||
</skills>
|
||||
</item>
|
||||
<item id="48985" name="Artifact - Fixed Damage Reduction Balance" type="Armor">
|
||||
<set name="default_action" val="EQUIP" />
|
||||
<set name="bodypart" val="artifact" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<!-- Skill add in option stat when enchant/upgrade -->
|
||||
</item>
|
||||
</list>
|
||||
|
9
L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/items/80000-80099.xml
vendored
Normal file
9
L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/items/80000-80099.xml
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/items.xsd">
|
||||
<item id="80000" name="Artifact Fragment" type="EtcItem">
|
||||
<set name="immediate_effect" val="true" />
|
||||
<set name="material" val="GOLD" />
|
||||
<set name="is_sellable" val="false" />
|
||||
<set name="is_stackable" val="true" />
|
||||
</item>
|
||||
</list>
|
239
L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/35200-35299.xml
vendored
Normal file
239
L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/35200-35299.xml
vendored
Normal file
@ -0,0 +1,239 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/skills.xsd">
|
||||
<skill id="35227" toLevel="1" name="Artifact Set Effect - Level 1">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35228" toLevel="1" name="Artifact Set Effect - Level 2">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35229" toLevel="1" name="Artifact Set Effect - Level 3">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35230" toLevel="11" name="Artifact P. Atk.">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35231" toLevel="11" name="Artifact M. Atk.">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35232" toLevel="11" name="Artifact Atk. Spd.">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35233" toLevel="11" name="Artifact Casting Spd.">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35234" toLevel="11" name="Artifact P. Def.">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35235" toLevel="11" name="Artifact M. Def.">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35236" toLevel="11" name="Artifact Max HP">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35237" toLevel="11" name="Artifact Max MP">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35238" toLevel="11" name="Artifact XP Gain">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35239" toLevel="11" name="Artifact HP Absorption">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35240" toLevel="11" name="Artifact Speed">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35241" toLevel="11" name="Artifact Received Heal Amount">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35242" toLevel="11" name="Artifact P. Atk.">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35243" toLevel="11" name="Artifact M. Atk.">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35244" toLevel="11" name="Artifact P. Accuracy">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35245" toLevel="11" name="Artifact M. Accuracy">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35246" toLevel="11" name="Artifact P. Critical">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35247" toLevel="11" name="Artifact P. Skill Critical Rate">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35248" toLevel="11" name="Artifact M. Skill Critical Rate">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35249" toLevel="11" name="Artifact Potion / Elixir Effect Bonus">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
|
||||
<skill id="35250" toLevel="11" name="Received Damage When Imobilized">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
|
||||
<skill id="35251" toLevel="11" name="Artifact Fixed Damage Reduction">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
</skill>
|
||||
<skill id="35252" toLevel="1" name="Artifact Attack Attribute">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
<effects>
|
||||
<effect name="AttackAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>HOLY</attribute>
|
||||
</effect>
|
||||
<effect name="AttackAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>DARK</attribute>
|
||||
</effect>
|
||||
<effect name="AttackAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>FIRE</attribute>
|
||||
</effect>
|
||||
<effect name="AttackAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>WIND</attribute>
|
||||
</effect>
|
||||
<effect name="AttackAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>WATER</attribute>
|
||||
</effect>
|
||||
<effect name="AttackAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>EARTH</attribute>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="35253" toLevel="1" name="Artifact Defense Attribute">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
<effects>
|
||||
<effect name="DefenceAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>HOLY</attribute>
|
||||
</effect>
|
||||
<effect name="DefenceAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>DARK</attribute>
|
||||
</effect>
|
||||
<effect name="DefenceAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>FIRE</attribute>
|
||||
</effect>
|
||||
<effect name="DefenceAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>WIND</attribute>
|
||||
</effect>
|
||||
<effect name="DefenceAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>WATER</attribute>
|
||||
</effect>
|
||||
<effect name="DefenceAttribute">
|
||||
<amount>30</amount>
|
||||
<attribute>EARTH</attribute>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="35254" toLevel="1" name="Artifact Received Damage When Imobilized">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
<passiveConditions>
|
||||
<condition name="OpCheckAbnormal">
|
||||
<type>STUN</type>
|
||||
<level>1</level>
|
||||
<hasAbnormal>true</hasAbnormal>
|
||||
<L2Character>caster</L2Character>
|
||||
</condition>
|
||||
</passiveConditions>
|
||||
<effects>
|
||||
<effect name="DamageByAttack">
|
||||
<amount>-11</amount>
|
||||
<type>PK</type>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
<effect name="DamageByAttack">
|
||||
<amount>-11</amount>
|
||||
<type>ENEMY_ALL</type>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="35255" toLevel="1" name="Artifact P. Skill Power">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
<effects>
|
||||
<effect name="PhysicalSkillPower">
|
||||
<amount>11</amount>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="35256" toLevel="1" name="Artifact M. Skill Power">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
<effects>
|
||||
<effect name="MagicalSkillPower">
|
||||
<amount>11</amount>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
</list>
|
31
L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/39300-39399.xml
vendored
Normal file
31
L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/39300-39399.xml
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/skills.xsd">
|
||||
<skill id="39393" toLevel="1" name="Artifact Book - Level 1">
|
||||
<operateType>P</operateType>
|
||||
<effects>
|
||||
<effect name="ArtifactSlot">
|
||||
<amount>1</amount>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="39394" toLevel="1" name="Artifact Book - Level 2">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>80</magicLvl>
|
||||
<effects>
|
||||
<effect name="ArtifactSlot">
|
||||
<amount>2</amount>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="39395" toLevel="1" name="Artifact Book - Level 3">
|
||||
<operateType>P</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<magicLvl>100</magicLvl>
|
||||
<effects>
|
||||
<effect name="ArtifactSlot">
|
||||
<amount>3</amount>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
</list>
|
@ -11,6 +11,7 @@ AddTeleportBookmarkSlot: Instant effect that increases the amount of My Teleport
|
||||
AgathionSlot: Agathion slot modifier. (l2jmobius)
|
||||
AirBind: Used by airbind chain skills. (l2jmobius)
|
||||
AreaDamage: Topography (Danger Zone) resistance stat.
|
||||
ArtifactSlot: Artifact slot modifier. (l2jmobius)
|
||||
AttackAttribute: Stat that increases specific attack attribute.
|
||||
AttackAttributeAdd: Stat that increases all attack attribute.
|
||||
AttackBehind: Enables all attacks regardless of position to land towards the back.
|
||||
|
@ -37,6 +37,8 @@
|
||||
<xs:attribute type="xs:byte" name="minimumPieces" use="optional" />
|
||||
<xs:attribute type="xs:byte" name="minimumEnchant" use="optional" />
|
||||
<xs:attribute type="xs:boolean" name="optional" use="optional" />
|
||||
<xs:attribute type="xs:positiveInteger" name="slotMask" use="optional" />
|
||||
<xs:attribute type="xs:positiveInteger" name="bookSlot" use="optional" />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
|
@ -168,7 +168,6 @@
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:positiveInteger">
|
||||
<xs:minInclusive value="1" />
|
||||
<xs:maxInclusive value="107" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:attribute>
|
||||
@ -309,7 +308,6 @@
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:positiveInteger">
|
||||
<xs:minInclusive value="1" />
|
||||
<xs:maxInclusive value="65535" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:attribute>
|
||||
|
@ -102,7 +102,7 @@ public class AppearanceItemData implements IGameXmlReader
|
||||
}
|
||||
case "bodyPart":
|
||||
{
|
||||
final int part = ItemTable.SLOTS.get(c.getTextContent());
|
||||
final long part = ItemTable.SLOTS.get(c.getTextContent());
|
||||
stone.addBodyPart(part);
|
||||
break;
|
||||
}
|
||||
|
@ -129,7 +129,9 @@ public final class ArmorSetsData implements IGameXmlReader
|
||||
final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces());
|
||||
final int minEnchant = parseInteger(attrs, "minimumEnchant", 0);
|
||||
final boolean isOptional = parseBoolean(attrs, "optional", false);
|
||||
set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional));
|
||||
final int artifactSlotMask = parseInteger(attrs, "slotMask", 0);
|
||||
final int artifactBookSlot = parseInteger(attrs, "bookSlot", 0);
|
||||
set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot));
|
||||
});
|
||||
break;
|
||||
}
|
||||
|
@ -58,7 +58,7 @@ public class ItemTable
|
||||
private static Logger LOGGER = Logger.getLogger(ItemTable.class.getName());
|
||||
private static Logger LOGGER_ITEMS = Logger.getLogger("item");
|
||||
|
||||
public static final Map<String, Integer> SLOTS = new HashMap<>();
|
||||
public static final Map<String, Long> SLOTS = new HashMap<>();
|
||||
|
||||
private L2Item[] _allTemplates;
|
||||
private final Map<Integer, L2EtcItem> _etcItems = new HashMap<>();
|
||||
@ -66,45 +66,47 @@ public class ItemTable
|
||||
private final Map<Integer, L2Weapon> _weapons = new HashMap<>();
|
||||
static
|
||||
{
|
||||
SLOTS.put("shirt", L2Item.SLOT_UNDERWEAR);
|
||||
SLOTS.put("lbracelet", L2Item.SLOT_L_BRACELET);
|
||||
SLOTS.put("rbracelet", L2Item.SLOT_R_BRACELET);
|
||||
SLOTS.put("talisman", L2Item.SLOT_DECO);
|
||||
SLOTS.put("chest", L2Item.SLOT_CHEST);
|
||||
SLOTS.put("fullarmor", L2Item.SLOT_FULL_ARMOR);
|
||||
SLOTS.put("head", L2Item.SLOT_HEAD);
|
||||
SLOTS.put("hair", L2Item.SLOT_HAIR);
|
||||
SLOTS.put("hairall", L2Item.SLOT_HAIRALL);
|
||||
SLOTS.put("underwear", L2Item.SLOT_UNDERWEAR);
|
||||
SLOTS.put("back", L2Item.SLOT_BACK);
|
||||
SLOTS.put("neck", L2Item.SLOT_NECK);
|
||||
SLOTS.put("legs", L2Item.SLOT_LEGS);
|
||||
SLOTS.put("feet", L2Item.SLOT_FEET);
|
||||
SLOTS.put("gloves", L2Item.SLOT_GLOVES);
|
||||
SLOTS.put("chest,legs", L2Item.SLOT_CHEST | L2Item.SLOT_LEGS);
|
||||
SLOTS.put("belt", L2Item.SLOT_BELT);
|
||||
SLOTS.put("rhand", L2Item.SLOT_R_HAND);
|
||||
SLOTS.put("lhand", L2Item.SLOT_L_HAND);
|
||||
SLOTS.put("lrhand", L2Item.SLOT_LR_HAND);
|
||||
SLOTS.put("rear;lear", L2Item.SLOT_R_EAR | L2Item.SLOT_L_EAR);
|
||||
SLOTS.put("rfinger;lfinger", L2Item.SLOT_R_FINGER | L2Item.SLOT_L_FINGER);
|
||||
SLOTS.put("wolf", L2Item.SLOT_WOLF);
|
||||
SLOTS.put("greatwolf", L2Item.SLOT_GREATWOLF);
|
||||
SLOTS.put("hatchling", L2Item.SLOT_HATCHLING);
|
||||
SLOTS.put("strider", L2Item.SLOT_STRIDER);
|
||||
SLOTS.put("babypet", L2Item.SLOT_BABYPET);
|
||||
SLOTS.put("brooch", L2Item.SLOT_BROOCH);
|
||||
SLOTS.put("brooch_jewel", L2Item.SLOT_BROOCH_JEWEL);
|
||||
SLOTS.put("shirt", (long) L2Item.SLOT_UNDERWEAR);
|
||||
SLOTS.put("lbracelet", (long) L2Item.SLOT_L_BRACELET);
|
||||
SLOTS.put("rbracelet", (long) L2Item.SLOT_R_BRACELET);
|
||||
SLOTS.put("talisman", (long) L2Item.SLOT_DECO);
|
||||
SLOTS.put("chest", (long) L2Item.SLOT_CHEST);
|
||||
SLOTS.put("fullarmor", (long) L2Item.SLOT_FULL_ARMOR);
|
||||
SLOTS.put("head", (long) L2Item.SLOT_HEAD);
|
||||
SLOTS.put("hair", (long) L2Item.SLOT_HAIR);
|
||||
SLOTS.put("hairall", (long) L2Item.SLOT_HAIRALL);
|
||||
SLOTS.put("underwear", (long) L2Item.SLOT_UNDERWEAR);
|
||||
SLOTS.put("back", (long) L2Item.SLOT_BACK);
|
||||
SLOTS.put("neck", (long) L2Item.SLOT_NECK);
|
||||
SLOTS.put("legs", (long) L2Item.SLOT_LEGS);
|
||||
SLOTS.put("feet", (long) L2Item.SLOT_FEET);
|
||||
SLOTS.put("gloves", (long) L2Item.SLOT_GLOVES);
|
||||
SLOTS.put("chest,legs", (long) L2Item.SLOT_CHEST | L2Item.SLOT_LEGS);
|
||||
SLOTS.put("belt", (long) L2Item.SLOT_BELT);
|
||||
SLOTS.put("rhand", (long) L2Item.SLOT_R_HAND);
|
||||
SLOTS.put("lhand", (long) L2Item.SLOT_L_HAND);
|
||||
SLOTS.put("lrhand", (long) L2Item.SLOT_LR_HAND);
|
||||
SLOTS.put("rear;lear", (long) L2Item.SLOT_R_EAR | L2Item.SLOT_L_EAR);
|
||||
SLOTS.put("rfinger;lfinger", (long) L2Item.SLOT_R_FINGER | L2Item.SLOT_L_FINGER);
|
||||
SLOTS.put("wolf", (long) L2Item.SLOT_WOLF);
|
||||
SLOTS.put("greatwolf", (long) L2Item.SLOT_GREATWOLF);
|
||||
SLOTS.put("hatchling", (long) L2Item.SLOT_HATCHLING);
|
||||
SLOTS.put("strider", (long) L2Item.SLOT_STRIDER);
|
||||
SLOTS.put("babypet", (long) L2Item.SLOT_BABYPET);
|
||||
SLOTS.put("brooch", (long) L2Item.SLOT_BROOCH);
|
||||
SLOTS.put("brooch_jewel", (long) L2Item.SLOT_BROOCH_JEWEL);
|
||||
SLOTS.put("agathion", L2Item.SLOT_AGATHION);
|
||||
SLOTS.put("none", L2Item.SLOT_NONE);
|
||||
SLOTS.put("artifactbook", L2Item.SLOT_ARTIFACT_BOOK);
|
||||
SLOTS.put("artifact", L2Item.SLOT_ARTIFACT);
|
||||
SLOTS.put("none", (long) L2Item.SLOT_NONE);
|
||||
|
||||
// retail compatibility
|
||||
SLOTS.put("onepiece", L2Item.SLOT_FULL_ARMOR);
|
||||
SLOTS.put("hair2", L2Item.SLOT_HAIR2);
|
||||
SLOTS.put("dhair", L2Item.SLOT_HAIRALL);
|
||||
SLOTS.put("alldress", L2Item.SLOT_ALLDRESS);
|
||||
SLOTS.put("deco1", L2Item.SLOT_DECO);
|
||||
SLOTS.put("waist", L2Item.SLOT_BELT);
|
||||
SLOTS.put("onepiece", (long) L2Item.SLOT_FULL_ARMOR);
|
||||
SLOTS.put("hair2", (long) L2Item.SLOT_HAIR2);
|
||||
SLOTS.put("dhair", (long) L2Item.SLOT_HAIRALL);
|
||||
SLOTS.put("alldress", (long) L2Item.SLOT_ALLDRESS);
|
||||
SLOTS.put("deco1", (long) L2Item.SLOT_DECO);
|
||||
SLOTS.put("waist", (long) L2Item.SLOT_BELT);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -40,19 +40,18 @@ public enum CrystallizationType
|
||||
{
|
||||
return ARMOR;
|
||||
}
|
||||
switch (item.getBodyPart())
|
||||
if ((item.getBodyPart() == L2Item.SLOT_R_EAR) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_L_EAR) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_R_FINGER) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_L_FINGER) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_NECK) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_HAIR) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_HAIR2) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_HAIRALL) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_ARTIFACT_BOOK) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_ARTIFACT))
|
||||
{
|
||||
case L2Item.SLOT_R_EAR:
|
||||
case L2Item.SLOT_L_EAR:
|
||||
case L2Item.SLOT_R_FINGER:
|
||||
case L2Item.SLOT_L_FINGER:
|
||||
case L2Item.SLOT_NECK:
|
||||
case L2Item.SLOT_HAIR:
|
||||
case L2Item.SLOT_HAIR2:
|
||||
case L2Item.SLOT_HAIRALL:
|
||||
{
|
||||
return ACCESORY;
|
||||
}
|
||||
return ACCESORY;
|
||||
}
|
||||
|
||||
return NONE;
|
||||
|
@ -61,7 +61,29 @@ public enum InventorySlot implements IUpdateTypeComponent
|
||||
BROOCH_JEWEL3(Inventory.PAPERDOLL_BROOCH_JEWEL3),
|
||||
BROOCH_JEWEL4(Inventory.PAPERDOLL_BROOCH_JEWEL4),
|
||||
BROOCH_JEWEL5(Inventory.PAPERDOLL_BROOCH_JEWEL5),
|
||||
BROOCH_JEWEL6(Inventory.PAPERDOLL_BROOCH_JEWEL6);
|
||||
BROOCH_JEWEL6(Inventory.PAPERDOLL_BROOCH_JEWEL6),
|
||||
ARTIFACT_BOOK(Inventory.PAPERDOLL_ARTIFACT_BOOK),
|
||||
ARTIFACT1(Inventory.PAPERDOLL_ARTIFACT1),
|
||||
ARTIFACT2(Inventory.PAPERDOLL_ARTIFACT2),
|
||||
ARTIFACT3(Inventory.PAPERDOLL_ARTIFACT3),
|
||||
ARTIFACT4(Inventory.PAPERDOLL_ARTIFACT4),
|
||||
ARTIFACT5(Inventory.PAPERDOLL_ARTIFACT5),
|
||||
ARTIFACT6(Inventory.PAPERDOLL_ARTIFACT6),
|
||||
ARTIFACT7(Inventory.PAPERDOLL_ARTIFACT7),
|
||||
ARTIFACT8(Inventory.PAPERDOLL_ARTIFACT8),
|
||||
ARTIFACT9(Inventory.PAPERDOLL_ARTIFACT9),
|
||||
ARTIFACT10(Inventory.PAPERDOLL_ARTIFACT10),
|
||||
ARTIFACT11(Inventory.PAPERDOLL_ARTIFACT11),
|
||||
ARTIFACT12(Inventory.PAPERDOLL_ARTIFACT12),
|
||||
ARTIFACT13(Inventory.PAPERDOLL_ARTIFACT13),
|
||||
ARTIFACT14(Inventory.PAPERDOLL_ARTIFACT14),
|
||||
ARTIFACT15(Inventory.PAPERDOLL_ARTIFACT15),
|
||||
ARTIFACT16(Inventory.PAPERDOLL_ARTIFACT16),
|
||||
ARTIFACT17(Inventory.PAPERDOLL_ARTIFACT17),
|
||||
ARTIFACT18(Inventory.PAPERDOLL_ARTIFACT18),
|
||||
ARTIFACT19(Inventory.PAPERDOLL_ARTIFACT19),
|
||||
ARTIFACT20(Inventory.PAPERDOLL_ARTIFACT20),
|
||||
ARTIFACT21(Inventory.PAPERDOLL_ARTIFACT21);
|
||||
|
||||
private final int _paperdollSlot;
|
||||
|
||||
|
@ -114,6 +114,34 @@ public enum Movie
|
||||
SC_RAMONA_TRANS_B(120, true),
|
||||
SC_HELIOS_TRANS_A(121, true),
|
||||
SC_HELIOS_TRANS_B(122, true),
|
||||
// 152
|
||||
SC_KAIN_INTRO(123, true),
|
||||
SC_CAMILLE_INTRO(124, true),
|
||||
SC_CAMILLE_ENDING(125, true),
|
||||
SI_DEFENCE_SUCCESS(126, true),
|
||||
SI_DEFENCE_FAIL(127, true),
|
||||
SI_INZONE_FIN(128, true),
|
||||
SI_ENTER_CITADEL(129, true),
|
||||
SI_CHOICE_OF_KAIN_A(130, true),
|
||||
SI_CHOICE_OF_KAIN_B(131, true),
|
||||
EPIC_KAIN_SCENE(132, true),
|
||||
ARENA_START_BLUETEAM(133, true),
|
||||
ARENA_START_REDTEAM(134, true),
|
||||
SC_ETIS_VAN_ETINA_TRANS(135, true),
|
||||
SC_ETIS_VAN_ETINA_ENDING(136, true),
|
||||
SC_KAIN_BOSS_ENDING(137, true),
|
||||
SC_ANTARAS_INTRO(138, true),
|
||||
SC_ANTARAS_TRANS(139, true),
|
||||
EP5_ASTATINE_QST_START(140, true),
|
||||
EP5_ASTATINE_QST_END(141, true),
|
||||
EP5_HELIOS_QST_END(142, true),
|
||||
EP5_ETINA_QST_START_A(143, true),
|
||||
EP5_ETINA_QST_START_B(144, true),
|
||||
EP5_ETINA_QST_END(145, true),
|
||||
SC_INZONE_CAMILLE_INTRO(146, true),
|
||||
SC_INZONE_KAIN_INTRO(147, true),
|
||||
SC_INZONE_HELIOS_TRANS_A(148, true),
|
||||
SC_INZONE_HELIOS_TRANS_B(149, true),
|
||||
LAND_KSERTH_A(1000, true),
|
||||
LAND_KSERTH_B(1001, true),
|
||||
LAND_UNDEAD_A(1002, true),
|
||||
|
@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||
|
||||
public class CombatFlag
|
||||
{
|
||||
// private static final Logger LOGGER = Logger.getLogger(CombatFlag.class.getName());
|
||||
|
||||
private L2PcInstance _player = null;
|
||||
private int _playerId = 0;
|
||||
private L2ItemInstance _item = null;
|
||||
@ -104,7 +102,7 @@ public class CombatFlag
|
||||
{
|
||||
// Reset player stats
|
||||
_player.setCombatFlagEquipped(false);
|
||||
final int slot = _player.getInventory().getSlotFromItem(_item);
|
||||
final long slot = _player.getInventory().getSlotFromItem(_item);
|
||||
_player.getInventory().unEquipItemInBodySlot(slot);
|
||||
_player.destroyItem("CombatFlag", _item, null, true);
|
||||
_item = null;
|
||||
|
@ -54,6 +54,39 @@ public final class L2ArmorSet
|
||||
Inventory.PAPERDOLL_GLOVES,
|
||||
Inventory.PAPERDOLL_FEET
|
||||
};
|
||||
private static final int[] ARTIFACT_1_SLOTS = new int[]
|
||||
{
|
||||
Inventory.PAPERDOLL_ARTIFACT1,
|
||||
Inventory.PAPERDOLL_ARTIFACT2,
|
||||
Inventory.PAPERDOLL_ARTIFACT3,
|
||||
Inventory.PAPERDOLL_ARTIFACT4,
|
||||
Inventory.PAPERDOLL_ARTIFACT13,
|
||||
Inventory.PAPERDOLL_ARTIFACT16,
|
||||
Inventory.PAPERDOLL_ARTIFACT19,
|
||||
|
||||
};
|
||||
private static final int[] ARTIFACT_2_SLOTS = new int[]
|
||||
{
|
||||
Inventory.PAPERDOLL_ARTIFACT5,
|
||||
Inventory.PAPERDOLL_ARTIFACT6,
|
||||
Inventory.PAPERDOLL_ARTIFACT7,
|
||||
Inventory.PAPERDOLL_ARTIFACT8,
|
||||
Inventory.PAPERDOLL_ARTIFACT14,
|
||||
Inventory.PAPERDOLL_ARTIFACT17,
|
||||
Inventory.PAPERDOLL_ARTIFACT20,
|
||||
|
||||
};
|
||||
private static final int[] ARTIFACT_3_SLOTS = new int[]
|
||||
{
|
||||
Inventory.PAPERDOLL_ARTIFACT9,
|
||||
Inventory.PAPERDOLL_ARTIFACT10,
|
||||
Inventory.PAPERDOLL_ARTIFACT11,
|
||||
Inventory.PAPERDOLL_ARTIFACT12,
|
||||
Inventory.PAPERDOLL_ARTIFACT15,
|
||||
Inventory.PAPERDOLL_ARTIFACT18,
|
||||
Inventory.PAPERDOLL_ARTIFACT21,
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* @param id
|
||||
@ -202,6 +235,59 @@ public final class L2ArmorSet
|
||||
return enchantLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Condition for 3 Lv. Set Effect Applied Skill
|
||||
* @param player
|
||||
* @param bookSlot
|
||||
* @return total paperdoll(busy) count for 1 of 3 artifact book slots
|
||||
*/
|
||||
public int getArtifactSlotMask(L2PcInstance player, int bookSlot)
|
||||
{
|
||||
final PcInventory inv = player.getInventory();
|
||||
int slotMask = 0;
|
||||
switch (bookSlot)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
|
||||
for (int artifactSlot : ARTIFACT_1_SLOTS)
|
||||
{
|
||||
final L2ItemInstance itemPart = inv.getPaperdollItem(artifactSlot);
|
||||
if ((itemPart != null) && _requiredItems.contains(itemPart.getId()))
|
||||
{
|
||||
slotMask += artifactSlot;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
for (int artifactSlot : ARTIFACT_2_SLOTS)
|
||||
{
|
||||
final L2ItemInstance itemPart = inv.getPaperdollItem(artifactSlot);
|
||||
if ((itemPart != null) && _requiredItems.contains(itemPart.getId()))
|
||||
{
|
||||
slotMask += artifactSlot;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
for (int artifactSlot : ARTIFACT_3_SLOTS)
|
||||
{
|
||||
final L2ItemInstance itemPart = inv.getPaperdollItem(artifactSlot);
|
||||
if ((itemPart != null) && _requiredItems.contains(itemPart.getId()))
|
||||
{
|
||||
slotMask += artifactSlot;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return slotMask;
|
||||
}
|
||||
|
||||
public boolean hasOptionalEquipped(L2PcInstance player, Function<L2ItemInstance, Integer> idProvider)
|
||||
{
|
||||
return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item)));
|
||||
|
@ -2197,9 +2197,9 @@ public final class L2PcInstance extends L2Playable
|
||||
}
|
||||
sendPacket(sm);
|
||||
|
||||
final int slot = _inventory.getSlotFromItem(item);
|
||||
final long slot = _inventory.getSlotFromItem(item);
|
||||
// we can't unequip talisman by body slot
|
||||
if ((slot == L2Item.SLOT_DECO) || (slot == L2Item.SLOT_BROOCH_JEWEL) || (slot == L2Item.SLOT_AGATHION))
|
||||
if ((slot == L2Item.SLOT_DECO) || (slot == L2Item.SLOT_BROOCH_JEWEL) || (slot == L2Item.SLOT_AGATHION) || (slot == L2Item.SLOT_ARTIFACT))
|
||||
{
|
||||
items = _inventory.unEquipItemInSlotAndRecord(item.getLocationSlot());
|
||||
}
|
||||
@ -4990,7 +4990,7 @@ public final class L2PcInstance extends L2Playable
|
||||
}
|
||||
else
|
||||
{
|
||||
final int slot = _inventory.getSlotFromItem(_inventory.getItemByItemId(9819));
|
||||
final long slot = _inventory.getSlotFromItem(_inventory.getItemByItemId(9819));
|
||||
_inventory.unEquipItemInBodySlot(slot);
|
||||
destroyItem("CombatFlag", _inventory.getItemByItemId(9819), null, true);
|
||||
}
|
||||
@ -10887,7 +10887,7 @@ public final class L2PcInstance extends L2Playable
|
||||
}
|
||||
else
|
||||
{
|
||||
final int slot = _inventory.getSlotFromItem(_inventory.getItemByItemId(9819));
|
||||
final long slot = _inventory.getSlotFromItem(_inventory.getItemByItemId(9819));
|
||||
_inventory.unEquipItemInBodySlot(slot);
|
||||
destroyItem("CombatFlag", _inventory.getItemByItemId(9819), null, true);
|
||||
}
|
||||
|
@ -681,6 +681,15 @@ public class PcStat extends PlayableStat
|
||||
return (int) getValue(Stats.AGATHION_SLOTS, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the maximum artifact book count.
|
||||
* @return the maximum artifact book count
|
||||
*/
|
||||
public int getArtifactSlots()
|
||||
{
|
||||
return (int) getValue(Stats.ARTIFACT_SLOTS, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRecalculateStats(boolean broadcast)
|
||||
{
|
||||
|
@ -70,7 +70,7 @@ public final class ConditionUsingItemType extends Condition
|
||||
|
||||
// So from here, chest armor matches conditions
|
||||
|
||||
final int chestBodyPart = chest.getItem().getBodyPart();
|
||||
final long chestBodyPart = chest.getItem().getBodyPart();
|
||||
// return True if chest armor is a Full Armor
|
||||
if (chestBodyPart == L2Item.SLOT_FULL_ARMOR)
|
||||
{
|
||||
|
@ -35,7 +35,7 @@ public class AppearanceHolder
|
||||
private final AppearanceHandType _handType;
|
||||
private final AppearanceMagicType _magicType;
|
||||
private final AppearanceTargetType _targetType;
|
||||
private final Integer _bodyPart;
|
||||
private final long _bodyPart;
|
||||
|
||||
public AppearanceHolder(StatsSet set)
|
||||
{
|
||||
@ -73,7 +73,7 @@ public class AppearanceHolder
|
||||
return _targetType;
|
||||
}
|
||||
|
||||
public int getBodyPart()
|
||||
public long getBodyPart()
|
||||
{
|
||||
return _bodyPart;
|
||||
}
|
||||
|
@ -29,14 +29,18 @@ public class ArmorsetSkillHolder extends SkillHolder
|
||||
{
|
||||
private final int _minimumPieces;
|
||||
private final int _minEnchant;
|
||||
private final int _artifactSlotMask;
|
||||
private final int _artifactBookSlot;
|
||||
private final boolean _isOptional;
|
||||
|
||||
public ArmorsetSkillHolder(int skillId, int skillLvl, int minimumPieces, int minEnchant, boolean isOptional)
|
||||
public ArmorsetSkillHolder(int skillId, int skillLvl, int minimumPieces, int minEnchant, boolean isOptional, int artifactSlotMask, int artifactBookSlot)
|
||||
{
|
||||
super(skillId, skillLvl);
|
||||
_minimumPieces = minimumPieces;
|
||||
_minEnchant = minEnchant;
|
||||
_isOptional = isOptional;
|
||||
_artifactSlotMask = artifactSlotMask;
|
||||
_artifactBookSlot = artifactBookSlot;
|
||||
}
|
||||
|
||||
public int getMinimumPieces()
|
||||
@ -56,6 +60,12 @@ public class ArmorsetSkillHolder extends SkillHolder
|
||||
|
||||
public boolean validateConditions(L2PcInstance player, L2ArmorSet armorSet, Function<L2ItemInstance, Integer> idProvider)
|
||||
{
|
||||
// Player's doesn't have full busy (1 of 3) artifact real slot
|
||||
if (_artifactSlotMask > armorSet.getArtifactSlotMask(player, _artifactBookSlot))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Player doesn't have enough items equipped to use this skill
|
||||
if (_minimumPieces > armorSet.getPiecesCount(player, idProvider))
|
||||
{
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -41,8 +41,8 @@ public final class L2Armor extends L2Item
|
||||
super.set(set);
|
||||
_type = set.getEnum("armor_type", ArmorType.class, ArmorType.NONE);
|
||||
|
||||
final int _bodyPart = getBodyPart();
|
||||
if ((_bodyPart == L2Item.SLOT_NECK) || ((_bodyPart & L2Item.SLOT_L_EAR) != 0) || ((_bodyPart & L2Item.SLOT_L_FINGER) != 0) || ((_bodyPart & L2Item.SLOT_R_BRACELET) != 0) || ((_bodyPart & L2Item.SLOT_L_BRACELET) != 0))
|
||||
final long _bodyPart = getBodyPart();
|
||||
if ((_bodyPart == L2Item.SLOT_NECK) || ((_bodyPart & L2Item.SLOT_L_EAR) != 0) || ((_bodyPart & L2Item.SLOT_L_FINGER) != 0) || ((_bodyPart & L2Item.SLOT_R_BRACELET) != 0) || ((_bodyPart & L2Item.SLOT_L_BRACELET) != 0) || ((_bodyPart & L2Item.SLOT_ARTIFACT_BOOK) != 0))
|
||||
{
|
||||
_type1 = L2Item.TYPE1_WEAPON_RING_EARRING_NECKLACE;
|
||||
_type2 = L2Item.TYPE2_ACCESSORY;
|
||||
|
@ -111,7 +111,9 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable
|
||||
public static final int SLOT_BELT = 0x10000000;
|
||||
public static final int SLOT_BROOCH = 0x20000000;
|
||||
public static final int SLOT_BROOCH_JEWEL = 0x40000000;
|
||||
public static final int SLOT_AGATHION = 0x80000000;
|
||||
public static final long SLOT_AGATHION = 0x3000000000L;
|
||||
public static final long SLOT_ARTIFACT_BOOK = 0x20000000000L;
|
||||
public static final long SLOT_ARTIFACT = 0x40000000000L;
|
||||
|
||||
public static final int SLOT_WOLF = -100;
|
||||
public static final int SLOT_HATCHLING = -101;
|
||||
@ -134,7 +136,7 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable
|
||||
private int _duration;
|
||||
private long _time;
|
||||
private int _autoDestroyTime;
|
||||
private int _bodyPart;
|
||||
private long _bodyPart;
|
||||
private long _referencePrice;
|
||||
private int _crystalCount;
|
||||
private boolean _sellable;
|
||||
@ -503,7 +505,7 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable
|
||||
/**
|
||||
* @return the part of the body used with the item.
|
||||
*/
|
||||
public final int getBodyPart()
|
||||
public final long getBodyPart()
|
||||
{
|
||||
return _bodyPart;
|
||||
}
|
||||
|
@ -171,7 +171,7 @@ public class L2WarehouseItem
|
||||
/**
|
||||
* @return the part of body used with this item.
|
||||
*/
|
||||
public final int getBodyPart()
|
||||
public final long getBodyPart()
|
||||
{
|
||||
return _item.getBodyPart();
|
||||
}
|
||||
|
@ -49,7 +49,7 @@ public class AppearanceStone
|
||||
private final AppearanceMagicType _magicType;
|
||||
private List<CrystalType> _crystalTypes;
|
||||
private List<AppearanceTargetType> _targetTypes;
|
||||
private List<Integer> _bodyParts;
|
||||
private List<Long> _bodyParts;
|
||||
private List<Race> _races;
|
||||
private List<Race> _racesNot;
|
||||
private List<AppearanceHolder> _allVisualIds;
|
||||
@ -103,7 +103,7 @@ public class AppearanceStone
|
||||
addCrystalType(crystalType);
|
||||
}
|
||||
|
||||
final int bodyPart = ItemTable.SLOTS.get(set.getString("bodyPart", "none"));
|
||||
final long bodyPart = ItemTable.SLOTS.get(set.getString("bodyPart", "none"));
|
||||
if (bodyPart != L2Item.SLOT_NONE)
|
||||
{
|
||||
addBodyPart(bodyPart);
|
||||
@ -195,7 +195,7 @@ public class AppearanceStone
|
||||
return _targetTypes != null ? _targetTypes : Collections.emptyList();
|
||||
}
|
||||
|
||||
public void addBodyPart(Integer part)
|
||||
public void addBodyPart(long part)
|
||||
{
|
||||
if (_bodyParts == null)
|
||||
{
|
||||
@ -218,7 +218,7 @@ public class AppearanceStone
|
||||
return _allVisualIds != null ? _allVisualIds : Collections.emptyList();
|
||||
}
|
||||
|
||||
public List<Integer> getBodyParts()
|
||||
public List<Long> getBodyParts()
|
||||
{
|
||||
return _bodyParts != null ? _bodyParts : Collections.emptyList();
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ public final class EnchantRateItem
|
||||
* Adds body slot verification.
|
||||
* @param slot
|
||||
*/
|
||||
public void addSlot(int slot)
|
||||
public void addSlot(long slot)
|
||||
{
|
||||
_slot |= slot;
|
||||
}
|
||||
|
@ -112,13 +112,13 @@ public interface IStatsFunction
|
||||
for (L2ItemInstance equippedItem : creature.getInventory().getPaperdollItems(L2ItemInstance::isEquipped, L2ItemInstance::isEnchanted))
|
||||
{
|
||||
final L2Item item = equippedItem.getItem();
|
||||
final int bodypart = item.getBodyPart();
|
||||
final long bodypart = item.getBodyPart();
|
||||
if ((bodypart == L2Item.SLOT_HAIR) || //
|
||||
(bodypart == L2Item.SLOT_HAIR2) || //
|
||||
(bodypart == L2Item.SLOT_HAIRALL))
|
||||
{
|
||||
// TODO: Item after enchant shows pDef, but scroll says mDef increase.
|
||||
if (stat != Stats.PHYSICAL_DEFENCE && stat != Stats.MAGICAL_DEFENCE)
|
||||
if ((stat != Stats.PHYSICAL_DEFENCE) && (stat != Stats.MAGICAL_DEFENCE))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
@ -251,6 +251,9 @@ public enum Stats
|
||||
// Agathions
|
||||
AGATHION_SLOTS("agathionSlots"),
|
||||
|
||||
// Artifacts
|
||||
ARTIFACT_SLOTS("artifactSlots"),
|
||||
|
||||
// Summon Points
|
||||
MAX_SUMMON_POINTS("summonPoints"),
|
||||
|
||||
|
@ -214,7 +214,7 @@ public class L2SiegeZone extends L2ZoneType
|
||||
}
|
||||
else
|
||||
{
|
||||
final int slot = activeChar.getInventory().getSlotFromItem(activeChar.getInventory().getItemByItemId(9819));
|
||||
final long slot = activeChar.getInventory().getSlotFromItem(activeChar.getInventory().getItemByItemId(9819));
|
||||
activeChar.getInventory().unEquipItemInBodySlot(slot);
|
||||
activeChar.destroyItem("CombatFlag", activeChar.getInventory().getItemByItemId(9819), null, true);
|
||||
}
|
||||
|
@ -563,7 +563,7 @@ public class EnterWorld implements IClientIncomingPacket
|
||||
}
|
||||
else
|
||||
{
|
||||
final int slot = activeChar.getInventory().getSlotFromItem(activeChar.getInventory().getItemByItemId(9819));
|
||||
final long slot = activeChar.getInventory().getSlotFromItem(activeChar.getInventory().getItemByItemId(9819));
|
||||
activeChar.getInventory().unEquipItemInBodySlot(slot);
|
||||
activeChar.destroyItem("CombatFlag", activeChar.getInventory().getItemByItemId(9819), null, true);
|
||||
}
|
||||
|
@ -192,64 +192,61 @@ public final class UseItem implements IClientIncomingPacket
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (item.getItem().getBodyPart())
|
||||
// Prevent players to equip weapon while wearing combat flag
|
||||
// Don't allow weapon/shield equipment if a cursed weapon is equipped.
|
||||
if ((item.getItem().getBodyPart() == L2Item.SLOT_LR_HAND) || (item.getItem().getBodyPart() == L2Item.SLOT_L_HAND) || (item.getItem().getBodyPart() == L2Item.SLOT_R_HAND))
|
||||
{
|
||||
case L2Item.SLOT_LR_HAND:
|
||||
case L2Item.SLOT_L_HAND:
|
||||
case L2Item.SLOT_R_HAND:
|
||||
if ((activeChar.getActiveWeaponItem() != null) && (activeChar.getActiveWeaponItem().getId() == 9819))
|
||||
{
|
||||
// Prevent players to equip weapon while wearing combat flag
|
||||
if ((activeChar.getActiveWeaponItem() != null) && (activeChar.getActiveWeaponItem().getId() == 9819))
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
|
||||
if (activeChar.isMounted() || activeChar.isDisarmed())
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't allow weapon/shield equipment if a cursed weapon is equipped.
|
||||
if (activeChar.isCursedWeaponEquipped())
|
||||
{
|
||||
return;
|
||||
}
|
||||
break;
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
case L2Item.SLOT_DECO:
|
||||
if (activeChar.isMounted() || activeChar.isDisarmed())
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getTalismanSlots() == 0))
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
case L2Item.SLOT_BROOCH_JEWEL:
|
||||
if (activeChar.isCursedWeaponEquipped())
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getBroochJewelSlots() == 0))
|
||||
{
|
||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_CANNOT_EQUIP_S1_WITHOUT_EQUIPPING_A_BROOCH);
|
||||
sm.addItemName(item);
|
||||
activeChar.sendPacket(sm);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case L2Item.SLOT_AGATHION:
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getAgathionSlots() == 0))
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (item.getItem().getBodyPart() == L2Item.SLOT_DECO)
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getTalismanSlots() == 0))
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (item.getItem().getBodyPart() == L2Item.SLOT_BROOCH_JEWEL)
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getBroochJewelSlots() == 0))
|
||||
{
|
||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_CANNOT_EQUIP_S1_WITHOUT_EQUIPPING_A_BROOCH);
|
||||
sm.addItemName(item);
|
||||
activeChar.sendPacket(sm);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (item.getItem().getBodyPart() == L2Item.SLOT_AGATHION)
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getAgathionSlots() == 0))
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (item.getItem().getBodyPart() == L2Item.SLOT_ARTIFACT)
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getArtifactSlots() == 0))
|
||||
{
|
||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVEN_T_EQUIPPED_AN_ARTIFACT_BOOK_SO_S1_CANNOT_BE_EQUIPPED);
|
||||
sm.addItemName(item);
|
||||
activeChar.sendPacket(sm);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (activeChar.isCastingNow())
|
||||
{
|
||||
// Create and Bind the next action to the AI
|
||||
|
@ -88,7 +88,29 @@ public class CharSelectionInfo implements IClientOutgoingPacket
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL3,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL4,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL5,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL6
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL6,
|
||||
Inventory.PAPERDOLL_ARTIFACT_BOOK, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT1, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT2, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT3, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT4, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT5, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT6, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT7, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT8, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT9, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT10, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT11, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT12, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT13, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT14, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT15, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT16, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT17, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT18, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT19, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT20, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT21 // 152
|
||||
};
|
||||
|
||||
private static final int[] PAPERDOLL_ORDER_VISUAL_ID = new int[]
|
||||
@ -215,29 +237,6 @@ public class CharSelectionInfo implements IClientOutgoingPacket
|
||||
packet.writeD(charInfoPackage.getPaperdollItemId(slot));
|
||||
}
|
||||
|
||||
packet.writeD(0x00); // Book // 152
|
||||
packet.writeD(0x00); // Balance artifact (1) // 152
|
||||
packet.writeD(0x00); // Balance artifact (2) // 152
|
||||
packet.writeD(0x00); // Balance artifact (3) // 152
|
||||
packet.writeD(0x00); // Balance artifact (4) // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
|
||||
for (int slot : getPaperdollOrderVisualId())
|
||||
{
|
||||
packet.writeD(charInfoPackage.getPaperdollItemVisualId(slot));
|
||||
|
@ -69,7 +69,7 @@ public class ExStorageMaxCount implements IClientOutgoingPacket
|
||||
packet.writeD(_inventoryQuestItems);
|
||||
packet.writeD(40); // TODO: Find me!
|
||||
packet.writeD(40); // TODO: Find me!
|
||||
packet.writeD(0x00); // Artifact slots // 152
|
||||
packet.writeD(0x64); // Artifact slots (Fixed)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ public class ExUserInfoEquipSlot extends AbstractMaskPacket<InventorySlot>
|
||||
OutgoingPackets.EX_USER_INFO_EQUIP_SLOT.writeId(packet);
|
||||
|
||||
packet.writeD(_activeChar.getObjectId());
|
||||
packet.writeH(60); // 152
|
||||
packet.writeH(InventorySlot.values().length); // 152
|
||||
packet.writeB(_masks);
|
||||
|
||||
final PcInventory inventory = _activeChar.getInventory();
|
||||
|
@ -70,7 +70,29 @@ public interface IClientOutgoingPacket extends IOutgoingPacket
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL3,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL4,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL5,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL6
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL6,
|
||||
Inventory.PAPERDOLL_ARTIFACT_BOOK,
|
||||
Inventory.PAPERDOLL_ARTIFACT1,
|
||||
Inventory.PAPERDOLL_ARTIFACT2,
|
||||
Inventory.PAPERDOLL_ARTIFACT3,
|
||||
Inventory.PAPERDOLL_ARTIFACT4,
|
||||
Inventory.PAPERDOLL_ARTIFACT5,
|
||||
Inventory.PAPERDOLL_ARTIFACT6,
|
||||
Inventory.PAPERDOLL_ARTIFACT7,
|
||||
Inventory.PAPERDOLL_ARTIFACT8,
|
||||
Inventory.PAPERDOLL_ARTIFACT9,
|
||||
Inventory.PAPERDOLL_ARTIFACT10,
|
||||
Inventory.PAPERDOLL_ARTIFACT11,
|
||||
Inventory.PAPERDOLL_ARTIFACT12,
|
||||
Inventory.PAPERDOLL_ARTIFACT13,
|
||||
Inventory.PAPERDOLL_ARTIFACT14,
|
||||
Inventory.PAPERDOLL_ARTIFACT15,
|
||||
Inventory.PAPERDOLL_ARTIFACT16,
|
||||
Inventory.PAPERDOLL_ARTIFACT17,
|
||||
Inventory.PAPERDOLL_ARTIFACT18,
|
||||
Inventory.PAPERDOLL_ARTIFACT19,
|
||||
Inventory.PAPERDOLL_ARTIFACT20,
|
||||
Inventory.PAPERDOLL_ARTIFACT21,
|
||||
};
|
||||
|
||||
int[] PAPERDOLL_ORDER_AUGMENT = new int[]
|
||||
|
@ -334,13 +334,13 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
|
||||
{
|
||||
packet.writeC(0x01); // Charm slots
|
||||
packet.writeC(_activeChar.getInventory().getAgathionSlots() - 1);
|
||||
packet.writeC(0x00); // Artifact set slots // 152
|
||||
packet.writeC(_activeChar.getInventory().getArtifactSlots()); // Artifact set slots // 152
|
||||
}
|
||||
else
|
||||
{
|
||||
packet.writeC(0x00); // Charm slots
|
||||
packet.writeC(0x00);
|
||||
packet.writeC(0x00); // Artifact set slots // 152
|
||||
packet.writeC(_activeChar.getInventory().getArtifactSlots()); // Artifact set slots // 152
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -84,9 +84,11 @@ Grand Crusade:
|
||||
Salvation:
|
||||
-TODO: Skills
|
||||
-TODO: Skill trees
|
||||
-New Agathion item support
|
||||
|
||||
Etina's Fate:
|
||||
-TODO: Parse new items from client
|
||||
-Artifact item support
|
||||
|
||||
Events:
|
||||
-Birth of Draco
|
||||
|
@ -41,6 +41,7 @@ public final class EffectMasterHandler
|
||||
EffectHandler.getInstance().registerHandler("AddTeleportBookmarkSlot", AddTeleportBookmarkSlot::new);
|
||||
EffectHandler.getInstance().registerHandler("AgathionSlot", AgathionSlot::new);
|
||||
EffectHandler.getInstance().registerHandler("AreaDamage", AreaDamage::new);
|
||||
EffectHandler.getInstance().registerHandler("ArtifactSlot", ArtifactSlot::new);
|
||||
EffectHandler.getInstance().registerHandler("AttackAttribute", AttackAttribute::new);
|
||||
EffectHandler.getInstance().registerHandler("AttackAttributeAdd", AttackAttributeAdd::new);
|
||||
EffectHandler.getInstance().registerHandler("AttackBehind", AttackBehind::new);
|
||||
|
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* This program 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.stats.Stats;
|
||||
|
||||
/**
|
||||
* @author hlwrave
|
||||
*/
|
||||
public class ArtifactSlot extends AbstractStatAddEffect
|
||||
{
|
||||
public ArtifactSlot(StatsSet params)
|
||||
{
|
||||
super(params, Stats.ARTIFACT_SLOTS);
|
||||
}
|
||||
}
|
@ -38,14 +38,14 @@ import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||
public final class Disarmor extends AbstractEffect
|
||||
{
|
||||
private final Map<Integer, Integer> _unequippedItems; // PlayerObjId, ItemObjId
|
||||
private final int _slot;
|
||||
private final long _slot;
|
||||
|
||||
public Disarmor(StatsSet params)
|
||||
{
|
||||
_unequippedItems = new ConcurrentHashMap<>();
|
||||
|
||||
final String slot = params.getString("slot", "chest");
|
||||
_slot = ItemTable.SLOTS.getOrDefault(slot, L2Item.SLOT_NONE);
|
||||
_slot = ItemTable.SLOTS.getOrDefault(slot, (long) L2Item.SLOT_NONE);
|
||||
if (_slot == L2Item.SLOT_NONE)
|
||||
{
|
||||
LOGGER.severe("Unknown bodypart slot for effect: " + slot);
|
||||
|
@ -73,7 +73,7 @@ public class EquipArmorSkillCondition implements ISkillCondition
|
||||
|
||||
// So from here, chest armor matches conditions
|
||||
|
||||
final int chestBodyPart = chest.getItem().getBodyPart();
|
||||
final long chestBodyPart = chest.getItem().getBodyPart();
|
||||
// return True if chest armor is a Full Armor
|
||||
if (chestBodyPart == L2Item.SLOT_FULL_ARMOR)
|
||||
{
|
||||
|
@ -10,6 +10,7 @@ AddSkillBySkill: Add skill when other skill already exists. (l2jmobius)
|
||||
AddTeleportBookmarkSlot: Instant effect that increases the amount of My Teleport slots.
|
||||
AgathionSlot: Agathion slot modifier. (l2jmobius)
|
||||
AreaDamage: Topography (Danger Zone) resistance stat.
|
||||
ArtifactSlot: Artifact slot modifier. (l2jmobius)
|
||||
AttackAttribute: Stat that increases specific attack attribute.
|
||||
AttackAttributeAdd: Stat that increases all attack attribute.
|
||||
AttackBehind: Enables all attacks regardless of position to land towards the back.
|
||||
|
@ -37,6 +37,8 @@
|
||||
<xs:attribute type="xs:byte" name="minimumPieces" use="optional" />
|
||||
<xs:attribute type="xs:byte" name="minimumEnchant" use="optional" />
|
||||
<xs:attribute type="xs:boolean" name="optional" use="optional" />
|
||||
<xs:attribute type="xs:positiveInteger" name="slotMask" use="optional" />
|
||||
<xs:attribute type="xs:positiveInteger" name="bookSlot" use="optional" />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
|
@ -168,7 +168,6 @@
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:positiveInteger">
|
||||
<xs:minInclusive value="1" />
|
||||
<xs:maxInclusive value="107" />
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:attribute>
|
||||
|
@ -102,7 +102,7 @@ public class AppearanceItemData implements IGameXmlReader
|
||||
}
|
||||
case "bodyPart":
|
||||
{
|
||||
final int part = ItemTable.SLOTS.get(c.getTextContent());
|
||||
final long part = ItemTable.SLOTS.get(c.getTextContent());
|
||||
stone.addBodyPart(part);
|
||||
break;
|
||||
}
|
||||
|
@ -129,7 +129,9 @@ public final class ArmorSetsData implements IGameXmlReader
|
||||
final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces());
|
||||
final int minEnchant = parseInteger(attrs, "minimumEnchant", 0);
|
||||
final boolean isOptional = parseBoolean(attrs, "optional", false);
|
||||
set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional));
|
||||
final int artifactSlotMask = parseInteger(attrs, "slotMask", 0);
|
||||
final int artifactBookSlot = parseInteger(attrs, "bookSlot", 0);
|
||||
set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot));
|
||||
});
|
||||
break;
|
||||
}
|
||||
|
@ -58,7 +58,7 @@ public class ItemTable
|
||||
private static Logger LOGGER = Logger.getLogger(ItemTable.class.getName());
|
||||
private static Logger LOGGER_ITEMS = Logger.getLogger("item");
|
||||
|
||||
public static final Map<String, Integer> SLOTS = new HashMap<>();
|
||||
public static final Map<String, Long> SLOTS = new HashMap<>();
|
||||
|
||||
private L2Item[] _allTemplates;
|
||||
private final Map<Integer, L2EtcItem> _etcItems = new HashMap<>();
|
||||
@ -66,45 +66,47 @@ public class ItemTable
|
||||
private final Map<Integer, L2Weapon> _weapons = new HashMap<>();
|
||||
static
|
||||
{
|
||||
SLOTS.put("shirt", L2Item.SLOT_UNDERWEAR);
|
||||
SLOTS.put("lbracelet", L2Item.SLOT_L_BRACELET);
|
||||
SLOTS.put("rbracelet", L2Item.SLOT_R_BRACELET);
|
||||
SLOTS.put("talisman", L2Item.SLOT_DECO);
|
||||
SLOTS.put("chest", L2Item.SLOT_CHEST);
|
||||
SLOTS.put("fullarmor", L2Item.SLOT_FULL_ARMOR);
|
||||
SLOTS.put("head", L2Item.SLOT_HEAD);
|
||||
SLOTS.put("hair", L2Item.SLOT_HAIR);
|
||||
SLOTS.put("hairall", L2Item.SLOT_HAIRALL);
|
||||
SLOTS.put("underwear", L2Item.SLOT_UNDERWEAR);
|
||||
SLOTS.put("back", L2Item.SLOT_BACK);
|
||||
SLOTS.put("neck", L2Item.SLOT_NECK);
|
||||
SLOTS.put("legs", L2Item.SLOT_LEGS);
|
||||
SLOTS.put("feet", L2Item.SLOT_FEET);
|
||||
SLOTS.put("gloves", L2Item.SLOT_GLOVES);
|
||||
SLOTS.put("chest,legs", L2Item.SLOT_CHEST | L2Item.SLOT_LEGS);
|
||||
SLOTS.put("belt", L2Item.SLOT_BELT);
|
||||
SLOTS.put("rhand", L2Item.SLOT_R_HAND);
|
||||
SLOTS.put("lhand", L2Item.SLOT_L_HAND);
|
||||
SLOTS.put("lrhand", L2Item.SLOT_LR_HAND);
|
||||
SLOTS.put("rear;lear", L2Item.SLOT_R_EAR | L2Item.SLOT_L_EAR);
|
||||
SLOTS.put("rfinger;lfinger", L2Item.SLOT_R_FINGER | L2Item.SLOT_L_FINGER);
|
||||
SLOTS.put("wolf", L2Item.SLOT_WOLF);
|
||||
SLOTS.put("greatwolf", L2Item.SLOT_GREATWOLF);
|
||||
SLOTS.put("hatchling", L2Item.SLOT_HATCHLING);
|
||||
SLOTS.put("strider", L2Item.SLOT_STRIDER);
|
||||
SLOTS.put("babypet", L2Item.SLOT_BABYPET);
|
||||
SLOTS.put("brooch", L2Item.SLOT_BROOCH);
|
||||
SLOTS.put("brooch_jewel", L2Item.SLOT_BROOCH_JEWEL);
|
||||
SLOTS.put("shirt", (long) L2Item.SLOT_UNDERWEAR);
|
||||
SLOTS.put("lbracelet", (long) L2Item.SLOT_L_BRACELET);
|
||||
SLOTS.put("rbracelet", (long) L2Item.SLOT_R_BRACELET);
|
||||
SLOTS.put("talisman", (long) L2Item.SLOT_DECO);
|
||||
SLOTS.put("chest", (long) L2Item.SLOT_CHEST);
|
||||
SLOTS.put("fullarmor", (long) L2Item.SLOT_FULL_ARMOR);
|
||||
SLOTS.put("head", (long) L2Item.SLOT_HEAD);
|
||||
SLOTS.put("hair", (long) L2Item.SLOT_HAIR);
|
||||
SLOTS.put("hairall", (long) L2Item.SLOT_HAIRALL);
|
||||
SLOTS.put("underwear", (long) L2Item.SLOT_UNDERWEAR);
|
||||
SLOTS.put("back", (long) L2Item.SLOT_BACK);
|
||||
SLOTS.put("neck", (long) L2Item.SLOT_NECK);
|
||||
SLOTS.put("legs", (long) L2Item.SLOT_LEGS);
|
||||
SLOTS.put("feet", (long) L2Item.SLOT_FEET);
|
||||
SLOTS.put("gloves", (long) L2Item.SLOT_GLOVES);
|
||||
SLOTS.put("chest,legs", (long) L2Item.SLOT_CHEST | L2Item.SLOT_LEGS);
|
||||
SLOTS.put("belt", (long) L2Item.SLOT_BELT);
|
||||
SLOTS.put("rhand", (long) L2Item.SLOT_R_HAND);
|
||||
SLOTS.put("lhand", (long) L2Item.SLOT_L_HAND);
|
||||
SLOTS.put("lrhand", (long) L2Item.SLOT_LR_HAND);
|
||||
SLOTS.put("rear;lear", (long) L2Item.SLOT_R_EAR | L2Item.SLOT_L_EAR);
|
||||
SLOTS.put("rfinger;lfinger", (long) L2Item.SLOT_R_FINGER | L2Item.SLOT_L_FINGER);
|
||||
SLOTS.put("wolf", (long) L2Item.SLOT_WOLF);
|
||||
SLOTS.put("greatwolf", (long) L2Item.SLOT_GREATWOLF);
|
||||
SLOTS.put("hatchling", (long) L2Item.SLOT_HATCHLING);
|
||||
SLOTS.put("strider", (long) L2Item.SLOT_STRIDER);
|
||||
SLOTS.put("babypet", (long) L2Item.SLOT_BABYPET);
|
||||
SLOTS.put("brooch", (long) L2Item.SLOT_BROOCH);
|
||||
SLOTS.put("brooch_jewel", (long) L2Item.SLOT_BROOCH_JEWEL);
|
||||
SLOTS.put("agathion", L2Item.SLOT_AGATHION);
|
||||
SLOTS.put("none", L2Item.SLOT_NONE);
|
||||
SLOTS.put("artifactbook", L2Item.SLOT_ARTIFACT_BOOK);
|
||||
SLOTS.put("artifact", L2Item.SLOT_ARTIFACT);
|
||||
SLOTS.put("none", (long) L2Item.SLOT_NONE);
|
||||
|
||||
// retail compatibility
|
||||
SLOTS.put("onepiece", L2Item.SLOT_FULL_ARMOR);
|
||||
SLOTS.put("hair2", L2Item.SLOT_HAIR2);
|
||||
SLOTS.put("dhair", L2Item.SLOT_HAIRALL);
|
||||
SLOTS.put("alldress", L2Item.SLOT_ALLDRESS);
|
||||
SLOTS.put("deco1", L2Item.SLOT_DECO);
|
||||
SLOTS.put("waist", L2Item.SLOT_BELT);
|
||||
SLOTS.put("onepiece", (long) L2Item.SLOT_FULL_ARMOR);
|
||||
SLOTS.put("hair2", (long) L2Item.SLOT_HAIR2);
|
||||
SLOTS.put("dhair", (long) L2Item.SLOT_HAIRALL);
|
||||
SLOTS.put("alldress", (long) L2Item.SLOT_ALLDRESS);
|
||||
SLOTS.put("deco1", (long) L2Item.SLOT_DECO);
|
||||
SLOTS.put("waist", (long) L2Item.SLOT_BELT);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -40,19 +40,18 @@ public enum CrystallizationType
|
||||
{
|
||||
return ARMOR;
|
||||
}
|
||||
switch (item.getBodyPart())
|
||||
if ((item.getBodyPart() == L2Item.SLOT_R_EAR) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_L_EAR) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_R_FINGER) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_L_FINGER) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_NECK) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_HAIR) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_HAIR2) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_HAIRALL) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_ARTIFACT_BOOK) //
|
||||
|| (item.getBodyPart() == L2Item.SLOT_ARTIFACT))
|
||||
{
|
||||
case L2Item.SLOT_R_EAR:
|
||||
case L2Item.SLOT_L_EAR:
|
||||
case L2Item.SLOT_R_FINGER:
|
||||
case L2Item.SLOT_L_FINGER:
|
||||
case L2Item.SLOT_NECK:
|
||||
case L2Item.SLOT_HAIR:
|
||||
case L2Item.SLOT_HAIR2:
|
||||
case L2Item.SLOT_HAIRALL:
|
||||
{
|
||||
return ACCESORY;
|
||||
}
|
||||
return ACCESORY;
|
||||
}
|
||||
|
||||
return NONE;
|
||||
|
@ -61,7 +61,29 @@ public enum InventorySlot implements IUpdateTypeComponent
|
||||
BROOCH_JEWEL3(Inventory.PAPERDOLL_BROOCH_JEWEL3),
|
||||
BROOCH_JEWEL4(Inventory.PAPERDOLL_BROOCH_JEWEL4),
|
||||
BROOCH_JEWEL5(Inventory.PAPERDOLL_BROOCH_JEWEL5),
|
||||
BROOCH_JEWEL6(Inventory.PAPERDOLL_BROOCH_JEWEL6);
|
||||
BROOCH_JEWEL6(Inventory.PAPERDOLL_BROOCH_JEWEL6),
|
||||
ARTIFACT_BOOK(Inventory.PAPERDOLL_ARTIFACT_BOOK),
|
||||
ARTIFACT1(Inventory.PAPERDOLL_ARTIFACT1),
|
||||
ARTIFACT2(Inventory.PAPERDOLL_ARTIFACT2),
|
||||
ARTIFACT3(Inventory.PAPERDOLL_ARTIFACT3),
|
||||
ARTIFACT4(Inventory.PAPERDOLL_ARTIFACT4),
|
||||
ARTIFACT5(Inventory.PAPERDOLL_ARTIFACT5),
|
||||
ARTIFACT6(Inventory.PAPERDOLL_ARTIFACT6),
|
||||
ARTIFACT7(Inventory.PAPERDOLL_ARTIFACT7),
|
||||
ARTIFACT8(Inventory.PAPERDOLL_ARTIFACT8),
|
||||
ARTIFACT9(Inventory.PAPERDOLL_ARTIFACT9),
|
||||
ARTIFACT10(Inventory.PAPERDOLL_ARTIFACT10),
|
||||
ARTIFACT11(Inventory.PAPERDOLL_ARTIFACT11),
|
||||
ARTIFACT12(Inventory.PAPERDOLL_ARTIFACT12),
|
||||
ARTIFACT13(Inventory.PAPERDOLL_ARTIFACT13),
|
||||
ARTIFACT14(Inventory.PAPERDOLL_ARTIFACT14),
|
||||
ARTIFACT15(Inventory.PAPERDOLL_ARTIFACT15),
|
||||
ARTIFACT16(Inventory.PAPERDOLL_ARTIFACT16),
|
||||
ARTIFACT17(Inventory.PAPERDOLL_ARTIFACT17),
|
||||
ARTIFACT18(Inventory.PAPERDOLL_ARTIFACT18),
|
||||
ARTIFACT19(Inventory.PAPERDOLL_ARTIFACT19),
|
||||
ARTIFACT20(Inventory.PAPERDOLL_ARTIFACT20),
|
||||
ARTIFACT21(Inventory.PAPERDOLL_ARTIFACT21);
|
||||
|
||||
private final int _paperdollSlot;
|
||||
|
||||
|
@ -26,8 +26,6 @@ import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||
|
||||
public class CombatFlag
|
||||
{
|
||||
// private static final Logger LOGGER = Logger.getLogger(CombatFlag.class.getName());
|
||||
|
||||
private L2PcInstance _player = null;
|
||||
private int _playerId = 0;
|
||||
private L2ItemInstance _item = null;
|
||||
@ -104,7 +102,7 @@ public class CombatFlag
|
||||
{
|
||||
// Reset player stats
|
||||
_player.setCombatFlagEquipped(false);
|
||||
final int slot = _player.getInventory().getSlotFromItem(_item);
|
||||
final long slot = _player.getInventory().getSlotFromItem(_item);
|
||||
_player.getInventory().unEquipItemInBodySlot(slot);
|
||||
_player.destroyItem("CombatFlag", _item, null, true);
|
||||
_item = null;
|
||||
|
@ -54,6 +54,39 @@ public final class L2ArmorSet
|
||||
Inventory.PAPERDOLL_GLOVES,
|
||||
Inventory.PAPERDOLL_FEET
|
||||
};
|
||||
private static final int[] ARTIFACT_1_SLOTS = new int[]
|
||||
{
|
||||
Inventory.PAPERDOLL_ARTIFACT1,
|
||||
Inventory.PAPERDOLL_ARTIFACT2,
|
||||
Inventory.PAPERDOLL_ARTIFACT3,
|
||||
Inventory.PAPERDOLL_ARTIFACT4,
|
||||
Inventory.PAPERDOLL_ARTIFACT13,
|
||||
Inventory.PAPERDOLL_ARTIFACT16,
|
||||
Inventory.PAPERDOLL_ARTIFACT19,
|
||||
|
||||
};
|
||||
private static final int[] ARTIFACT_2_SLOTS = new int[]
|
||||
{
|
||||
Inventory.PAPERDOLL_ARTIFACT5,
|
||||
Inventory.PAPERDOLL_ARTIFACT6,
|
||||
Inventory.PAPERDOLL_ARTIFACT7,
|
||||
Inventory.PAPERDOLL_ARTIFACT8,
|
||||
Inventory.PAPERDOLL_ARTIFACT14,
|
||||
Inventory.PAPERDOLL_ARTIFACT17,
|
||||
Inventory.PAPERDOLL_ARTIFACT20,
|
||||
|
||||
};
|
||||
private static final int[] ARTIFACT_3_SLOTS = new int[]
|
||||
{
|
||||
Inventory.PAPERDOLL_ARTIFACT9,
|
||||
Inventory.PAPERDOLL_ARTIFACT10,
|
||||
Inventory.PAPERDOLL_ARTIFACT11,
|
||||
Inventory.PAPERDOLL_ARTIFACT12,
|
||||
Inventory.PAPERDOLL_ARTIFACT15,
|
||||
Inventory.PAPERDOLL_ARTIFACT18,
|
||||
Inventory.PAPERDOLL_ARTIFACT21,
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* @param id
|
||||
@ -202,6 +235,59 @@ public final class L2ArmorSet
|
||||
return enchantLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Condition for 3 Lv. Set Effect Applied Skill
|
||||
* @param player
|
||||
* @param bookSlot
|
||||
* @return total paperdoll(busy) count for 1 of 3 artifact book slots
|
||||
*/
|
||||
public int getArtifactSlotMask(L2PcInstance player, int bookSlot)
|
||||
{
|
||||
final PcInventory inv = player.getInventory();
|
||||
int slotMask = 0;
|
||||
switch (bookSlot)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
|
||||
for (int artifactSlot : ARTIFACT_1_SLOTS)
|
||||
{
|
||||
final L2ItemInstance itemPart = inv.getPaperdollItem(artifactSlot);
|
||||
if ((itemPart != null) && _requiredItems.contains(itemPart.getId()))
|
||||
{
|
||||
slotMask += artifactSlot;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
for (int artifactSlot : ARTIFACT_2_SLOTS)
|
||||
{
|
||||
final L2ItemInstance itemPart = inv.getPaperdollItem(artifactSlot);
|
||||
if ((itemPart != null) && _requiredItems.contains(itemPart.getId()))
|
||||
{
|
||||
slotMask += artifactSlot;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
{
|
||||
for (int artifactSlot : ARTIFACT_3_SLOTS)
|
||||
{
|
||||
final L2ItemInstance itemPart = inv.getPaperdollItem(artifactSlot);
|
||||
if ((itemPart != null) && _requiredItems.contains(itemPart.getId()))
|
||||
{
|
||||
slotMask += artifactSlot;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return slotMask;
|
||||
}
|
||||
|
||||
public boolean hasOptionalEquipped(L2PcInstance player, Function<L2ItemInstance, Integer> idProvider)
|
||||
{
|
||||
return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item)));
|
||||
|
@ -2168,9 +2168,9 @@ public final class L2PcInstance extends L2Playable
|
||||
}
|
||||
sendPacket(sm);
|
||||
|
||||
final int slot = _inventory.getSlotFromItem(item);
|
||||
final long slot = _inventory.getSlotFromItem(item);
|
||||
// we can't unequip talisman by body slot
|
||||
if ((slot == L2Item.SLOT_DECO) || (slot == L2Item.SLOT_BROOCH_JEWEL) || (slot == L2Item.SLOT_AGATHION))
|
||||
if ((slot == L2Item.SLOT_DECO) || (slot == L2Item.SLOT_BROOCH_JEWEL) || (slot == L2Item.SLOT_AGATHION) || (slot == L2Item.SLOT_ARTIFACT))
|
||||
{
|
||||
items = _inventory.unEquipItemInSlotAndRecord(item.getLocationSlot());
|
||||
}
|
||||
@ -4957,7 +4957,7 @@ public final class L2PcInstance extends L2Playable
|
||||
}
|
||||
else
|
||||
{
|
||||
final int slot = _inventory.getSlotFromItem(_inventory.getItemByItemId(9819));
|
||||
final long slot = _inventory.getSlotFromItem(_inventory.getItemByItemId(9819));
|
||||
_inventory.unEquipItemInBodySlot(slot);
|
||||
destroyItem("CombatFlag", _inventory.getItemByItemId(9819), null, true);
|
||||
}
|
||||
@ -10813,7 +10813,7 @@ public final class L2PcInstance extends L2Playable
|
||||
}
|
||||
else
|
||||
{
|
||||
final int slot = _inventory.getSlotFromItem(_inventory.getItemByItemId(9819));
|
||||
final long slot = _inventory.getSlotFromItem(_inventory.getItemByItemId(9819));
|
||||
_inventory.unEquipItemInBodySlot(slot);
|
||||
destroyItem("CombatFlag", _inventory.getItemByItemId(9819), null, true);
|
||||
}
|
||||
|
@ -675,6 +675,15 @@ public class PcStat extends PlayableStat
|
||||
return (int) getValue(Stats.AGATHION_SLOTS, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the maximum artifact book count.
|
||||
* @return the maximum artifact book count
|
||||
*/
|
||||
public int getArtifactSlots()
|
||||
{
|
||||
return (int) getValue(Stats.ARTIFACT_SLOTS, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRecalculateStats(boolean broadcast)
|
||||
{
|
||||
|
@ -70,7 +70,7 @@ public final class ConditionUsingItemType extends Condition
|
||||
|
||||
// So from here, chest armor matches conditions
|
||||
|
||||
final int chestBodyPart = chest.getItem().getBodyPart();
|
||||
final long chestBodyPart = chest.getItem().getBodyPart();
|
||||
// return True if chest armor is a Full Armor
|
||||
if (chestBodyPart == L2Item.SLOT_FULL_ARMOR)
|
||||
{
|
||||
|
@ -35,7 +35,7 @@ public class AppearanceHolder
|
||||
private final AppearanceHandType _handType;
|
||||
private final AppearanceMagicType _magicType;
|
||||
private final AppearanceTargetType _targetType;
|
||||
private final Integer _bodyPart;
|
||||
private final long _bodyPart;
|
||||
|
||||
public AppearanceHolder(StatsSet set)
|
||||
{
|
||||
@ -73,7 +73,7 @@ public class AppearanceHolder
|
||||
return _targetType;
|
||||
}
|
||||
|
||||
public int getBodyPart()
|
||||
public long getBodyPart()
|
||||
{
|
||||
return _bodyPart;
|
||||
}
|
||||
|
@ -29,14 +29,18 @@ public class ArmorsetSkillHolder extends SkillHolder
|
||||
{
|
||||
private final int _minimumPieces;
|
||||
private final int _minEnchant;
|
||||
private final int _artifactSlotMask;
|
||||
private final int _artifactBookSlot;
|
||||
private final boolean _isOptional;
|
||||
|
||||
public ArmorsetSkillHolder(int skillId, int skillLvl, int minimumPieces, int minEnchant, boolean isOptional)
|
||||
public ArmorsetSkillHolder(int skillId, int skillLvl, int minimumPieces, int minEnchant, boolean isOptional, int artifactSlotMask, int artifactBookSlot)
|
||||
{
|
||||
super(skillId, skillLvl);
|
||||
_minimumPieces = minimumPieces;
|
||||
_minEnchant = minEnchant;
|
||||
_isOptional = isOptional;
|
||||
_artifactSlotMask = artifactSlotMask;
|
||||
_artifactBookSlot = artifactBookSlot;
|
||||
}
|
||||
|
||||
public int getMinimumPieces()
|
||||
@ -56,6 +60,12 @@ public class ArmorsetSkillHolder extends SkillHolder
|
||||
|
||||
public boolean validateConditions(L2PcInstance player, L2ArmorSet armorSet, Function<L2ItemInstance, Integer> idProvider)
|
||||
{
|
||||
// Player's doesn't have full busy (1 of 3) artifact real slot
|
||||
if (_artifactSlotMask > armorSet.getArtifactSlotMask(player, _artifactBookSlot))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Player doesn't have enough items equipped to use this skill
|
||||
if (_minimumPieces > armorSet.getPiecesCount(player, idProvider))
|
||||
{
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -41,8 +41,8 @@ public final class L2Armor extends L2Item
|
||||
super.set(set);
|
||||
_type = set.getEnum("armor_type", ArmorType.class, ArmorType.NONE);
|
||||
|
||||
final int _bodyPart = getBodyPart();
|
||||
if ((_bodyPart == L2Item.SLOT_NECK) || ((_bodyPart & L2Item.SLOT_L_EAR) != 0) || ((_bodyPart & L2Item.SLOT_L_FINGER) != 0) || ((_bodyPart & L2Item.SLOT_R_BRACELET) != 0) || ((_bodyPart & L2Item.SLOT_L_BRACELET) != 0))
|
||||
final long _bodyPart = getBodyPart();
|
||||
if ((_bodyPart == L2Item.SLOT_NECK) || ((_bodyPart & L2Item.SLOT_L_EAR) != 0) || ((_bodyPart & L2Item.SLOT_L_FINGER) != 0) || ((_bodyPart & L2Item.SLOT_R_BRACELET) != 0) || ((_bodyPart & L2Item.SLOT_L_BRACELET) != 0) || ((_bodyPart & L2Item.SLOT_ARTIFACT_BOOK) != 0))
|
||||
{
|
||||
_type1 = L2Item.TYPE1_WEAPON_RING_EARRING_NECKLACE;
|
||||
_type2 = L2Item.TYPE2_ACCESSORY;
|
||||
|
@ -111,7 +111,9 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable
|
||||
public static final int SLOT_BELT = 0x10000000;
|
||||
public static final int SLOT_BROOCH = 0x20000000;
|
||||
public static final int SLOT_BROOCH_JEWEL = 0x40000000;
|
||||
public static final int SLOT_AGATHION = 0x80000000;
|
||||
public static final long SLOT_AGATHION = 0x3000000000L;
|
||||
public static final long SLOT_ARTIFACT_BOOK = 0x20000000000L;
|
||||
public static final long SLOT_ARTIFACT = 0x40000000000L;
|
||||
|
||||
public static final int SLOT_WOLF = -100;
|
||||
public static final int SLOT_HATCHLING = -101;
|
||||
@ -134,7 +136,7 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable
|
||||
private int _duration;
|
||||
private long _time;
|
||||
private int _autoDestroyTime;
|
||||
private int _bodyPart;
|
||||
private long _bodyPart;
|
||||
private int _referencePrice;
|
||||
private int _crystalCount;
|
||||
private boolean _sellable;
|
||||
@ -507,7 +509,7 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable
|
||||
/**
|
||||
* @return the part of the body used with the item.
|
||||
*/
|
||||
public final int getBodyPart()
|
||||
public final long getBodyPart()
|
||||
{
|
||||
return _bodyPart;
|
||||
}
|
||||
|
@ -171,7 +171,7 @@ public class L2WarehouseItem
|
||||
/**
|
||||
* @return the part of body used with this item.
|
||||
*/
|
||||
public final int getBodyPart()
|
||||
public final long getBodyPart()
|
||||
{
|
||||
return _item.getBodyPart();
|
||||
}
|
||||
|
@ -49,7 +49,7 @@ public class AppearanceStone
|
||||
private final AppearanceMagicType _magicType;
|
||||
private List<CrystalType> _crystalTypes;
|
||||
private List<AppearanceTargetType> _targetTypes;
|
||||
private List<Integer> _bodyParts;
|
||||
private List<Long> _bodyParts;
|
||||
private List<Race> _races;
|
||||
private List<Race> _racesNot;
|
||||
private List<AppearanceHolder> _allVisualIds;
|
||||
@ -103,7 +103,7 @@ public class AppearanceStone
|
||||
addCrystalType(crystalType);
|
||||
}
|
||||
|
||||
final int bodyPart = ItemTable.SLOTS.get(set.getString("bodyPart", "none"));
|
||||
final long bodyPart = ItemTable.SLOTS.get(set.getString("bodyPart", "none"));
|
||||
if (bodyPart != L2Item.SLOT_NONE)
|
||||
{
|
||||
addBodyPart(bodyPart);
|
||||
@ -195,7 +195,7 @@ public class AppearanceStone
|
||||
return _targetTypes != null ? _targetTypes : Collections.emptyList();
|
||||
}
|
||||
|
||||
public void addBodyPart(Integer part)
|
||||
public void addBodyPart(long part)
|
||||
{
|
||||
if (_bodyParts == null)
|
||||
{
|
||||
@ -218,7 +218,7 @@ public class AppearanceStone
|
||||
return _allVisualIds != null ? _allVisualIds : Collections.emptyList();
|
||||
}
|
||||
|
||||
public List<Integer> getBodyParts()
|
||||
public List<Long> getBodyParts()
|
||||
{
|
||||
return _bodyParts != null ? _bodyParts : Collections.emptyList();
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ public final class EnchantRateItem
|
||||
* Adds body slot verification.
|
||||
* @param slot
|
||||
*/
|
||||
public void addSlot(int slot)
|
||||
public void addSlot(long slot)
|
||||
{
|
||||
_slot |= slot;
|
||||
}
|
||||
|
@ -112,13 +112,13 @@ public interface IStatsFunction
|
||||
for (L2ItemInstance equippedItem : creature.getInventory().getPaperdollItems(L2ItemInstance::isEquipped, L2ItemInstance::isEnchanted))
|
||||
{
|
||||
final L2Item item = equippedItem.getItem();
|
||||
final int bodypart = item.getBodyPart();
|
||||
final long bodypart = item.getBodyPart();
|
||||
if ((bodypart == L2Item.SLOT_HAIR) || //
|
||||
(bodypart == L2Item.SLOT_HAIR2) || //
|
||||
(bodypart == L2Item.SLOT_HAIRALL))
|
||||
{
|
||||
// TODO: Item after enchant shows pDef, but scroll says mDef increase.
|
||||
if (stat != Stats.PHYSICAL_DEFENCE && stat != Stats.MAGICAL_DEFENCE)
|
||||
if ((stat != Stats.PHYSICAL_DEFENCE) && (stat != Stats.MAGICAL_DEFENCE))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
@ -249,6 +249,9 @@ public enum Stats
|
||||
// Agathions
|
||||
AGATHION_SLOTS("agathionSlots"),
|
||||
|
||||
// Artifacts
|
||||
ARTIFACT_SLOTS("artifactSlots"),
|
||||
|
||||
// Summon Points
|
||||
MAX_SUMMON_POINTS("summonPoints"),
|
||||
|
||||
|
@ -214,7 +214,7 @@ public class L2SiegeZone extends L2ZoneType
|
||||
}
|
||||
else
|
||||
{
|
||||
final int slot = activeChar.getInventory().getSlotFromItem(activeChar.getInventory().getItemByItemId(9819));
|
||||
final long slot = activeChar.getInventory().getSlotFromItem(activeChar.getInventory().getItemByItemId(9819));
|
||||
activeChar.getInventory().unEquipItemInBodySlot(slot);
|
||||
activeChar.destroyItem("CombatFlag", activeChar.getInventory().getItemByItemId(9819), null, true);
|
||||
}
|
||||
|
@ -564,7 +564,7 @@ public class EnterWorld implements IClientIncomingPacket
|
||||
}
|
||||
else
|
||||
{
|
||||
final int slot = activeChar.getInventory().getSlotFromItem(activeChar.getInventory().getItemByItemId(9819));
|
||||
final long slot = activeChar.getInventory().getSlotFromItem(activeChar.getInventory().getItemByItemId(9819));
|
||||
activeChar.getInventory().unEquipItemInBodySlot(slot);
|
||||
activeChar.destroyItem("CombatFlag", activeChar.getInventory().getItemByItemId(9819), null, true);
|
||||
}
|
||||
|
@ -192,64 +192,61 @@ public final class UseItem implements IClientIncomingPacket
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (item.getItem().getBodyPart())
|
||||
// Prevent players to equip weapon while wearing combat flag
|
||||
// Don't allow weapon/shield equipment if a cursed weapon is equipped.
|
||||
if ((item.getItem().getBodyPart() == L2Item.SLOT_LR_HAND) || (item.getItem().getBodyPart() == L2Item.SLOT_L_HAND) || (item.getItem().getBodyPart() == L2Item.SLOT_R_HAND))
|
||||
{
|
||||
case L2Item.SLOT_LR_HAND:
|
||||
case L2Item.SLOT_L_HAND:
|
||||
case L2Item.SLOT_R_HAND:
|
||||
if ((activeChar.getActiveWeaponItem() != null) && (activeChar.getActiveWeaponItem().getId() == 9819))
|
||||
{
|
||||
// Prevent players to equip weapon while wearing combat flag
|
||||
if ((activeChar.getActiveWeaponItem() != null) && (activeChar.getActiveWeaponItem().getId() == 9819))
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
|
||||
if (activeChar.isMounted() || activeChar.isDisarmed())
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't allow weapon/shield equipment if a cursed weapon is equipped.
|
||||
if (activeChar.isCursedWeaponEquipped())
|
||||
{
|
||||
return;
|
||||
}
|
||||
break;
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
case L2Item.SLOT_DECO:
|
||||
if (activeChar.isMounted() || activeChar.isDisarmed())
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getTalismanSlots() == 0))
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
case L2Item.SLOT_BROOCH_JEWEL:
|
||||
if (activeChar.isCursedWeaponEquipped())
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getBroochJewelSlots() == 0))
|
||||
{
|
||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_CANNOT_EQUIP_S1_WITHOUT_EQUIPPING_A_BROOCH);
|
||||
sm.addItemName(item);
|
||||
activeChar.sendPacket(sm);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case L2Item.SLOT_AGATHION:
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getAgathionSlots() == 0))
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (item.getItem().getBodyPart() == L2Item.SLOT_DECO)
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getTalismanSlots() == 0))
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (item.getItem().getBodyPart() == L2Item.SLOT_BROOCH_JEWEL)
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getBroochJewelSlots() == 0))
|
||||
{
|
||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_CANNOT_EQUIP_S1_WITHOUT_EQUIPPING_A_BROOCH);
|
||||
sm.addItemName(item);
|
||||
activeChar.sendPacket(sm);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (item.getItem().getBodyPart() == L2Item.SLOT_AGATHION)
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getAgathionSlots() == 0))
|
||||
{
|
||||
activeChar.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (item.getItem().getBodyPart() == L2Item.SLOT_ARTIFACT)
|
||||
{
|
||||
if (!item.isEquipped() && (activeChar.getInventory().getArtifactSlots() == 0))
|
||||
{
|
||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.EMPTY_15);
|
||||
sm.addItemName(item);
|
||||
activeChar.sendPacket(sm);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (activeChar.isCastingNow())
|
||||
{
|
||||
// Create and Bind the next action to the AI
|
||||
|
@ -88,7 +88,29 @@ public class CharSelectionInfo implements IClientOutgoingPacket
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL3,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL4,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL5,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL6
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL6,
|
||||
Inventory.PAPERDOLL_ARTIFACT_BOOK, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT1, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT2, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT3, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT4, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT5, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT6, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT7, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT8, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT9, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT10, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT11, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT12, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT13, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT14, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT15, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT16, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT17, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT18, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT19, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT20, // 152
|
||||
Inventory.PAPERDOLL_ARTIFACT21 // 152
|
||||
};
|
||||
|
||||
private static final int[] PAPERDOLL_ORDER_VISUAL_ID = new int[]
|
||||
@ -215,29 +237,6 @@ public class CharSelectionInfo implements IClientOutgoingPacket
|
||||
packet.writeD(charInfoPackage.getPaperdollItemId(slot));
|
||||
}
|
||||
|
||||
packet.writeD(0x00); // Book // 152
|
||||
packet.writeD(0x00); // Balance artifact (1) // 152
|
||||
packet.writeD(0x00); // Balance artifact (2) // 152
|
||||
packet.writeD(0x00); // Balance artifact (3) // 152
|
||||
packet.writeD(0x00); // Balance artifact (4) // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
packet.writeD(0x00); // 152
|
||||
|
||||
for (int slot : getPaperdollOrderVisualId())
|
||||
{
|
||||
packet.writeD(charInfoPackage.getPaperdollItemVisualId(slot));
|
||||
|
@ -69,7 +69,7 @@ public class ExStorageMaxCount implements IClientOutgoingPacket
|
||||
packet.writeD(_inventoryQuestItems);
|
||||
packet.writeD(40); // TODO: Find me!
|
||||
packet.writeD(40); // TODO: Find me!
|
||||
packet.writeD(0x00); // Artifact slots // 152
|
||||
packet.writeD(0x64); // Artifact slots (Fixed)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ public class ExUserInfoEquipSlot extends AbstractMaskPacket<InventorySlot>
|
||||
OutgoingPackets.EX_USER_INFO_EQUIP_SLOT.writeId(packet);
|
||||
|
||||
packet.writeD(_activeChar.getObjectId());
|
||||
packet.writeH(60); // 152
|
||||
packet.writeH(InventorySlot.values().length); // 152
|
||||
packet.writeB(_masks);
|
||||
|
||||
final PcInventory inventory = _activeChar.getInventory();
|
||||
|
@ -70,7 +70,29 @@ public interface IClientOutgoingPacket extends IOutgoingPacket
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL3,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL4,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL5,
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL6
|
||||
Inventory.PAPERDOLL_BROOCH_JEWEL6,
|
||||
Inventory.PAPERDOLL_ARTIFACT_BOOK,
|
||||
Inventory.PAPERDOLL_ARTIFACT1,
|
||||
Inventory.PAPERDOLL_ARTIFACT2,
|
||||
Inventory.PAPERDOLL_ARTIFACT3,
|
||||
Inventory.PAPERDOLL_ARTIFACT4,
|
||||
Inventory.PAPERDOLL_ARTIFACT5,
|
||||
Inventory.PAPERDOLL_ARTIFACT6,
|
||||
Inventory.PAPERDOLL_ARTIFACT7,
|
||||
Inventory.PAPERDOLL_ARTIFACT8,
|
||||
Inventory.PAPERDOLL_ARTIFACT9,
|
||||
Inventory.PAPERDOLL_ARTIFACT10,
|
||||
Inventory.PAPERDOLL_ARTIFACT11,
|
||||
Inventory.PAPERDOLL_ARTIFACT12,
|
||||
Inventory.PAPERDOLL_ARTIFACT13,
|
||||
Inventory.PAPERDOLL_ARTIFACT14,
|
||||
Inventory.PAPERDOLL_ARTIFACT15,
|
||||
Inventory.PAPERDOLL_ARTIFACT16,
|
||||
Inventory.PAPERDOLL_ARTIFACT17,
|
||||
Inventory.PAPERDOLL_ARTIFACT18,
|
||||
Inventory.PAPERDOLL_ARTIFACT19,
|
||||
Inventory.PAPERDOLL_ARTIFACT20,
|
||||
Inventory.PAPERDOLL_ARTIFACT21,
|
||||
};
|
||||
|
||||
int[] PAPERDOLL_ORDER_AUGMENT = new int[]
|
||||
|
@ -331,13 +331,13 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
|
||||
{
|
||||
packet.writeC(0x01); // Charm slots
|
||||
packet.writeC(_activeChar.getInventory().getAgathionSlots() - 1);
|
||||
packet.writeC(0x00); // Artifact set slots // 152
|
||||
packet.writeC(_activeChar.getInventory().getArtifactSlots()); // Artifact set slots // 152
|
||||
}
|
||||
else
|
||||
{
|
||||
packet.writeC(0x00); // Charm slots
|
||||
packet.writeC(0x00);
|
||||
packet.writeC(0x00); // Artifact set slots // 152
|
||||
packet.writeC(_activeChar.getInventory().getArtifactSlots()); // Artifact set slots // 152
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -69,6 +69,7 @@ Antharas: https://eu.4game.com/lineage2classic/play/antharas/
|
||||
-Parsed new items from client
|
||||
-Parsed new NPCs from L2Wiki and client
|
||||
-Clan Arena
|
||||
-New Agathion item support
|
||||
|
||||
Seven Signs: https://eu.4gameforum.com/threads/658543/
|
||||
-Parsed new system messages and npc strings from client.
|
||||
|
Loading…
Reference in New Issue
Block a user