Extensive player ownership check for single or multiple items.
This commit is contained in:
@@ -207,7 +207,7 @@ public class Hardin extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
if (player.isDualClassActive()) // dual class
|
if (player.isDualClassActive()) // dual class
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CHAOS_ESSENCE_DUAL_CLASS))
|
if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE_DUAL_CLASS))
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
@@ -216,11 +216,11 @@ public class Hardin extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
return "33870-no.html";
|
return "33870-no.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, CHAOS_ESSENCE)) // main class
|
else if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE)) // main class
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
if (player.hasServitors())
|
if (player.hasSummon())
|
||||||
{
|
{
|
||||||
return "33870-no_summon.html";
|
return "33870-no_summon.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "noSubChange.html";
|
htmltext = "noSubChange.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, SUBCLASS_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, SUBCLASS_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "noCertificate.html";
|
htmltext = "noCertificate.html";
|
||||||
}
|
}
|
||||||
@@ -378,7 +378,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "reawakenNoDual.html";
|
htmltext = "reawakenNoDual.html";
|
||||||
}
|
}
|
||||||
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
@@ -587,7 +587,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
||||||
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-15.html";
|
htmltext = "33490-15.html";
|
||||||
}
|
}
|
||||||
else if (player.isSubClassActive() || !hasQuestItems(player, SUB_CERTIFICATE))
|
else if (player.isSubClassActive() || !ownsAtLeastOneItem(player, SUB_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-21.html";
|
htmltext = "33490-21.html";
|
||||||
}
|
}
|
||||||
@@ -283,7 +283,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-30.html";
|
htmltext = "33490-30.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, DUAL_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, DUAL_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-31.html";
|
htmltext = "33490-31.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class BirthOfDraco extends LongTimeEvent
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* case "giveAgathion": { if (hasQuestItems(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
* case "giveAgathion": { if (hasQuestItemss(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
return htmltext;
|
return htmltext;
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ public class CharacterBirthday extends AbstractNpcAI
|
|||||||
else if (event.equalsIgnoreCase("change"))
|
else if (event.equalsIgnoreCase("change"))
|
||||||
{
|
{
|
||||||
// Change Hat
|
// Change Hat
|
||||||
if (hasQuestItems(player, 10250))
|
if (ownsAtLeastOneItem(player, 10250))
|
||||||
{
|
{
|
||||||
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
||||||
giveItems(player, 21594, 1); // Birthday Hat
|
giveItems(player, 21594, 1); // Birthday Hat
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class LoversJubilee extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "50020_1":
|
case "50020_1":
|
||||||
{
|
{
|
||||||
htmtext = hasQuestItems(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
htmtext = ownsAtLeastOneItem(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "50020_2":
|
case "50020_2":
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class MasterOfEnchanting extends LongTimeEvent
|
|||||||
String htmltext = event;
|
String htmltext = event;
|
||||||
if (event.equalsIgnoreCase("buy_staff"))
|
if (event.equalsIgnoreCase("buy_staff"))
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
if (!ownsAtLeastOneItem(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
||||||
{
|
{
|
||||||
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
||||||
giveItems(player, MASTER_YOGI_STAFF, 1);
|
giveItems(player, MASTER_YOGI_STAFF, 1);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class RudolphsBlessing extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "rudolph":
|
case "rudolph":
|
||||||
{
|
{
|
||||||
if (hasQuestItems(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
if (ownsAtLeastOneItem(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
||||||
{
|
{
|
||||||
htmltext = "13285-05.htm";
|
htmltext = "13285-05.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ct":
|
case "ct":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CT, 1);
|
giveItems(player, CT, 1);
|
||||||
giveItems(player, CT_TRANSORM, 1);
|
giveItems(player, CT_TRANSORM, 1);
|
||||||
@@ -87,7 +87,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ch":
|
case "ch":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CH, 1);
|
giveItems(player, CH, 1);
|
||||||
giveItems(player, CH_TRANSORM, 1);
|
giveItems(player, CH_TRANSORM, 1);
|
||||||
@@ -102,7 +102,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "cc":
|
case "cc":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CC, 1);
|
giveItems(player, CC, 1);
|
||||||
giveItems(player, CC_TRANSORM, 1);
|
giveItems(player, CC_TRANSORM, 1);
|
||||||
|
|||||||
@@ -445,6 +445,16 @@ public class CommissionManager
|
|||||||
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param player the player
|
||||||
|
* @param itemId the item id
|
||||||
|
* @return {@code true} if the player has commissioned a specific item id, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean hasCommissionedItemId(PlayerInstance player, int itemId)
|
||||||
|
{
|
||||||
|
return !_commissionItems.values().stream().filter(c -> (c.getItemInstance().getOwnerId() == player.getObjectId()) && (c.getItemInstance().getItem().getId() == itemId)).collect(Collectors.toList()).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the player is allowed to interact with commission manager.
|
* Checks if the player is allowed to interact with commission manager.
|
||||||
* @param player the player
|
* @param player the player
|
||||||
|
|||||||
@@ -402,6 +402,7 @@ public class Message
|
|||||||
_attachments = new Mail(_senderId, _messageId);
|
_attachments = new Mail(_senderId, _messageId);
|
||||||
_attachments.restore();
|
_attachments.restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _attachments;
|
return _attachments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,8 +44,10 @@ import org.l2jmobius.gameserver.enums.AttributeType;
|
|||||||
import org.l2jmobius.gameserver.enums.Movie;
|
import org.l2jmobius.gameserver.enums.Movie;
|
||||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||||
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.CommissionManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.MailManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
@@ -56,6 +58,7 @@ import org.l2jmobius.gameserver.model.actor.Attackable;
|
|||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Summon;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||||
@@ -63,6 +66,7 @@ import org.l2jmobius.gameserver.model.actor.instance.TrapInstance;
|
|||||||
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
||||||
import org.l2jmobius.gameserver.model.entity.Castle;
|
import org.l2jmobius.gameserver.model.entity.Castle;
|
||||||
import org.l2jmobius.gameserver.model.entity.Fort;
|
import org.l2jmobius.gameserver.model.entity.Fort;
|
||||||
|
import org.l2jmobius.gameserver.model.entity.Message;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
||||||
@@ -132,7 +136,10 @@ import org.l2jmobius.gameserver.model.instancezone.Instance;
|
|||||||
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
||||||
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.Mail;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PetInventory;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerWarehouse;
|
||||||
import org.l2jmobius.gameserver.model.items.EtcItem;
|
import org.l2jmobius.gameserver.model.items.EtcItem;
|
||||||
import org.l2jmobius.gameserver.model.items.Item;
|
import org.l2jmobius.gameserver.model.items.Item;
|
||||||
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
||||||
@@ -2427,6 +2434,105 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extensive player ownership check for single or multiple items.<br>
|
||||||
|
* Checks inventory, warehouse, pet, summons, mail attachments and item auctions.
|
||||||
|
* @param player the player to check for quest items
|
||||||
|
* @param itemIds a list of item IDs to check for
|
||||||
|
* @return {@code true} if player owns at least one items, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean ownsAtLeastOneItem(PlayerInstance player, int... itemIds)
|
||||||
|
{
|
||||||
|
// Inventory.
|
||||||
|
final PlayerInventory inventory = player.getInventory();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (inventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Warehouse.
|
||||||
|
final PlayerWarehouse warehouse = player.getWarehouse();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (warehouse.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Pet.
|
||||||
|
if (player.hasPet())
|
||||||
|
{
|
||||||
|
final PetInventory petInventory = player.getPet().getInventory();
|
||||||
|
if (petInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (petInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Summons.
|
||||||
|
if (player.hasServitors())
|
||||||
|
{
|
||||||
|
for (Summon summon : player.getServitors().values())
|
||||||
|
{
|
||||||
|
final PetInventory summonInventory = summon.getInventory();
|
||||||
|
if (summonInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (summonInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Mail attachments.
|
||||||
|
if (Config.ALLOW_MAIL)
|
||||||
|
{
|
||||||
|
final List<Message> inbox = MailManager.getInstance().getInbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : inbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final List<Message> outbox = MailManager.getInstance().getOutbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : outbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Item auctions.
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (CommissionManager.getInstance().hasCommissionedItemId(player, itemId))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the enchantment level of an item in player's inventory.
|
* Get the enchantment level of an item in player's inventory.
|
||||||
* @param player the player whose item to check
|
* @param player the player whose item to check
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ public class Hardin extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
if (player.isDualClassActive()) // dual class
|
if (player.isDualClassActive()) // dual class
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CHAOS_ESSENCE_DUAL_CLASS))
|
if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE_DUAL_CLASS))
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
@@ -216,11 +216,11 @@ public class Hardin extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
return "33870-no.html";
|
return "33870-no.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, CHAOS_ESSENCE)) // main class
|
else if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE)) // main class
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
if (player.hasServitors())
|
if (player.hasSummon())
|
||||||
{
|
{
|
||||||
return "33870-no_summon.html";
|
return "33870-no_summon.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "noSubChange.html";
|
htmltext = "noSubChange.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, SUBCLASS_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, SUBCLASS_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "noCertificate.html";
|
htmltext = "noCertificate.html";
|
||||||
}
|
}
|
||||||
@@ -378,7 +378,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "reawakenNoDual.html";
|
htmltext = "reawakenNoDual.html";
|
||||||
}
|
}
|
||||||
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
@@ -587,7 +587,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
||||||
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-15.html";
|
htmltext = "33490-15.html";
|
||||||
}
|
}
|
||||||
else if (player.isSubClassActive() || !hasQuestItems(player, SUB_CERTIFICATE))
|
else if (player.isSubClassActive() || !ownsAtLeastOneItem(player, SUB_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-21.html";
|
htmltext = "33490-21.html";
|
||||||
}
|
}
|
||||||
@@ -283,7 +283,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-30.html";
|
htmltext = "33490-30.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, DUAL_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, DUAL_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-31.html";
|
htmltext = "33490-31.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class BirthOfDraco extends LongTimeEvent
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* case "giveAgathion": { if (hasQuestItems(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
* case "giveAgathion": { if (hasQuestItemss(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
return htmltext;
|
return htmltext;
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ public class CharacterBirthday extends AbstractNpcAI
|
|||||||
else if (event.equalsIgnoreCase("change"))
|
else if (event.equalsIgnoreCase("change"))
|
||||||
{
|
{
|
||||||
// Change Hat
|
// Change Hat
|
||||||
if (hasQuestItems(player, 10250))
|
if (ownsAtLeastOneItem(player, 10250))
|
||||||
{
|
{
|
||||||
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
||||||
giveItems(player, 21594, 1); // Birthday Hat
|
giveItems(player, 21594, 1); // Birthday Hat
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class LoversJubilee extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "50020_1":
|
case "50020_1":
|
||||||
{
|
{
|
||||||
htmtext = hasQuestItems(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
htmtext = ownsAtLeastOneItem(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "50020_2":
|
case "50020_2":
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class MasterOfEnchanting extends LongTimeEvent
|
|||||||
String htmltext = event;
|
String htmltext = event;
|
||||||
if (event.equalsIgnoreCase("buy_staff"))
|
if (event.equalsIgnoreCase("buy_staff"))
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
if (!ownsAtLeastOneItem(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
||||||
{
|
{
|
||||||
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
||||||
giveItems(player, MASTER_YOGI_STAFF, 1);
|
giveItems(player, MASTER_YOGI_STAFF, 1);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class RudolphsBlessing extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "rudolph":
|
case "rudolph":
|
||||||
{
|
{
|
||||||
if (hasQuestItems(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
if (ownsAtLeastOneItem(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
||||||
{
|
{
|
||||||
htmltext = "13285-05.htm";
|
htmltext = "13285-05.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ct":
|
case "ct":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CT, 1);
|
giveItems(player, CT, 1);
|
||||||
giveItems(player, CT_TRANSORM, 1);
|
giveItems(player, CT_TRANSORM, 1);
|
||||||
@@ -87,7 +87,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ch":
|
case "ch":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CH, 1);
|
giveItems(player, CH, 1);
|
||||||
giveItems(player, CH_TRANSORM, 1);
|
giveItems(player, CH_TRANSORM, 1);
|
||||||
@@ -102,7 +102,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "cc":
|
case "cc":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CC, 1);
|
giveItems(player, CC, 1);
|
||||||
giveItems(player, CC_TRANSORM, 1);
|
giveItems(player, CC_TRANSORM, 1);
|
||||||
|
|||||||
@@ -445,6 +445,16 @@ public class CommissionManager
|
|||||||
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param player the player
|
||||||
|
* @param itemId the item id
|
||||||
|
* @return {@code true} if the player has commissioned a specific item id, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean hasCommissionedItemId(PlayerInstance player, int itemId)
|
||||||
|
{
|
||||||
|
return !_commissionItems.values().stream().filter(c -> (c.getItemInstance().getOwnerId() == player.getObjectId()) && (c.getItemInstance().getItem().getId() == itemId)).collect(Collectors.toList()).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the player is allowed to interact with commission manager.
|
* Checks if the player is allowed to interact with commission manager.
|
||||||
* @param player the player
|
* @param player the player
|
||||||
|
|||||||
@@ -402,6 +402,7 @@ public class Message
|
|||||||
_attachments = new Mail(_senderId, _messageId);
|
_attachments = new Mail(_senderId, _messageId);
|
||||||
_attachments.restore();
|
_attachments.restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _attachments;
|
return _attachments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,8 +44,10 @@ import org.l2jmobius.gameserver.enums.AttributeType;
|
|||||||
import org.l2jmobius.gameserver.enums.Movie;
|
import org.l2jmobius.gameserver.enums.Movie;
|
||||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||||
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.CommissionManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.MailManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
@@ -56,6 +58,7 @@ import org.l2jmobius.gameserver.model.actor.Attackable;
|
|||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Summon;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||||
@@ -63,6 +66,7 @@ import org.l2jmobius.gameserver.model.actor.instance.TrapInstance;
|
|||||||
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
||||||
import org.l2jmobius.gameserver.model.entity.Castle;
|
import org.l2jmobius.gameserver.model.entity.Castle;
|
||||||
import org.l2jmobius.gameserver.model.entity.Fort;
|
import org.l2jmobius.gameserver.model.entity.Fort;
|
||||||
|
import org.l2jmobius.gameserver.model.entity.Message;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
||||||
@@ -132,7 +136,10 @@ import org.l2jmobius.gameserver.model.instancezone.Instance;
|
|||||||
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
||||||
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.Mail;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PetInventory;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerWarehouse;
|
||||||
import org.l2jmobius.gameserver.model.items.EtcItem;
|
import org.l2jmobius.gameserver.model.items.EtcItem;
|
||||||
import org.l2jmobius.gameserver.model.items.Item;
|
import org.l2jmobius.gameserver.model.items.Item;
|
||||||
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
||||||
@@ -2427,6 +2434,105 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extensive player ownership check for single or multiple items.<br>
|
||||||
|
* Checks inventory, warehouse, pet, summons, mail attachments and item auctions.
|
||||||
|
* @param player the player to check for quest items
|
||||||
|
* @param itemIds a list of item IDs to check for
|
||||||
|
* @return {@code true} if player owns at least one items, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean ownsAtLeastOneItem(PlayerInstance player, int... itemIds)
|
||||||
|
{
|
||||||
|
// Inventory.
|
||||||
|
final PlayerInventory inventory = player.getInventory();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (inventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Warehouse.
|
||||||
|
final PlayerWarehouse warehouse = player.getWarehouse();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (warehouse.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Pet.
|
||||||
|
if (player.hasPet())
|
||||||
|
{
|
||||||
|
final PetInventory petInventory = player.getPet().getInventory();
|
||||||
|
if (petInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (petInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Summons.
|
||||||
|
if (player.hasServitors())
|
||||||
|
{
|
||||||
|
for (Summon summon : player.getServitors().values())
|
||||||
|
{
|
||||||
|
final PetInventory summonInventory = summon.getInventory();
|
||||||
|
if (summonInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (summonInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Mail attachments.
|
||||||
|
if (Config.ALLOW_MAIL)
|
||||||
|
{
|
||||||
|
final List<Message> inbox = MailManager.getInstance().getInbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : inbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final List<Message> outbox = MailManager.getInstance().getOutbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : outbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Item auctions.
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (CommissionManager.getInstance().hasCommissionedItemId(player, itemId))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the enchantment level of an item in player's inventory.
|
* Get the enchantment level of an item in player's inventory.
|
||||||
* @param player the player whose item to check
|
* @param player the player whose item to check
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ public class Hardin extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
if (player.isDualClassActive()) // dual class
|
if (player.isDualClassActive()) // dual class
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CHAOS_ESSENCE_DUAL_CLASS))
|
if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE_DUAL_CLASS))
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
@@ -216,11 +216,11 @@ public class Hardin extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
return "33870-no.html";
|
return "33870-no.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, CHAOS_ESSENCE)) // main class
|
else if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE)) // main class
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
if (player.hasServitors())
|
if (player.hasSummon())
|
||||||
{
|
{
|
||||||
return "33870-no_summon.html";
|
return "33870-no_summon.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "noSubChange.html";
|
htmltext = "noSubChange.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, SUBCLASS_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, SUBCLASS_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "noCertificate.html";
|
htmltext = "noCertificate.html";
|
||||||
}
|
}
|
||||||
@@ -378,7 +378,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "reawakenNoDual.html";
|
htmltext = "reawakenNoDual.html";
|
||||||
}
|
}
|
||||||
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
@@ -587,7 +587,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
||||||
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-15.html";
|
htmltext = "33490-15.html";
|
||||||
}
|
}
|
||||||
else if (player.isSubClassActive() || !hasQuestItems(player, SUB_CERTIFICATE))
|
else if (player.isSubClassActive() || !ownsAtLeastOneItem(player, SUB_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-21.html";
|
htmltext = "33490-21.html";
|
||||||
}
|
}
|
||||||
@@ -283,7 +283,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-30.html";
|
htmltext = "33490-30.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, DUAL_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, DUAL_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-31.html";
|
htmltext = "33490-31.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class BirthOfDraco extends LongTimeEvent
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* case "giveAgathion": { if (hasQuestItems(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
* case "giveAgathion": { if (hasQuestItemss(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
return htmltext;
|
return htmltext;
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ public class CharacterBirthday extends AbstractNpcAI
|
|||||||
else if (event.equalsIgnoreCase("change"))
|
else if (event.equalsIgnoreCase("change"))
|
||||||
{
|
{
|
||||||
// Change Hat
|
// Change Hat
|
||||||
if (hasQuestItems(player, 10250))
|
if (ownsAtLeastOneItem(player, 10250))
|
||||||
{
|
{
|
||||||
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
||||||
giveItems(player, 21594, 1); // Birthday Hat
|
giveItems(player, 21594, 1); // Birthday Hat
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class LoversJubilee extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "50020_1":
|
case "50020_1":
|
||||||
{
|
{
|
||||||
htmtext = hasQuestItems(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
htmtext = ownsAtLeastOneItem(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "50020_2":
|
case "50020_2":
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class MasterOfEnchanting extends LongTimeEvent
|
|||||||
String htmltext = event;
|
String htmltext = event;
|
||||||
if (event.equalsIgnoreCase("buy_staff"))
|
if (event.equalsIgnoreCase("buy_staff"))
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
if (!ownsAtLeastOneItem(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
||||||
{
|
{
|
||||||
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
||||||
giveItems(player, MASTER_YOGI_STAFF, 1);
|
giveItems(player, MASTER_YOGI_STAFF, 1);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class RudolphsBlessing extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "rudolph":
|
case "rudolph":
|
||||||
{
|
{
|
||||||
if (hasQuestItems(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
if (ownsAtLeastOneItem(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
||||||
{
|
{
|
||||||
htmltext = "13285-05.htm";
|
htmltext = "13285-05.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ct":
|
case "ct":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CT, 1);
|
giveItems(player, CT, 1);
|
||||||
giveItems(player, CT_TRANSORM, 1);
|
giveItems(player, CT_TRANSORM, 1);
|
||||||
@@ -87,7 +87,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ch":
|
case "ch":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CH, 1);
|
giveItems(player, CH, 1);
|
||||||
giveItems(player, CH_TRANSORM, 1);
|
giveItems(player, CH_TRANSORM, 1);
|
||||||
@@ -102,7 +102,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "cc":
|
case "cc":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CC, 1);
|
giveItems(player, CC, 1);
|
||||||
giveItems(player, CC_TRANSORM, 1);
|
giveItems(player, CC_TRANSORM, 1);
|
||||||
|
|||||||
@@ -445,6 +445,16 @@ public class CommissionManager
|
|||||||
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param player the player
|
||||||
|
* @param itemId the item id
|
||||||
|
* @return {@code true} if the player has commissioned a specific item id, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean hasCommissionedItemId(PlayerInstance player, int itemId)
|
||||||
|
{
|
||||||
|
return !_commissionItems.values().stream().filter(c -> (c.getItemInstance().getOwnerId() == player.getObjectId()) && (c.getItemInstance().getItem().getId() == itemId)).collect(Collectors.toList()).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the player is allowed to interact with commission manager.
|
* Checks if the player is allowed to interact with commission manager.
|
||||||
* @param player the player
|
* @param player the player
|
||||||
|
|||||||
@@ -402,6 +402,7 @@ public class Message
|
|||||||
_attachments = new Mail(_senderId, _messageId);
|
_attachments = new Mail(_senderId, _messageId);
|
||||||
_attachments.restore();
|
_attachments.restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _attachments;
|
return _attachments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,10 @@ import org.l2jmobius.gameserver.enums.Faction;
|
|||||||
import org.l2jmobius.gameserver.enums.Movie;
|
import org.l2jmobius.gameserver.enums.Movie;
|
||||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||||
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.CommissionManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.MailManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
@@ -57,6 +59,7 @@ import org.l2jmobius.gameserver.model.actor.Attackable;
|
|||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Summon;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||||
@@ -64,6 +67,7 @@ import org.l2jmobius.gameserver.model.actor.instance.TrapInstance;
|
|||||||
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
||||||
import org.l2jmobius.gameserver.model.entity.Castle;
|
import org.l2jmobius.gameserver.model.entity.Castle;
|
||||||
import org.l2jmobius.gameserver.model.entity.Fort;
|
import org.l2jmobius.gameserver.model.entity.Fort;
|
||||||
|
import org.l2jmobius.gameserver.model.entity.Message;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
||||||
@@ -133,7 +137,10 @@ import org.l2jmobius.gameserver.model.instancezone.Instance;
|
|||||||
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
||||||
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.Mail;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PetInventory;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerWarehouse;
|
||||||
import org.l2jmobius.gameserver.model.items.EtcItem;
|
import org.l2jmobius.gameserver.model.items.EtcItem;
|
||||||
import org.l2jmobius.gameserver.model.items.Item;
|
import org.l2jmobius.gameserver.model.items.Item;
|
||||||
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
||||||
@@ -2428,6 +2435,105 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extensive player ownership check for single or multiple items.<br>
|
||||||
|
* Checks inventory, warehouse, pet, summons, mail attachments and item auctions.
|
||||||
|
* @param player the player to check for quest items
|
||||||
|
* @param itemIds a list of item IDs to check for
|
||||||
|
* @return {@code true} if player owns at least one items, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean ownsAtLeastOneItem(PlayerInstance player, int... itemIds)
|
||||||
|
{
|
||||||
|
// Inventory.
|
||||||
|
final PlayerInventory inventory = player.getInventory();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (inventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Warehouse.
|
||||||
|
final PlayerWarehouse warehouse = player.getWarehouse();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (warehouse.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Pet.
|
||||||
|
if (player.hasPet())
|
||||||
|
{
|
||||||
|
final PetInventory petInventory = player.getPet().getInventory();
|
||||||
|
if (petInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (petInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Summons.
|
||||||
|
if (player.hasServitors())
|
||||||
|
{
|
||||||
|
for (Summon summon : player.getServitors().values())
|
||||||
|
{
|
||||||
|
final PetInventory summonInventory = summon.getInventory();
|
||||||
|
if (summonInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (summonInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Mail attachments.
|
||||||
|
if (Config.ALLOW_MAIL)
|
||||||
|
{
|
||||||
|
final List<Message> inbox = MailManager.getInstance().getInbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : inbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final List<Message> outbox = MailManager.getInstance().getOutbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : outbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Item auctions.
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (CommissionManager.getInstance().hasCommissionedItemId(player, itemId))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the enchantment level of an item in player's inventory.
|
* Get the enchantment level of an item in player's inventory.
|
||||||
* @param player the player whose item to check
|
* @param player the player whose item to check
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ public class Hardin extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
if (player.isDualClassActive()) // dual class
|
if (player.isDualClassActive()) // dual class
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CHAOS_ESSENCE_DUAL_CLASS))
|
if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE_DUAL_CLASS))
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
@@ -216,11 +216,11 @@ public class Hardin extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
return "33870-no.html";
|
return "33870-no.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, CHAOS_ESSENCE)) // main class
|
else if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE)) // main class
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
if (player.hasServitors())
|
if (player.hasSummon())
|
||||||
{
|
{
|
||||||
return "33870-no_summon.html";
|
return "33870-no_summon.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "noSubChange.html";
|
htmltext = "noSubChange.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, SUBCLASS_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, SUBCLASS_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "noCertificate.html";
|
htmltext = "noCertificate.html";
|
||||||
}
|
}
|
||||||
@@ -378,7 +378,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "reawakenNoDual.html";
|
htmltext = "reawakenNoDual.html";
|
||||||
}
|
}
|
||||||
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
@@ -587,7 +587,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
||||||
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-15.html";
|
htmltext = "33490-15.html";
|
||||||
}
|
}
|
||||||
else if (player.isSubClassActive() || !hasQuestItems(player, SUB_CERTIFICATE))
|
else if (player.isSubClassActive() || !ownsAtLeastOneItem(player, SUB_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-21.html";
|
htmltext = "33490-21.html";
|
||||||
}
|
}
|
||||||
@@ -283,7 +283,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-30.html";
|
htmltext = "33490-30.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, DUAL_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, DUAL_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-31.html";
|
htmltext = "33490-31.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class BirthOfDraco extends LongTimeEvent
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* case "giveAgathion": { if (hasQuestItems(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
* case "giveAgathion": { if (hasQuestItemss(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
return htmltext;
|
return htmltext;
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ public class CharacterBirthday extends AbstractNpcAI
|
|||||||
else if (event.equalsIgnoreCase("change"))
|
else if (event.equalsIgnoreCase("change"))
|
||||||
{
|
{
|
||||||
// Change Hat
|
// Change Hat
|
||||||
if (hasQuestItems(player, 10250))
|
if (ownsAtLeastOneItem(player, 10250))
|
||||||
{
|
{
|
||||||
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
||||||
giveItems(player, 21594, 1); // Birthday Hat
|
giveItems(player, 21594, 1); // Birthday Hat
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class HappyHours extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
return "34262-2.htm";
|
return "34262-2.htm";
|
||||||
}
|
}
|
||||||
if (hasQuestItems(player, SUPPLY_BOX))
|
if (ownsAtLeastOneItem(player, SUPPLY_BOX))
|
||||||
{
|
{
|
||||||
return "34262-3.htm";
|
return "34262-3.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class LoversJubilee extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "50020_1":
|
case "50020_1":
|
||||||
{
|
{
|
||||||
htmtext = hasQuestItems(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
htmtext = ownsAtLeastOneItem(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "50020_2":
|
case "50020_2":
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class MasterOfEnchanting extends LongTimeEvent
|
|||||||
String htmltext = event;
|
String htmltext = event;
|
||||||
if (event.equalsIgnoreCase("buy_staff"))
|
if (event.equalsIgnoreCase("buy_staff"))
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
if (!ownsAtLeastOneItem(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
||||||
{
|
{
|
||||||
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
||||||
giveItems(player, MASTER_YOGI_STAFF, 1);
|
giveItems(player, MASTER_YOGI_STAFF, 1);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class RudolphsBlessing extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "rudolph":
|
case "rudolph":
|
||||||
{
|
{
|
||||||
if (hasQuestItems(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
if (ownsAtLeastOneItem(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
||||||
{
|
{
|
||||||
htmltext = "13285-05.htm";
|
htmltext = "13285-05.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ct":
|
case "ct":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CT, 1);
|
giveItems(player, CT, 1);
|
||||||
giveItems(player, CT_TRANSORM, 1);
|
giveItems(player, CT_TRANSORM, 1);
|
||||||
@@ -87,7 +87,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ch":
|
case "ch":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CH, 1);
|
giveItems(player, CH, 1);
|
||||||
giveItems(player, CH_TRANSORM, 1);
|
giveItems(player, CH_TRANSORM, 1);
|
||||||
@@ -102,7 +102,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "cc":
|
case "cc":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CC, 1);
|
giveItems(player, CC, 1);
|
||||||
giveItems(player, CC_TRANSORM, 1);
|
giveItems(player, CC_TRANSORM, 1);
|
||||||
|
|||||||
@@ -445,6 +445,16 @@ public class CommissionManager
|
|||||||
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param player the player
|
||||||
|
* @param itemId the item id
|
||||||
|
* @return {@code true} if the player has commissioned a specific item id, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean hasCommissionedItemId(PlayerInstance player, int itemId)
|
||||||
|
{
|
||||||
|
return !_commissionItems.values().stream().filter(c -> (c.getItemInstance().getOwnerId() == player.getObjectId()) && (c.getItemInstance().getItem().getId() == itemId)).collect(Collectors.toList()).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the player is allowed to interact with commission manager.
|
* Checks if the player is allowed to interact with commission manager.
|
||||||
* @param player the player
|
* @param player the player
|
||||||
|
|||||||
@@ -402,6 +402,7 @@ public class Message
|
|||||||
_attachments = new Mail(_senderId, _messageId);
|
_attachments = new Mail(_senderId, _messageId);
|
||||||
_attachments.restore();
|
_attachments.restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _attachments;
|
return _attachments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,10 @@ import org.l2jmobius.gameserver.enums.Faction;
|
|||||||
import org.l2jmobius.gameserver.enums.Movie;
|
import org.l2jmobius.gameserver.enums.Movie;
|
||||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||||
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.CommissionManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.MailManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
@@ -57,6 +59,7 @@ import org.l2jmobius.gameserver.model.actor.Attackable;
|
|||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Summon;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||||
@@ -64,6 +67,7 @@ import org.l2jmobius.gameserver.model.actor.instance.TrapInstance;
|
|||||||
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
||||||
import org.l2jmobius.gameserver.model.entity.Castle;
|
import org.l2jmobius.gameserver.model.entity.Castle;
|
||||||
import org.l2jmobius.gameserver.model.entity.Fort;
|
import org.l2jmobius.gameserver.model.entity.Fort;
|
||||||
|
import org.l2jmobius.gameserver.model.entity.Message;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
||||||
@@ -133,7 +137,10 @@ import org.l2jmobius.gameserver.model.instancezone.Instance;
|
|||||||
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
||||||
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.Mail;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PetInventory;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerWarehouse;
|
||||||
import org.l2jmobius.gameserver.model.items.EtcItem;
|
import org.l2jmobius.gameserver.model.items.EtcItem;
|
||||||
import org.l2jmobius.gameserver.model.items.Item;
|
import org.l2jmobius.gameserver.model.items.Item;
|
||||||
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
||||||
@@ -2428,6 +2435,105 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extensive player ownership check for single or multiple items.<br>
|
||||||
|
* Checks inventory, warehouse, pet, summons, mail attachments and item auctions.
|
||||||
|
* @param player the player to check for quest items
|
||||||
|
* @param itemIds a list of item IDs to check for
|
||||||
|
* @return {@code true} if player owns at least one items, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean ownsAtLeastOneItem(PlayerInstance player, int... itemIds)
|
||||||
|
{
|
||||||
|
// Inventory.
|
||||||
|
final PlayerInventory inventory = player.getInventory();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (inventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Warehouse.
|
||||||
|
final PlayerWarehouse warehouse = player.getWarehouse();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (warehouse.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Pet.
|
||||||
|
if (player.hasPet())
|
||||||
|
{
|
||||||
|
final PetInventory petInventory = player.getPet().getInventory();
|
||||||
|
if (petInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (petInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Summons.
|
||||||
|
if (player.hasServitors())
|
||||||
|
{
|
||||||
|
for (Summon summon : player.getServitors().values())
|
||||||
|
{
|
||||||
|
final PetInventory summonInventory = summon.getInventory();
|
||||||
|
if (summonInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (summonInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Mail attachments.
|
||||||
|
if (Config.ALLOW_MAIL)
|
||||||
|
{
|
||||||
|
final List<Message> inbox = MailManager.getInstance().getInbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : inbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final List<Message> outbox = MailManager.getInstance().getOutbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : outbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Item auctions.
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (CommissionManager.getInstance().hasCommissionedItemId(player, itemId))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the enchantment level of an item in player's inventory.
|
* Get the enchantment level of an item in player's inventory.
|
||||||
* @param player the player whose item to check
|
* @param player the player whose item to check
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ public class Hardin extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
if (player.isDualClassActive()) // dual class
|
if (player.isDualClassActive()) // dual class
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CHAOS_ESSENCE_DUAL_CLASS))
|
if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE_DUAL_CLASS))
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
@@ -216,11 +216,11 @@ public class Hardin extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
return "33870-no.html";
|
return "33870-no.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, CHAOS_ESSENCE)) // main class
|
else if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE)) // main class
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
if (player.hasServitors())
|
if (player.hasSummon())
|
||||||
{
|
{
|
||||||
return "33870-no_summon.html";
|
return "33870-no_summon.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "noSubChange.html";
|
htmltext = "noSubChange.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, SUBCLASS_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, SUBCLASS_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "noCertificate.html";
|
htmltext = "noCertificate.html";
|
||||||
}
|
}
|
||||||
@@ -378,7 +378,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "reawakenNoDual.html";
|
htmltext = "reawakenNoDual.html";
|
||||||
}
|
}
|
||||||
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
@@ -587,7 +587,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
||||||
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-15.html";
|
htmltext = "33490-15.html";
|
||||||
}
|
}
|
||||||
else if (player.isSubClassActive() || !hasQuestItems(player, SUB_CERTIFICATE))
|
else if (player.isSubClassActive() || !ownsAtLeastOneItem(player, SUB_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-21.html";
|
htmltext = "33490-21.html";
|
||||||
}
|
}
|
||||||
@@ -283,7 +283,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-30.html";
|
htmltext = "33490-30.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, DUAL_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, DUAL_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-31.html";
|
htmltext = "33490-31.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class BirthOfDraco extends LongTimeEvent
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* case "giveAgathion": { if (hasQuestItems(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
* case "giveAgathion": { if (hasQuestItemss(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
return htmltext;
|
return htmltext;
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ public class CharacterBirthday extends AbstractNpcAI
|
|||||||
else if (event.equalsIgnoreCase("change"))
|
else if (event.equalsIgnoreCase("change"))
|
||||||
{
|
{
|
||||||
// Change Hat
|
// Change Hat
|
||||||
if (hasQuestItems(player, 10250))
|
if (ownsAtLeastOneItem(player, 10250))
|
||||||
{
|
{
|
||||||
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
||||||
giveItems(player, 21594, 1); // Birthday Hat
|
giveItems(player, 21594, 1); // Birthday Hat
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class HappyHours extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
return "34262-2.htm";
|
return "34262-2.htm";
|
||||||
}
|
}
|
||||||
if (hasQuestItems(player, SUPPLY_BOX))
|
if (ownsAtLeastOneItem(player, SUPPLY_BOX))
|
||||||
{
|
{
|
||||||
return "34262-3.htm";
|
return "34262-3.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class LoversJubilee extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "50020_1":
|
case "50020_1":
|
||||||
{
|
{
|
||||||
htmtext = hasQuestItems(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
htmtext = ownsAtLeastOneItem(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "50020_2":
|
case "50020_2":
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class MasterOfEnchanting extends LongTimeEvent
|
|||||||
String htmltext = event;
|
String htmltext = event;
|
||||||
if (event.equalsIgnoreCase("buy_staff"))
|
if (event.equalsIgnoreCase("buy_staff"))
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
if (!ownsAtLeastOneItem(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
||||||
{
|
{
|
||||||
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
||||||
giveItems(player, MASTER_YOGI_STAFF, 1);
|
giveItems(player, MASTER_YOGI_STAFF, 1);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class RudolphsBlessing extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "rudolph":
|
case "rudolph":
|
||||||
{
|
{
|
||||||
if (hasQuestItems(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
if (ownsAtLeastOneItem(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
||||||
{
|
{
|
||||||
htmltext = "13285-05.htm";
|
htmltext = "13285-05.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ct":
|
case "ct":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CT, 1);
|
giveItems(player, CT, 1);
|
||||||
giveItems(player, CT_TRANSORM, 1);
|
giveItems(player, CT_TRANSORM, 1);
|
||||||
@@ -87,7 +87,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ch":
|
case "ch":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CH, 1);
|
giveItems(player, CH, 1);
|
||||||
giveItems(player, CH_TRANSORM, 1);
|
giveItems(player, CH_TRANSORM, 1);
|
||||||
@@ -102,7 +102,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "cc":
|
case "cc":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CC, 1);
|
giveItems(player, CC, 1);
|
||||||
giveItems(player, CC_TRANSORM, 1);
|
giveItems(player, CC_TRANSORM, 1);
|
||||||
|
|||||||
@@ -445,6 +445,16 @@ public class CommissionManager
|
|||||||
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param player the player
|
||||||
|
* @param itemId the item id
|
||||||
|
* @return {@code true} if the player has commissioned a specific item id, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean hasCommissionedItemId(PlayerInstance player, int itemId)
|
||||||
|
{
|
||||||
|
return !_commissionItems.values().stream().filter(c -> (c.getItemInstance().getOwnerId() == player.getObjectId()) && (c.getItemInstance().getItem().getId() == itemId)).collect(Collectors.toList()).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the player is allowed to interact with commission manager.
|
* Checks if the player is allowed to interact with commission manager.
|
||||||
* @param player the player
|
* @param player the player
|
||||||
|
|||||||
@@ -402,6 +402,7 @@ public class Message
|
|||||||
_attachments = new Mail(_senderId, _messageId);
|
_attachments = new Mail(_senderId, _messageId);
|
||||||
_attachments.restore();
|
_attachments.restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _attachments;
|
return _attachments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,10 @@ import org.l2jmobius.gameserver.enums.Faction;
|
|||||||
import org.l2jmobius.gameserver.enums.Movie;
|
import org.l2jmobius.gameserver.enums.Movie;
|
||||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||||
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.CommissionManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.MailManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
@@ -57,6 +59,7 @@ import org.l2jmobius.gameserver.model.actor.Attackable;
|
|||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Summon;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||||
@@ -64,6 +67,7 @@ import org.l2jmobius.gameserver.model.actor.instance.TrapInstance;
|
|||||||
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
||||||
import org.l2jmobius.gameserver.model.entity.Castle;
|
import org.l2jmobius.gameserver.model.entity.Castle;
|
||||||
import org.l2jmobius.gameserver.model.entity.Fort;
|
import org.l2jmobius.gameserver.model.entity.Fort;
|
||||||
|
import org.l2jmobius.gameserver.model.entity.Message;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
||||||
@@ -133,7 +137,10 @@ import org.l2jmobius.gameserver.model.instancezone.Instance;
|
|||||||
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
||||||
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.Mail;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PetInventory;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerWarehouse;
|
||||||
import org.l2jmobius.gameserver.model.items.EtcItem;
|
import org.l2jmobius.gameserver.model.items.EtcItem;
|
||||||
import org.l2jmobius.gameserver.model.items.Item;
|
import org.l2jmobius.gameserver.model.items.Item;
|
||||||
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
||||||
@@ -2428,6 +2435,105 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extensive player ownership check for single or multiple items.<br>
|
||||||
|
* Checks inventory, warehouse, pet, summons, mail attachments and item auctions.
|
||||||
|
* @param player the player to check for quest items
|
||||||
|
* @param itemIds a list of item IDs to check for
|
||||||
|
* @return {@code true} if player owns at least one items, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean ownsAtLeastOneItem(PlayerInstance player, int... itemIds)
|
||||||
|
{
|
||||||
|
// Inventory.
|
||||||
|
final PlayerInventory inventory = player.getInventory();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (inventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Warehouse.
|
||||||
|
final PlayerWarehouse warehouse = player.getWarehouse();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (warehouse.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Pet.
|
||||||
|
if (player.hasPet())
|
||||||
|
{
|
||||||
|
final PetInventory petInventory = player.getPet().getInventory();
|
||||||
|
if (petInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (petInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Summons.
|
||||||
|
if (player.hasServitors())
|
||||||
|
{
|
||||||
|
for (Summon summon : player.getServitors().values())
|
||||||
|
{
|
||||||
|
final PetInventory summonInventory = summon.getInventory();
|
||||||
|
if (summonInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (summonInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Mail attachments.
|
||||||
|
if (Config.ALLOW_MAIL)
|
||||||
|
{
|
||||||
|
final List<Message> inbox = MailManager.getInstance().getInbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : inbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final List<Message> outbox = MailManager.getInstance().getOutbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : outbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Item auctions.
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (CommissionManager.getInstance().hasCommissionedItemId(player, itemId))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the enchantment level of an item in player's inventory.
|
* Get the enchantment level of an item in player's inventory.
|
||||||
* @param player the player whose item to check
|
* @param player the player whose item to check
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ public class Hardin extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
if (player.isDualClassActive()) // dual class
|
if (player.isDualClassActive()) // dual class
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CHAOS_ESSENCE_DUAL_CLASS))
|
if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE_DUAL_CLASS))
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
@@ -216,11 +216,11 @@ public class Hardin extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
return "33870-no.html";
|
return "33870-no.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, CHAOS_ESSENCE)) // main class
|
else if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE)) // main class
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
if (player.hasServitors())
|
if (player.hasSummon())
|
||||||
{
|
{
|
||||||
return "33870-no_summon.html";
|
return "33870-no_summon.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "noSubChange.html";
|
htmltext = "noSubChange.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, SUBCLASS_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, SUBCLASS_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "noCertificate.html";
|
htmltext = "noCertificate.html";
|
||||||
}
|
}
|
||||||
@@ -378,7 +378,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "reawakenNoDual.html";
|
htmltext = "reawakenNoDual.html";
|
||||||
}
|
}
|
||||||
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
@@ -587,7 +587,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
||||||
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-15.html";
|
htmltext = "33490-15.html";
|
||||||
}
|
}
|
||||||
else if (player.isSubClassActive() || !hasQuestItems(player, SUB_CERTIFICATE))
|
else if (player.isSubClassActive() || !ownsAtLeastOneItem(player, SUB_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-21.html";
|
htmltext = "33490-21.html";
|
||||||
}
|
}
|
||||||
@@ -283,7 +283,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-30.html";
|
htmltext = "33490-30.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, DUAL_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, DUAL_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-31.html";
|
htmltext = "33490-31.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class BirthOfDraco extends LongTimeEvent
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* case "giveAgathion": { if (hasQuestItems(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
* case "giveAgathion": { if (hasQuestItemss(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
return htmltext;
|
return htmltext;
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ public class CharacterBirthday extends AbstractNpcAI
|
|||||||
else if (event.equalsIgnoreCase("change"))
|
else if (event.equalsIgnoreCase("change"))
|
||||||
{
|
{
|
||||||
// Change Hat
|
// Change Hat
|
||||||
if (hasQuestItems(player, 10250))
|
if (ownsAtLeastOneItem(player, 10250))
|
||||||
{
|
{
|
||||||
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
||||||
giveItems(player, 21594, 1); // Birthday Hat
|
giveItems(player, 21594, 1); // Birthday Hat
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class HappyHours extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
return "34262-2.htm";
|
return "34262-2.htm";
|
||||||
}
|
}
|
||||||
if (hasQuestItems(player, SUPPLY_BOX))
|
if (ownsAtLeastOneItem(player, SUPPLY_BOX))
|
||||||
{
|
{
|
||||||
return "34262-3.htm";
|
return "34262-3.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class LoversJubilee extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "50020_1":
|
case "50020_1":
|
||||||
{
|
{
|
||||||
htmtext = hasQuestItems(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
htmtext = ownsAtLeastOneItem(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "50020_2":
|
case "50020_2":
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class MasterOfEnchanting extends LongTimeEvent
|
|||||||
String htmltext = event;
|
String htmltext = event;
|
||||||
if (event.equalsIgnoreCase("buy_staff"))
|
if (event.equalsIgnoreCase("buy_staff"))
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
if (!ownsAtLeastOneItem(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
||||||
{
|
{
|
||||||
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
||||||
giveItems(player, MASTER_YOGI_STAFF, 1);
|
giveItems(player, MASTER_YOGI_STAFF, 1);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class RudolphsBlessing extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "rudolph":
|
case "rudolph":
|
||||||
{
|
{
|
||||||
if (hasQuestItems(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
if (ownsAtLeastOneItem(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
||||||
{
|
{
|
||||||
htmltext = "13285-05.htm";
|
htmltext = "13285-05.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ct":
|
case "ct":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CT, 1);
|
giveItems(player, CT, 1);
|
||||||
giveItems(player, CT_TRANSORM, 1);
|
giveItems(player, CT_TRANSORM, 1);
|
||||||
@@ -87,7 +87,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ch":
|
case "ch":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CH, 1);
|
giveItems(player, CH, 1);
|
||||||
giveItems(player, CH_TRANSORM, 1);
|
giveItems(player, CH_TRANSORM, 1);
|
||||||
@@ -102,7 +102,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "cc":
|
case "cc":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CC, 1);
|
giveItems(player, CC, 1);
|
||||||
giveItems(player, CC_TRANSORM, 1);
|
giveItems(player, CC_TRANSORM, 1);
|
||||||
|
|||||||
@@ -445,6 +445,16 @@ public class CommissionManager
|
|||||||
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param player the player
|
||||||
|
* @param itemId the item id
|
||||||
|
* @return {@code true} if the player has commissioned a specific item id, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean hasCommissionedItemId(PlayerInstance player, int itemId)
|
||||||
|
{
|
||||||
|
return !_commissionItems.values().stream().filter(c -> (c.getItemInstance().getOwnerId() == player.getObjectId()) && (c.getItemInstance().getItem().getId() == itemId)).collect(Collectors.toList()).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the player is allowed to interact with commission manager.
|
* Checks if the player is allowed to interact with commission manager.
|
||||||
* @param player the player
|
* @param player the player
|
||||||
|
|||||||
@@ -402,6 +402,7 @@ public class Message
|
|||||||
_attachments = new Mail(_senderId, _messageId);
|
_attachments = new Mail(_senderId, _messageId);
|
||||||
_attachments.restore();
|
_attachments.restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _attachments;
|
return _attachments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,10 @@ import org.l2jmobius.gameserver.enums.Faction;
|
|||||||
import org.l2jmobius.gameserver.enums.Movie;
|
import org.l2jmobius.gameserver.enums.Movie;
|
||||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||||
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.CommissionManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.MailManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
@@ -57,6 +59,7 @@ import org.l2jmobius.gameserver.model.actor.Attackable;
|
|||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Summon;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||||
@@ -64,6 +67,7 @@ import org.l2jmobius.gameserver.model.actor.instance.TrapInstance;
|
|||||||
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
||||||
import org.l2jmobius.gameserver.model.entity.Castle;
|
import org.l2jmobius.gameserver.model.entity.Castle;
|
||||||
import org.l2jmobius.gameserver.model.entity.Fort;
|
import org.l2jmobius.gameserver.model.entity.Fort;
|
||||||
|
import org.l2jmobius.gameserver.model.entity.Message;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
||||||
@@ -133,7 +137,10 @@ import org.l2jmobius.gameserver.model.instancezone.Instance;
|
|||||||
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
||||||
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.Mail;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PetInventory;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerWarehouse;
|
||||||
import org.l2jmobius.gameserver.model.items.EtcItem;
|
import org.l2jmobius.gameserver.model.items.EtcItem;
|
||||||
import org.l2jmobius.gameserver.model.items.Item;
|
import org.l2jmobius.gameserver.model.items.Item;
|
||||||
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
||||||
@@ -2428,6 +2435,105 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extensive player ownership check for single or multiple items.<br>
|
||||||
|
* Checks inventory, warehouse, pet, summons, mail attachments and item auctions.
|
||||||
|
* @param player the player to check for quest items
|
||||||
|
* @param itemIds a list of item IDs to check for
|
||||||
|
* @return {@code true} if player owns at least one items, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean ownsAtLeastOneItem(PlayerInstance player, int... itemIds)
|
||||||
|
{
|
||||||
|
// Inventory.
|
||||||
|
final PlayerInventory inventory = player.getInventory();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (inventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Warehouse.
|
||||||
|
final PlayerWarehouse warehouse = player.getWarehouse();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (warehouse.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Pet.
|
||||||
|
if (player.hasPet())
|
||||||
|
{
|
||||||
|
final PetInventory petInventory = player.getPet().getInventory();
|
||||||
|
if (petInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (petInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Summons.
|
||||||
|
if (player.hasServitors())
|
||||||
|
{
|
||||||
|
for (Summon summon : player.getServitors().values())
|
||||||
|
{
|
||||||
|
final PetInventory summonInventory = summon.getInventory();
|
||||||
|
if (summonInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (summonInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Mail attachments.
|
||||||
|
if (Config.ALLOW_MAIL)
|
||||||
|
{
|
||||||
|
final List<Message> inbox = MailManager.getInstance().getInbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : inbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final List<Message> outbox = MailManager.getInstance().getOutbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : outbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Item auctions.
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (CommissionManager.getInstance().hasCommissionedItemId(player, itemId))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the enchantment level of an item in player's inventory.
|
* Get the enchantment level of an item in player's inventory.
|
||||||
* @param player the player whose item to check
|
* @param player the player whose item to check
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ public class Hardin extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
if (player.isDualClassActive()) // dual class
|
if (player.isDualClassActive()) // dual class
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CHAOS_ESSENCE_DUAL_CLASS))
|
if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE_DUAL_CLASS))
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
@@ -216,11 +216,11 @@ public class Hardin extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
return "33870-no.html";
|
return "33870-no.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, CHAOS_ESSENCE)) // main class
|
else if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE)) // main class
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
if (player.hasServitors())
|
if (player.hasSummon())
|
||||||
{
|
{
|
||||||
return "33870-no_summon.html";
|
return "33870-no_summon.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "noSubChange.html";
|
htmltext = "noSubChange.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, SUBCLASS_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, SUBCLASS_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "noCertificate.html";
|
htmltext = "noCertificate.html";
|
||||||
}
|
}
|
||||||
@@ -378,7 +378,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "reawakenNoDual.html";
|
htmltext = "reawakenNoDual.html";
|
||||||
}
|
}
|
||||||
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
@@ -587,7 +587,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
||||||
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-15.html";
|
htmltext = "33490-15.html";
|
||||||
}
|
}
|
||||||
else if (player.isSubClassActive() || !hasQuestItems(player, SUB_CERTIFICATE))
|
else if (player.isSubClassActive() || !ownsAtLeastOneItem(player, SUB_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-21.html";
|
htmltext = "33490-21.html";
|
||||||
}
|
}
|
||||||
@@ -283,7 +283,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-30.html";
|
htmltext = "33490-30.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, DUAL_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, DUAL_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-31.html";
|
htmltext = "33490-31.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class BirthOfDraco extends LongTimeEvent
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* case "giveAgathion": { if (hasQuestItems(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
* case "giveAgathion": { if (hasQuestItemss(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
return htmltext;
|
return htmltext;
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ public class CharacterBirthday extends AbstractNpcAI
|
|||||||
else if (event.equalsIgnoreCase("change"))
|
else if (event.equalsIgnoreCase("change"))
|
||||||
{
|
{
|
||||||
// Change Hat
|
// Change Hat
|
||||||
if (hasQuestItems(player, 10250))
|
if (ownsAtLeastOneItem(player, 10250))
|
||||||
{
|
{
|
||||||
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
||||||
giveItems(player, 21594, 1); // Birthday Hat
|
giveItems(player, 21594, 1); // Birthday Hat
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class HappyHours extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
return "34262-2.htm";
|
return "34262-2.htm";
|
||||||
}
|
}
|
||||||
if (hasQuestItems(player, SUPPLY_BOX))
|
if (ownsAtLeastOneItem(player, SUPPLY_BOX))
|
||||||
{
|
{
|
||||||
return "34262-3.htm";
|
return "34262-3.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class LoversJubilee extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "50020_1":
|
case "50020_1":
|
||||||
{
|
{
|
||||||
htmtext = hasQuestItems(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
htmtext = ownsAtLeastOneItem(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "50020_2":
|
case "50020_2":
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class MasterOfEnchanting extends LongTimeEvent
|
|||||||
String htmltext = event;
|
String htmltext = event;
|
||||||
if (event.equalsIgnoreCase("buy_staff"))
|
if (event.equalsIgnoreCase("buy_staff"))
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
if (!ownsAtLeastOneItem(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
||||||
{
|
{
|
||||||
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
||||||
giveItems(player, MASTER_YOGI_STAFF, 1);
|
giveItems(player, MASTER_YOGI_STAFF, 1);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class RudolphsBlessing extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "rudolph":
|
case "rudolph":
|
||||||
{
|
{
|
||||||
if (hasQuestItems(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
if (ownsAtLeastOneItem(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
||||||
{
|
{
|
||||||
htmltext = "13285-05.htm";
|
htmltext = "13285-05.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ct":
|
case "ct":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CT, 1);
|
giveItems(player, CT, 1);
|
||||||
giveItems(player, CT_TRANSORM, 1);
|
giveItems(player, CT_TRANSORM, 1);
|
||||||
@@ -87,7 +87,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ch":
|
case "ch":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CH, 1);
|
giveItems(player, CH, 1);
|
||||||
giveItems(player, CH_TRANSORM, 1);
|
giveItems(player, CH_TRANSORM, 1);
|
||||||
@@ -102,7 +102,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "cc":
|
case "cc":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CC, 1);
|
giveItems(player, CC, 1);
|
||||||
giveItems(player, CC_TRANSORM, 1);
|
giveItems(player, CC_TRANSORM, 1);
|
||||||
|
|||||||
@@ -445,6 +445,16 @@ public class CommissionManager
|
|||||||
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param player the player
|
||||||
|
* @param itemId the item id
|
||||||
|
* @return {@code true} if the player has commissioned a specific item id, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean hasCommissionedItemId(PlayerInstance player, int itemId)
|
||||||
|
{
|
||||||
|
return !_commissionItems.values().stream().filter(c -> (c.getItemInstance().getOwnerId() == player.getObjectId()) && (c.getItemInstance().getItem().getId() == itemId)).collect(Collectors.toList()).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the player is allowed to interact with commission manager.
|
* Checks if the player is allowed to interact with commission manager.
|
||||||
* @param player the player
|
* @param player the player
|
||||||
|
|||||||
@@ -402,6 +402,7 @@ public class Message
|
|||||||
_attachments = new Mail(_senderId, _messageId);
|
_attachments = new Mail(_senderId, _messageId);
|
||||||
_attachments.restore();
|
_attachments.restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _attachments;
|
return _attachments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,10 @@ import org.l2jmobius.gameserver.enums.Faction;
|
|||||||
import org.l2jmobius.gameserver.enums.Movie;
|
import org.l2jmobius.gameserver.enums.Movie;
|
||||||
import org.l2jmobius.gameserver.enums.QuestSound;
|
import org.l2jmobius.gameserver.enums.QuestSound;
|
||||||
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.CommissionManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||||
|
import org.l2jmobius.gameserver.instancemanager.MailManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
import org.l2jmobius.gameserver.instancemanager.PcCafePointsManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.Location;
|
import org.l2jmobius.gameserver.model.Location;
|
||||||
@@ -57,6 +59,7 @@ import org.l2jmobius.gameserver.model.actor.Attackable;
|
|||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Summon;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||||
@@ -64,6 +67,7 @@ import org.l2jmobius.gameserver.model.actor.instance.TrapInstance;
|
|||||||
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
||||||
import org.l2jmobius.gameserver.model.entity.Castle;
|
import org.l2jmobius.gameserver.model.entity.Castle;
|
||||||
import org.l2jmobius.gameserver.model.entity.Fort;
|
import org.l2jmobius.gameserver.model.entity.Fort;
|
||||||
|
import org.l2jmobius.gameserver.model.entity.Message;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
import org.l2jmobius.gameserver.model.events.annotations.Ids;
|
||||||
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
|
||||||
@@ -133,7 +137,10 @@ import org.l2jmobius.gameserver.model.instancezone.Instance;
|
|||||||
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
import org.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
||||||
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.Mail;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PetInventory;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
||||||
|
import org.l2jmobius.gameserver.model.itemcontainer.PlayerWarehouse;
|
||||||
import org.l2jmobius.gameserver.model.items.EtcItem;
|
import org.l2jmobius.gameserver.model.items.EtcItem;
|
||||||
import org.l2jmobius.gameserver.model.items.Item;
|
import org.l2jmobius.gameserver.model.items.Item;
|
||||||
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
import org.l2jmobius.gameserver.model.items.enchant.attribute.AttributeHolder;
|
||||||
@@ -2428,6 +2435,105 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extensive player ownership check for single or multiple items.<br>
|
||||||
|
* Checks inventory, warehouse, pet, summons, mail attachments and item auctions.
|
||||||
|
* @param player the player to check for quest items
|
||||||
|
* @param itemIds a list of item IDs to check for
|
||||||
|
* @return {@code true} if player owns at least one items, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean ownsAtLeastOneItem(PlayerInstance player, int... itemIds)
|
||||||
|
{
|
||||||
|
// Inventory.
|
||||||
|
final PlayerInventory inventory = player.getInventory();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (inventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Warehouse.
|
||||||
|
final PlayerWarehouse warehouse = player.getWarehouse();
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (warehouse.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Pet.
|
||||||
|
if (player.hasPet())
|
||||||
|
{
|
||||||
|
final PetInventory petInventory = player.getPet().getInventory();
|
||||||
|
if (petInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (petInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Summons.
|
||||||
|
if (player.hasServitors())
|
||||||
|
{
|
||||||
|
for (Summon summon : player.getServitors().values())
|
||||||
|
{
|
||||||
|
final PetInventory summonInventory = summon.getInventory();
|
||||||
|
if (summonInventory != null)
|
||||||
|
{
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (summonInventory.getItemByItemId(itemId) != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Mail attachments.
|
||||||
|
if (Config.ALLOW_MAIL)
|
||||||
|
{
|
||||||
|
final List<Message> inbox = MailManager.getInstance().getInbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : inbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final List<Message> outbox = MailManager.getInstance().getOutbox(player.getObjectId());
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
for (Message message : outbox)
|
||||||
|
{
|
||||||
|
final Mail mail = message.getAttachments();
|
||||||
|
if ((mail != null) && (mail.getItemByItemId(itemId) != null))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Item auctions.
|
||||||
|
for (int itemId : itemIds)
|
||||||
|
{
|
||||||
|
if (CommissionManager.getInstance().hasCommissionedItemId(player, itemId))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the enchantment level of an item in player's inventory.
|
* Get the enchantment level of an item in player's inventory.
|
||||||
* @param player the player whose item to check
|
* @param player the player whose item to check
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ public class Gallias extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
case "learnSubSkill":
|
case "learnSubSkill":
|
||||||
{
|
{
|
||||||
if (player.isSubClassActive() || !hasQuestItems(player, SUB_CERTIFICATE))
|
if (player.isSubClassActive() || !ownsAtLeastOneItem(player, SUB_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "34514-21.html";
|
htmltext = "34514-21.html";
|
||||||
}
|
}
|
||||||
@@ -288,7 +288,7 @@ public class Gallias extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "34514-30.html";
|
htmltext = "34514-30.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, DUAL_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, DUAL_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "34514-31.html";
|
htmltext = "34514-31.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ public class Hardin extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
if (player.isDualClassActive()) // dual class
|
if (player.isDualClassActive()) // dual class
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CHAOS_ESSENCE_DUAL_CLASS))
|
if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE_DUAL_CLASS))
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
@@ -214,11 +214,11 @@ public class Hardin extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
return "33870-no.html";
|
return "33870-no.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, CHAOS_ESSENCE)) // main class
|
else if (!ownsAtLeastOneItem(player, CHAOS_ESSENCE)) // main class
|
||||||
{
|
{
|
||||||
return "33870-no_already_reawakened.html";
|
return "33870-no_already_reawakened.html";
|
||||||
}
|
}
|
||||||
if (player.hasServitors())
|
if (player.hasSummon())
|
||||||
{
|
{
|
||||||
return "33870-no_summon.html";
|
return "33870-no_summon.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "noSubChange.html";
|
htmltext = "noSubChange.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, SUBCLASS_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, SUBCLASS_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "noCertificate.html";
|
htmltext = "noCertificate.html";
|
||||||
}
|
}
|
||||||
@@ -367,7 +367,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "reawakenNoDual.html";
|
htmltext = "reawakenNoDual.html";
|
||||||
}
|
}
|
||||||
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
else if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
@@ -572,7 +572,7 @@ public class Raina extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
|
|
||||||
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
final int index = player.getLevel() > 94 ? REAWAKEN_PRICE.length - 1 : player.getLevel() - 85;
|
||||||
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !hasQuestItems(player, getCloakId(player)))
|
if ((player.getAdena() < REAWAKEN_PRICE[index]) || !ownsAtLeastOneItem(player, getCloakId(player)))
|
||||||
{
|
{
|
||||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "reawakenNoFee.html");
|
||||||
html.replace("%price%", REAWAKEN_PRICE[index]);
|
html.replace("%price%", REAWAKEN_PRICE[index]);
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-15.html";
|
htmltext = "33490-15.html";
|
||||||
}
|
}
|
||||||
else if (player.isSubClassActive() || !hasQuestItems(player, SUB_CERTIFICATE))
|
else if (player.isSubClassActive() || !ownsAtLeastOneItem(player, SUB_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-21.html";
|
htmltext = "33490-21.html";
|
||||||
}
|
}
|
||||||
@@ -283,7 +283,7 @@ public class Trandon extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
htmltext = "33490-30.html";
|
htmltext = "33490-30.html";
|
||||||
}
|
}
|
||||||
else if (!hasQuestItems(player, DUAL_CERTIFICATE))
|
else if (!ownsAtLeastOneItem(player, DUAL_CERTIFICATE))
|
||||||
{
|
{
|
||||||
htmltext = "33490-31.html";
|
htmltext = "33490-31.html";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class BirthOfDraco extends LongTimeEvent
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* case "giveAgathion": { if (hasQuestItems(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
* case "giveAgathion": { if (hasQuestItemss(player, AGATHION)) { htmltext = "33687-03.htm"; } else { giveItems(player, AGATHION, 1); htmltext = "33687-02.htm"; } break; }
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
return htmltext;
|
return htmltext;
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ public class CharacterBirthday extends AbstractNpcAI
|
|||||||
else if (event.equalsIgnoreCase("change"))
|
else if (event.equalsIgnoreCase("change"))
|
||||||
{
|
{
|
||||||
// Change Hat
|
// Change Hat
|
||||||
if (hasQuestItems(player, 10250))
|
if (ownsAtLeastOneItem(player, 10250))
|
||||||
{
|
{
|
||||||
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
takeItems(player, 10250, 1); // Adventurer Hat (Event)
|
||||||
giveItems(player, 21594, 1); // Birthday Hat
|
giveItems(player, 21594, 1); // Birthday Hat
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class HappyHours extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
return "34262-2.htm";
|
return "34262-2.htm";
|
||||||
}
|
}
|
||||||
if (hasQuestItems(player, SUPPLY_BOX))
|
if (ownsAtLeastOneItem(player, SUPPLY_BOX))
|
||||||
{
|
{
|
||||||
return "34262-3.htm";
|
return "34262-3.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class LoversJubilee extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "50020_1":
|
case "50020_1":
|
||||||
{
|
{
|
||||||
htmtext = hasQuestItems(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
htmtext = ownsAtLeastOneItem(player, SPIRIT_TEST_REPORT) ? "4305-010.htm" : "4305-002.htm";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "50020_2":
|
case "50020_2":
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class MasterOfEnchanting extends LongTimeEvent
|
|||||||
String htmltext = event;
|
String htmltext = event;
|
||||||
if (event.equalsIgnoreCase("buy_staff"))
|
if (event.equalsIgnoreCase("buy_staff"))
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
if (!ownsAtLeastOneItem(player, MASTER_YOGI_STAFF) && (getQuestItemsCount(player, Inventory.ADENA_ID) > STAFF_PRICE))
|
||||||
{
|
{
|
||||||
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
takeItems(player, Inventory.ADENA_ID, STAFF_PRICE);
|
||||||
giveItems(player, MASTER_YOGI_STAFF, 1);
|
giveItems(player, MASTER_YOGI_STAFF, 1);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class RudolphsBlessing extends LongTimeEvent
|
|||||||
{
|
{
|
||||||
case "rudolph":
|
case "rudolph":
|
||||||
{
|
{
|
||||||
if (hasQuestItems(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
if (ownsAtLeastOneItem(player, AGATHION_SEAL_BRACELET_RUDOLPH))
|
||||||
{
|
{
|
||||||
htmltext = "13285-05.htm";
|
htmltext = "13285-05.htm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ct":
|
case "ct":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CT, 1);
|
giveItems(player, CT, 1);
|
||||||
giveItems(player, CT_TRANSORM, 1);
|
giveItems(player, CT_TRANSORM, 1);
|
||||||
@@ -87,7 +87,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "ch":
|
case "ch":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CH, 1);
|
giveItems(player, CH, 1);
|
||||||
giveItems(player, CH_TRANSORM, 1);
|
giveItems(player, CH_TRANSORM, 1);
|
||||||
@@ -102,7 +102,7 @@ public class ThePowerOfLove extends LongTimeEvent
|
|||||||
}
|
}
|
||||||
case "cc":
|
case "cc":
|
||||||
{
|
{
|
||||||
if (!hasQuestItems(player, CT) && !hasQuestItems(player, CH) && !hasQuestItems(player, CC))
|
if (!ownsAtLeastOneItem(player, CT) && !ownsAtLeastOneItem(player, CH) && !ownsAtLeastOneItem(player, CC))
|
||||||
{
|
{
|
||||||
giveItems(player, CC, 1);
|
giveItems(player, CC, 1);
|
||||||
giveItems(player, CC_TRANSORM, 1);
|
giveItems(player, CC_TRANSORM, 1);
|
||||||
|
|||||||
@@ -445,6 +445,16 @@ public class CommissionManager
|
|||||||
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
return _commissionItems.values().stream().anyMatch(item -> item.getItemInstance().getObjectId() == objectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param player the player
|
||||||
|
* @param itemId the item id
|
||||||
|
* @return {@code true} if the player has commissioned a specific item id, {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public boolean hasCommissionedItemId(PlayerInstance player, int itemId)
|
||||||
|
{
|
||||||
|
return !_commissionItems.values().stream().filter(c -> (c.getItemInstance().getOwnerId() == player.getObjectId()) && (c.getItemInstance().getItem().getId() == itemId)).collect(Collectors.toList()).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the player is allowed to interact with commission manager.
|
* Checks if the player is allowed to interact with commission manager.
|
||||||
* @param player the player
|
* @param player the player
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user