📄 l1inventory.java
字号:
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package l1j.server.server.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
import java.util.Random;
import l1j.server.Config;
import l1j.server.server.IdFactory;
import l1j.server.server.datatables.FurnitureSpawnTable;
import l1j.server.server.datatables.ItemTable;
import l1j.server.server.datatables.LetterTable;
import l1j.server.server.datatables.PetTable;
import l1j.server.server.model.Instance.L1FurnitureInstance;
import l1j.server.server.model.Instance.L1ItemInstance;
import l1j.server.server.templates.L1Item;
public class L1Inventory extends L1Object {
private static final long serialVersionUID = 1L;
private static l1j.eric.EricLogger _log = l1j.eric.EricLogger.getLogger2(L1Inventory.class.getName());
protected List<L1ItemInstance> _items = new CopyOnWriteArrayList<L1ItemInstance>();
public static final int MAX_AMOUNT = 2000000000; // 2G
public static final int MAX_WEIGHT = 1500;
public L1Inventory() {
//
}
// インベントリ内のアイテムの総数
public int getSize() {
return _items.size();
}
// インベントリ内の全てのアイテム
public List<L1ItemInstance> getItems() {
return _items;
}
// インベントリ内の総重量
public int getWeight() {
int weight = 0;
for (L1ItemInstance item : _items) {
weight += item.getWeight();
}
return weight;
}
// 引数のアイテムを追加しても容量と重量が大丈夫か確認
public static final int OK = 0;
public static final int SIZE_OVER = 1;
public static final int WEIGHT_OVER = 2;
public static final int AMOUNT_OVER = 3;
public int checkAddItem(L1ItemInstance item, int count) {
if (item == null) {
return -1;
}
if (item.getCount() <= 0 || count <= 0) {
return -1;
}
if (getSize() > Config.MAX_NPC_ITEM
|| (getSize() == Config.MAX_NPC_ITEM && (!item.isStackable() || !checkItem(item
.getItem().getItemId())))) { // 容量確認
return SIZE_OVER;
}
int weight = getWeight() + item.getItem().getWeight() * count / 1000
+ 1;
if (weight < 0 || (item.getItem().getWeight() * count / 1000) < 0) {
return WEIGHT_OVER;
}
if (weight > (MAX_WEIGHT * Config.RATE_WEIGHT_LIMIT_PET)) { // その他の重量確認(主にサモンとペット)
return WEIGHT_OVER;
}
L1ItemInstance itemExist = findItemId(item.getItemId());
if (itemExist != null && (itemExist.getCount() + count) > MAX_AMOUNT) {
return AMOUNT_OVER;
}
return OK;
}
// 引数のアイテムを追加しても倉庫の容量が大丈夫か確認
public static final int WAREHOUSE_TYPE_PERSONAL = 0;
public static final int WAREHOUSE_TYPE_CLAN = 1;
public int checkAddItemToWarehouse(L1ItemInstance item, int count, int type) {
if (item == null) {
return -1;
}
if (item.getCount() <= 0 || count <= 0) {
return -1;
}
int maxSize = 100;
if (type == WAREHOUSE_TYPE_PERSONAL) {
maxSize = Config.MAX_PERSONAL_WAREHOUSE_ITEM;
} else if (type == WAREHOUSE_TYPE_CLAN) {
maxSize = Config.MAX_CLAN_WAREHOUSE_ITEM;
}
if (getSize() > maxSize
|| (getSize() == maxSize && (!item.isStackable() || !checkItem(item
.getItem().getItemId())))) { // 容量確認
return SIZE_OVER;
}
return OK;
}
// 新しいアイテムの格納
public synchronized L1ItemInstance storeItem(int id, int count) {
if (count <= 0) {
return null;
}
L1Item temp = ItemTable.getInstance().getTemplate(id);
if (temp == null) {
return null;
}
if (temp.isStackable()) {
L1ItemInstance item = new L1ItemInstance(temp, count);
if (findItemId(id) == null) { // 新しく生成する必要がある場合のみIDの発行とL1Worldへの登録を行う
item.setId(IdFactory.getInstance().nextId());
L1World.getInstance().storeObject(item);
}
return storeItem(item);
}
// スタックできないアイテムの場合
L1ItemInstance result = null;
for (int i = 0; i < count; i++) {
L1ItemInstance item = new L1ItemInstance(temp, 1);
item.setId(IdFactory.getInstance().nextId());
L1World.getInstance().storeObject(item);
storeItem(item);
result = item;
}
// 最後に作ったアイテムを返す。配列を戻すようにメソッド定義を変更したほうが良いかもしれない。
return result;
}
// DROP、購入、GMコマンドで入手した新しいアイテムの格納
public synchronized L1ItemInstance storeItem(L1ItemInstance item) {
if (item.getCount() <= 0) {
return null;
}
int itemId = item.getItem().getItemId();
if (item.isStackable()) {
L1ItemInstance findItem = findItemId(itemId);
if (findItem != null) {
findItem.setCount(findItem.getCount() + item.getCount());
updateItem(findItem);
return findItem;
}
}
item.setX(getX());
item.setY(getY());
item.setMap(getMapId());
int chargeCount = item.getItem().getMaxChargeCount();
if (itemId == 40006 || itemId == 40007 || itemId == 40008
|| itemId == 140006 || itemId == 140008 || itemId == 41401) {
Random random = new Random();
chargeCount -= random.nextInt(5);
}
if (itemId == 20383) {
chargeCount = 50;
}
item.setChargeCount(chargeCount);
if (item.getItem().getType2() == 0 && item.getItem().getType() == 2) { // light系アイテム
item.setRemainingTime(item.getItem().getLightFuel());
} else {
item.setRemainingTime(item.getItem().getMaxUseTime());
}
_items.add(item);
insertItem(item);
return item;
}
// /trade、倉庫から入手したアイテムの格納
public synchronized L1ItemInstance storeTradeItem(L1ItemInstance item) {
if (item.isStackable()) {
L1ItemInstance findItem = findItemId(item.getItem().getItemId());
if (findItem != null) {
findItem.setCount(findItem.getCount() + item.getCount());
updateItem(findItem);
return findItem;
}
}
item.setX(getX());
item.setY(getY());
item.setMap(getMapId());
_items.add(item);
insertItem(item);
return item;
}
/**
* インベントリから指定されたアイテムIDのアイテムを削除する。L1ItemInstanceへの参照
* がある場合はremoveItemの方を使用するのがよい。 (こちらは矢とか魔石とか特定のアイテムを消費させるときに使う)
*
* @param itemid -
* 削除するアイテムのitemid(objidではない)
* @param count -
* 削除する數量
* @return 実際に削除された場合はtrueを返す。
*/
public boolean consumeItem(int itemid, int count) {
if (count <= 0) {
return false;
}
if (ItemTable.getInstance().getTemplate(itemid).isStackable()) {
L1ItemInstance item = findItemId(itemid);
if (item != null && item.getCount() >= count) {
removeItem(item, count);
return true;
}
} else {
L1ItemInstance[] itemList = findItemsId(itemid);
if (itemList.length == count) {
for (int i = 0; i < count; i++) {
removeItem(itemList[i], 1);
}
return true;
} else if (itemList.length > count) { // 指定數量より多く所持している場合
DataComparator dc = new DataComparator();
Arrays.sort(itemList, dc); // エンチャント順にソートし、道具等級の少ないものから消費させる
for (int i = 0; i < count; i++) {
removeItem(itemList[i], 1);
}
return true;
}
}
return false;
}
public class DataComparator implements java.util.Comparator {
public int compare(Object item1, Object item2) {
return ((L1ItemInstance) item1).getEnchantLevel()
- ((L1ItemInstance) item2).getEnchantLevel();
}
}
// 指定したアイテムから指定數量を削除(使ったりゴミ箱に捨てられたとき)戻り値:実際に削除した数
public int removeItem(int objectId, int count) {
L1ItemInstance item = getItem(objectId);
return removeItem(item, count);
}
public int removeItem(L1ItemInstance item) {
return removeItem(item, item.getCount());
}
public int removeItem(L1ItemInstance item, int count) {
if (item == null) {
return 0;
}
if (item.getCount() <= 0 || count <= 0) {
return 0;
}
if (item.getCount() < count) {
count = item.getCount();
}
if (item.getCount() == count) {
int itemId = item.getItem().getItemId();
if (itemId == 40314 || itemId == 40316) { // ペットのアミュレット
PetTable.getInstance().deletePet(item.getId());
} else if (itemId >= 49016 && itemId <= 49025) { // 便箋
LetterTable lettertable = new LetterTable();
lettertable.deleteLetter(item.getId());
} else if (itemId >= 41383 && itemId <= 41400) { // 家具
for (L1Object l1object : L1World.getInstance().getObject()) {
if (l1object instanceof L1FurnitureInstance) {
L1FurnitureInstance furniture = (L1FurnitureInstance) l1object;
if (furniture.getItemObjId() == item.getId()) { // 既に引き出している家具
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -