Extensive player ownership check for single or multiple items.

This commit is contained in:
MobiusDevelopment
2020-04-24 11:01:12 +00:00
parent 1477d2fd83
commit fe1d37e011
143 changed files with 2064 additions and 151 deletions

View File

@@ -77,7 +77,7 @@ public class CharacterBirthday extends AbstractNpcAI
else if (event.equalsIgnoreCase("change"))
{
// Change Hat
if (hasQuestItems(player, 10250))
if (ownsAtLeastOneItem(player, 10250))
{
takeItems(player, 10250, 1); // Adventurer Hat (Event)
giveItems(player, 21594, 1); // Birthday Hat

View File

@@ -73,7 +73,7 @@ public class MasterOfEnchanting extends LongTimeEvent
String htmltext = event;
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);
giveItems(player, MASTER_YOGI_STAFF, 1);

View File

@@ -334,6 +334,7 @@ public class Message
_attachments.restore();
_unloadTask = ThreadPool.schedule(new AttachmentsUnloadTask(this), UNLOAD_ATTACHMENTS_INTERVAL + Rnd.get(UNLOAD_ATTACHMENTS_INTERVAL));
}
return _attachments;
}

View File

@@ -41,6 +41,7 @@ import org.l2jmobius.gameserver.enums.Movie;
import org.l2jmobius.gameserver.enums.QuestSound;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.MailManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.Spawn;
@@ -54,6 +55,7 @@ import org.l2jmobius.gameserver.model.actor.instance.TrapInstance;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
import org.l2jmobius.gameserver.model.entity.Castle;
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.Ids;
import org.l2jmobius.gameserver.model.events.annotations.NpcLevelRange;
@@ -111,7 +113,10 @@ import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.instancezone.InstanceWorld;
import org.l2jmobius.gameserver.model.interfaces.IPositionable;
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.PlayerWarehouse;
import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -2086,6 +2091,79 @@ public abstract class AbstractScript extends ManagedScript
return false;
}
/**
* Extensive player ownership check for single or multiple items.<br>
* Checks inventory, warehouse, summon and mail attachments.
* @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;
}
}
// Summon.
if (player.hasSummon())
{
final PetInventory petInventory = player.getSummon().getInventory();
if (petInventory != null)
{
for (int itemId : itemIds)
{
if (petInventory.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;
}
}
}
}
return false;
}
/**
* Get the enchantment level of an item in player's inventory.
* @param player the player whose item to check