Support for Artifact item slots.

Contributed by hlwrave.
This commit is contained in:
MobiusDev 2018-10-11 18:33:37 +00:00
parent adc5bbc219
commit 866bbde935
88 changed files with 2704 additions and 1343 deletions

View 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>

View 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>

View 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>

View 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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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();
}
}

View File

@ -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);

View 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);
}
}

View File

@ -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);

View File

@ -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)
{

View File

@ -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>

View 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>

View 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>

View 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>

View 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>

View File

@ -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.

View File

@ -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>

View File

@ -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>

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}
/**

View File

@ -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;

View File

@ -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;

View File

@ -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),

View File

@ -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;

View File

@ -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)));

View File

@ -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);
}

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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))
{

View File

@ -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;

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -251,6 +251,9 @@ public enum Stats
// Agathions
AGATHION_SLOTS("agathionSlots"),
// Artifacts
ARTIFACT_SLOTS("artifactSlots"),
// Summon Points
MAX_SUMMON_POINTS("summonPoints"),

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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

View File

@ -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));

View File

@ -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;
}
}

View File

@ -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();

View File

@ -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[]

View File

@ -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
}
}

View File

@ -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

View File

@ -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);

View 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);
}
}

View File

@ -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);

View File

@ -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)
{

View File

@ -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.

View File

@ -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>

View File

@ -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>

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}
/**

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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)));

View File

@ -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);
}

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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))
{

View File

@ -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;

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -249,6 +249,9 @@ public enum Stats
// Agathions
AGATHION_SLOTS("agathionSlots"),
// Artifacts
ARTIFACT_SLOTS("artifactSlots"),
// Summon Points
MAX_SUMMON_POINTS("summonPoints"),

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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

View File

@ -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));

View File

@ -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;
}
}

View File

@ -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();

View File

@ -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[]

View File

@ -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
}
}

View File

@ -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.