📄 l1pcinventory.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.text.DecimalFormat;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import l1j.server.Config;
import l1j.server.server.model.Instance.L1ItemInstance;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.model.Instance.L1PetInstance;
import l1j.server.server.model.item.L1ItemId;
import l1j.server.server.serverpackets.S_AddItem;
import l1j.server.server.serverpackets.S_CharVisualUpdate;
import l1j.server.server.serverpackets.S_DeleteInventoryItem;
import l1j.server.server.serverpackets.S_Disconnect;
import l1j.server.server.serverpackets.S_ItemColor;
import l1j.server.server.serverpackets.S_ItemStatus;
import l1j.server.server.serverpackets.S_OwnCharStatus;
import l1j.server.server.serverpackets.S_ItemName;
import l1j.server.server.serverpackets.S_ItemAmount;
import l1j.server.server.serverpackets.S_PacketBox;
import l1j.server.server.serverpackets.S_ServerMessage;
import l1j.server.server.storage.CharactersItemStorage;
import l1j.server.server.templates.L1Item;
public class L1PcInventory extends L1Inventory {
//屬性強化捲軸
public static final int COL_ATTRIBUTE = 1024;
public static final int COL_ATTRIBUTELVL = 512;
//~屬性強化捲軸
//飾品強化卷軸
public static final int COL_FIREMR = 137;
public static final int COL_WATERMR = 136;
public static final int COL_WINDMR = 135;
public static final int COL_EARTHMR = 134;
public static final int COL_ADDSP = 133;
public static final int COL_ADDHP = 132;
public static final int COL_ADDMP = 131;
public static final int COL_HPR = 130;
public static final int COL_MPR = 129;
//飾品強化卷軸
private static final long serialVersionUID = 1L;
private static Logger _log = Logger
.getLogger(L1PcInventory.class.getName());
private static final int MAX_SIZE = 180;
private final L1PcInstance _owner; // 所有者プレイヤー
private int _arrowId; // 優先して使用されるアローのItemID
private int _stingId; // 優先して使用されるスティングのItemID
public L1PcInventory(L1PcInstance owner) {
_owner = owner;
_arrowId = 0;
_stingId = 0;
}
public L1PcInstance getOwner() {
return _owner;
}
// 240段階のウェイトを返す
public int getWeight240() {
return calcWeight240(getWeight());
}
// 240段階のウェイトを算出する
public int calcWeight240(int weight) {
int weight240 = 0;
if (Config.RATE_WEIGHT_LIMIT != 0) {
double maxWeight = _owner.getMaxWeight();
if (weight > maxWeight) {
weight240 = 240;
} else {
double wpTemp = (weight * 100 / maxWeight) * 240.00 / 100.00;
DecimalFormat df = new DecimalFormat("00.##");
df.format(wpTemp);
wpTemp = Math.round(wpTemp);
weight240 = (int) (wpTemp);
}
} else { // ウェイトレートが0なら重量常に0
weight240 = 0;
}
return weight240;
}
@Override
public int checkAddItem(L1ItemInstance item, int count) {
return checkAddItem(item, count, true);
}
public int checkAddItem(L1ItemInstance item, int count, boolean message) {
if (item == null) {
return -1;
}
if (getSize() > MAX_SIZE
|| (getSize() == MAX_SIZE && (!item.isStackable() || !checkItem(item
.getItem().getItemId())))) { // 容量確認
if (message) {
sendOverMessage(263); // \f1一人のキャラクターが持って歩けるアイテムは最大180個までです。
}
return SIZE_OVER;
}
int weight = getWeight() + item.getItem().getWeight() * count / 1000 + 1;
if (weight < 0 || (item.getItem().getWeight() * count / 1000) < 0) {
if (message) {
sendOverMessage(82); // アイテムが重すぎて、これ以上持てません。
}
return WEIGHT_OVER;
}
if (calcWeight240(weight) >= 240) {
if (message) {
sendOverMessage(82); // アイテムが重すぎて、これ以上持てません。
}
return WEIGHT_OVER;
}
L1ItemInstance itemExist = findItemId(item.getItemId());
if (itemExist != null && (itemExist.getCount() + count) > MAX_AMOUNT) {
if (message) {
getOwner().sendPackets(new S_ServerMessage(166,
"所持有的金幣",
"超過20億。")); // \f1%0が%4%1%3%2
}
return AMOUNT_OVER;
}
return OK;
}
public void sendOverMessage(int message_id) {
_owner.sendPackets(new S_ServerMessage(message_id));
}
// DBのcharacter_itemsの読込
@Override
public void loadItems() {
try {
CharactersItemStorage storage = CharactersItemStorage.create();
for (L1ItemInstance item : storage.loadItems(_owner.getId())) {
_items.add(item);
if (item.isEquipped()) {
item.setEquipped(false);
setEquipped(item, true, true, false);
}
if (item.getItem().getType2() == 0 && item.getItem()
.getType() == 2) { // light系アイテム
item.setRemainingTime(item.getItem().getLightFuel());
}
L1World.getInstance().storeObject(item);
}
} catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
}
// DBのcharacter_itemsへ登録
@Override
public void insertItem(L1ItemInstance item) {
_owner.sendPackets(new S_AddItem(item));
if (item.getItem().getWeight() != 0) {
_owner.sendPackets(
new S_PacketBox(S_PacketBox.WEIGHT, getWeight240()));
}
try {
CharactersItemStorage storage = CharactersItemStorage.create();
storage.storeItem(_owner.getId(), item);
} catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
}
public static final int COL_REMAINING_TIME = 256;
public static final int COL_CHARGE_COUNT = 128;
public static final int COL_ITEMID = 64;
public static final int COL_DELAY_EFFECT = 32;
public static final int COL_COUNT = 16;
public static final int COL_EQUIPPED = 8;
public static final int COL_ENCHANTLVL = 4;
public static final int COL_IS_ID = 2;
public static final int COL_DURABILITY = 1;
@Override
public void updateItem(L1ItemInstance item) {
updateItem(item, COL_COUNT);
if (item.getItem().isToBeSavedAtOnce()) {
saveItem(item, COL_COUNT);
}
}
/**
* インベントリ内のアイテムの状態を更新する。
*
* @param item -
* 更新対象のアイテム
* @param column -
* 更新するステータスの種類
*/
@Override
public void updateItem(L1ItemInstance item, int column) {
//TODO 飾品強化卷軸
if (column >= COL_FIREMR) {
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_FIREMR;
}
if (column >= COL_WATERMR) {
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_WATERMR;
}
if (column >= COL_EARTHMR) {
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_EARTHMR;
}
if (column >= COL_WINDMR) {
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_WINDMR;
}
if (column >= COL_ADDSP) {
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_ADDSP;
}
if (column >= COL_ADDHP) {
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_ADDHP;
}
if (column >= COL_ADDMP) {
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_ADDMP;
}
if (column >= COL_HPR) {
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_HPR;
}
if (column >= COL_MPR) {
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_MPR;
}
//飾品強化卷軸
//屬性強化捲軸
// add 即時更新
if (column >= COL_ATTRIBUTE) {
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_ATTRIBUTE;
}
if (column >= COL_ATTRIBUTELVL) {
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_ATTRIBUTELVL;
}
// end 2008.11.23
//~屬性強化捲軸
if (column >= COL_REMAINING_TIME) { // 使用可能な残り時間
_owner.sendPackets(new S_ItemName(item));
column -= COL_REMAINING_TIME;
}
if (column >= COL_CHARGE_COUNT) { // チャージ数
_owner.sendPackets(new S_ItemName(item));
column -= COL_CHARGE_COUNT;
}
if (column >= COL_ITEMID) { // 別のアイテムになる場合(便箋を開封したときなど)
_owner.sendPackets(new S_ItemStatus(item));
_owner.sendPackets(new S_ItemColor(item));
_owner.sendPackets(new S_PacketBox(
S_PacketBox.WEIGHT, getWeight240()));
column -= COL_ITEMID;
}
if (column >= COL_DELAY_EFFECT) { // 效果ディレイ
column -= COL_DELAY_EFFECT;
}
if (column >= COL_COUNT) { // カウント
_owner.sendPackets(new S_ItemAmount(item));
int weight = item.getWeight();
if (weight != item.getLastWeight()) {
item.setLastWeight(weight);
_owner.sendPackets(new S_ItemStatus(item));
} else {
_owner.sendPackets(new S_ItemName(item));
}
if (item.getItem().getWeight() != 0) {
// XXX 240段階のウェイトが変化しない場合は送らなくてよい
_owner.sendPackets(new S_PacketBox(
S_PacketBox.WEIGHT, getWeight240()));
}
column -= COL_COUNT;
}
if (column >= COL_EQUIPPED) { // 装備状態
_owner.sendPackets(new S_ItemName(item));
column -= COL_EQUIPPED;
}
if (column >= COL_ENCHANTLVL) { // エンチャント
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_ENCHANTLVL;
}
if (column >= COL_IS_ID) { // 確認状態
_owner.sendPackets(new S_ItemStatus(item));
_owner.sendPackets(new S_ItemColor(item));
column -= COL_IS_ID;
}
if (column >= COL_DURABILITY) { // 耐久性
_owner.sendPackets(new S_ItemStatus(item));
column -= COL_DURABILITY;
}
}
/**
* インベントリ内のアイテムの状態をDBに保存する。
*
* @param item -
* 更新対象のアイテム
* @param column -
* 更新するステータスの種類
*/
public void saveItem(L1ItemInstance item, int column) {
if (column == 0) {
return;
}
try {
CharactersItemStorage storage = CharactersItemStorage.create();
//屬性強化捲軸
if (column >= COL_ATTRIBUTE) { // 屬性
storage.updateItemAttribute(item);
column -= COL_ATTRIBUTE;
}
if (column >= COL_ATTRIBUTELVL) { // 屬性階級
storage.updateItemAttributeLevel(item);
column -= COL_ATTRIBUTELVL;
}
//~屬性強化捲軸
//飾品強化卷軸
if (column >= COL_FIREMR) {
storage.updateFireMr(item);
column -= COL_FIREMR;
}
if (column >= COL_WATERMR) {
storage.updateWaterMr(item);
column -= COL_WATERMR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -