📄 l1iteminstance.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.Instance;
import java.sql.Timestamp;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Logger;
import l1j.server.server.datatables.NpcTable;
import l1j.server.server.datatables.PetTable;
import l1j.server.server.model.L1EquipmentTimer;
import l1j.server.server.model.L1ItemOwnerTimer;
import l1j.server.server.model.L1Object;
import l1j.server.server.model.L1PcInventory;
import l1j.server.server.model.skill.L1SkillId;
import l1j.server.server.serverpackets.S_OwnCharStatus;
import l1j.server.server.serverpackets.S_ServerMessage;
import l1j.server.server.templates.L1Armor;
import l1j.server.server.templates.L1Item;
import l1j.server.server.templates.L1Npc;
import l1j.server.server.templates.L1Pet;
import l1j.server.server.utils.BinaryOutputStream;
// Referenced classes of package l1j.server.server.model:
// L1Object, L1PcInstance
public class L1ItemInstance extends L1Object {
private static l1j.eric.EricLogger _log = l1j.eric.EricLogger.getLogger2(L1ItemInstance.class
.getName());
private static final long serialVersionUID = 1L;
//屬性強化捲軸
private int _attribute;
private int _attributeLevel;
//~屬性強化捲軸
private int _count;
private int _itemId;
private L1Item _item;
private boolean _isEquipped = false;
private int _enchantLevel;
private boolean _isIdentified = false;
private int _durability;
private int _chargeCount;
private int _remainingTime;
private Timestamp _lastUsed = null;
private int _lastWeight;
private final LastStatus _lastStatus = new LastStatus();
private L1PcInstance _pc;
private boolean _isRunning = false;
private EnchantTimer _timer;
public L1ItemInstance() {
_count = 1;
_enchantLevel = 0;
//屬性強化捲軸
_attribute = 0;
_attributeLevel = 0;
//~屬性強化捲軸
}
public L1ItemInstance(L1Item item, int count) {
this();
setItem(item);
setCount(count);
}
/**
* アイテムが確認(鑑定)済みであるかを返す。
*
* @return 確認済みならtrue、未確認ならfalse。
*/
public boolean isIdentified() {
return _isIdentified;
}
/**
* アイテムが確認(鑑定)済みであるかを設定する。
*
* @param identified
* 確認済みならtrue、未確認ならfalse。
*/
public void setIdentified(boolean identified) {
_isIdentified = identified;
}
public String getName() {
return _item.getName();
}
/**
* アイテムの數量を返す。
*
* @return アイテムの數量
*/
public int getCount() {
return _count;
}
/**
* アイテムの數量を設定する。
*
* @param count
* アイテムの數量
*/
public void setCount(int count) {
_count = count;
}
/**
* アイテムが装備されているかを返す。
*
* @return アイテムが装備されていればtrue、装備されていなければfalse。
*/
public boolean isEquipped() {
return _isEquipped;
}
/**
* アイテムが装備されているかを設定する。
*
* @param equipped
* アイテムが装備されていればtrue,装備されていなければfalse。
*/
public void setEquipped(boolean equipped) {
_isEquipped = equipped;
}
public L1Item getItem() {
return _item;
}
public void setItem(L1Item item) {
_item = item;
_itemId = item.getItemId();
}
public int getItemId() {
return _itemId;
}
public void setItemId(int itemId) {
_itemId = itemId;
}
public boolean isStackable() {
return _item.isStackable();
}
@Override
public void onAction(L1PcInstance player) {
}
public int getEnchantLevel() {
return _enchantLevel;
}
public void setEnchantLevel(int enchantLevel) {
_enchantLevel = enchantLevel;
}
public int get_gfxid() {
return _item.getGfxId();
}
public int get_durability() {
return _durability;
}
public int getChargeCount() {
return _chargeCount;
}
public void setChargeCount(int i) {
_chargeCount = i;
}
public int getRemainingTime() {
return _remainingTime;
}
public void setRemainingTime(int i) {
_remainingTime = i;
}
public void setLastUsed(Timestamp t) {
_lastUsed = t;
}
public Timestamp getLastUsed() {
return _lastUsed;
}
public int getLastWeight() {
return _lastWeight;
}
public void setLastWeight(int weight) {
_lastWeight = weight;
}
public int getMr() {
int mr = _item.get_mdef();
if (getItemId() == 20011 || getItemId() == 20110
|| getItemId() == 120011) {
mr += getEnchantLevel();
}
if (getItemId() == 20056 || getItemId() == 120056
|| getItemId() == 220056) {
mr += getEnchantLevel() * 2;
}
return mr;
}
/*
* 耐久性、0~127まで -の値は許可しない。
*/
public void set_durability(int i) {
if (i < 0) {
i = 0;
}
if (i > 127) {
i = 127;
}
_durability = i;
}
public int getWeight() {
if (getItem().getWeight() == 0) {
return 0;
} else {
return Math.max(getCount() * getItem().getWeight() / 1000, 1);
}
}
/**
* 前回DBへ保存した際のアイテムのステータスを格納するクラス
*/
public class LastStatus {
//屬性強化捲軸
public int attribute;
public int attributeLevel;
//~屬性強化捲軸
//飾品強化卷軸
public int firemr;
public int watermr;
public int earthmr;
public int windmr;
public int addhp;
public int addmp;
public int hpr;
public int mpr;
public int addsp;
//飾品強化卷軸
public int count;
public int itemId;
public boolean isEquipped = false;
public int enchantLevel;
public boolean isIdentified = true;
public int durability;
public int chargeCount;
public int remainingTime;
public Timestamp lastUsed = null;
public void updateAll() {
count = getCount();
itemId = getItemId();
isEquipped = isEquipped();
isIdentified = isIdentified();
enchantLevel = getEnchantLevel();
durability = get_durability();
chargeCount = getChargeCount();
remainingTime = getRemainingTime();
lastUsed = getLastUsed();
//屬性強化捲軸
attribute = getAttribute();
attributeLevel = getAttributeLevel();
//~屬性強化捲軸
//飾品強化卷軸
firemr = getFireMr();
watermr = getWaterMr();
earthmr = getEarthMr();
windmr = getWindMr();
addhp = getaddHp();
addmp = getaddMp();
addsp = getaddSp();
hpr = getHpr();
mpr = getMpr();
//飾品強化卷軸
}
//屬性強化捲軸
public void updateAttribute() {
attribute = getAttribute();
}
public void updateAttributeLevel() {
attributeLevel = getAttributeLevel();
}
//~屬性強化捲軸
//飾品強化卷軸
public void updateFireMr(){
firemr = getFireMr();
}
public void updateWaterMr(){
watermr = getWaterMr();
}
public void updateEarthMr(){
earthmr = getEarthMr();
}
public void updateWindMr(){
windmr = getWindMr();
}
public void updateSp(){
addsp = getaddSp();
}
public void updateaddHp(){
addhp = getaddHp();
}
public void updateaddMp(){
addmp = getaddMp();
}
public void updateHpr(){
hpr = getHpr();
}
public void updateMpr(){
mpr = getMpr();
}
//飾品強化卷軸
public void updateCount() {
count = getCount();
}
public void updateItemId() {
itemId = getItemId();
}
public void updateEquipped() {
isEquipped = isEquipped();
}
public void updateIdentified() {
isIdentified = isIdentified();
}
public void updateEnchantLevel() {
enchantLevel = getEnchantLevel();
}
public void updateDuraility() {
durability = get_durability();
}
public void updateChargeCount() {
chargeCount = getChargeCount();
}
public void updateRemainingTime() {
remainingTime = getRemainingTime();
}
public void updateLastUsed() {
lastUsed = getLastUsed();
}
}
public LastStatus getLastStatus() {
return _lastStatus;
}
/**
* 前回DBに保存した時から変化しているカラムをビット集合として返す。
*/
public int getRecordingColumns() {
int column = 0;
if (getCount() != _lastStatus.count) {
column += L1PcInventory.COL_COUNT;
}
if (getItemId() != _lastStatus.itemId) {
column += L1PcInventory.COL_ITEMID;
}
if (isEquipped() != _lastStatus.isEquipped) {
column += L1PcInventory.COL_EQUIPPED;
}
if (getEnchantLevel() != _lastStatus.enchantLevel) {
column += L1PcInventory.COL_ENCHANTLVL;
}
if (get_durability() != _lastStatus.durability) {
column += L1PcInventory.COL_DURABILITY;
}
if (getChargeCount() != _lastStatus.chargeCount) {
column += L1PcInventory.COL_CHARGE_COUNT;
}
if (getLastUsed() != _lastStatus.lastUsed) {
column += L1PcInventory.COL_DELAY_EFFECT;
}
if (isIdentified() != _lastStatus.isIdentified) {
column += L1PcInventory.COL_IS_ID;
}
if (getRemainingTime() != _lastStatus.remainingTime) {
column += L1PcInventory.COL_REMAINING_TIME;
}
//屬性強化捲軸
if (getAttribute() != _lastStatus.attribute) {
column += L1PcInventory.COL_ATTRIBUTE;
}
if (getAttributeLevel() != _lastStatus.attributeLevel) {
column += L1PcInventory.COL_ATTRIBUTELVL;
}
//~屬性強化捲軸
//飾品強化卷軸
if (getFireMr() != _lastStatus.firemr ) {
column += L1PcInventory.COL_FIREMR;
}
if (getWaterMr() != _lastStatus.watermr ) {
column += L1PcInventory.COL_WATERMR;
}
if (getEarthMr() != _lastStatus.earthmr ) {
column += L1PcInventory.COL_EARTHMR;
}
if (getWindMr() != _lastStatus.windmr ) {
column += L1PcInventory.COL_WINDMR;
}
if (getaddSp() != _lastStatus.addsp ) {
column += L1PcInventory.COL_ADDSP;
}
if (getaddHp() != _lastStatus.addhp ) {
column += L1PcInventory.COL_ADDHP;
}
if (getaddMp() != _lastStatus.addmp ) {
column += L1PcInventory.COL_ADDMP;
}
if (getHpr() != _lastStatus.hpr ) {
column += L1PcInventory.COL_HPR;
}
if (getMpr() != _lastStatus.mpr ) {
column += L1PcInventory.COL_MPR;
}
//飾品強化卷軸
return column;
}
/**
* 鞄や倉庫で表示される形式の名前を數量を指定して取得する。<br>
*/
public String getNumberedViewName(int count) {
//屬性強化捲軸
StringBuilder name = new StringBuilder("");
if(getAttributeLevel() > 0){
name.append(weaponAttrName()+"的 ");
}
name.append(getNumberedName(count));
//~屬性強化捲軸
int itemType2 = getItem().getType2();
int itemId = getItem().getItemId();
if (itemId == 40314 || itemId == 40316) { // ペットのアミュレット
L1Pet pet = PetTable.getInstance().getTemplate(getId());
if (pet != null) {
L1Npc npc = NpcTable.getInstance().getTemplate(pet.get_npcid());
// name.append("[Lv." + pet.get_level() + " "
// + npc.get_nameid() + "]");
name.append("[Lv." + pet.get_level() + " " + pet.get_name()
+ "]HP" + pet.get_hp() + " " + npc.get_nameid());
}
}
if (getItem().getType2() == 0 && getItem().getType() == 2) { // light系アイテム
if (isNowLighting()) {
name.append(" ($10)");
}
if (itemId == 40001 || itemId == 40002) { // ランプorランタン
if (getRemainingTime() <= 0) {
name.append(" ($11)");
}
}
}
if (isEquipped()) {
if (itemType2 == 1) {
name.append(" ($9)"); // 装備(Armed)
} else if (itemType2 == 2) {
name.append(" ($117)"); // 装備(Worn)
} else if (itemType2 == 0 && getItem().getType() == 11) { // petitem
name.append(" ($117)"); // 装備(Worn)
}
}
return name.toString();
}
/**
* 鞄や倉庫で表示される形式の名前を返す。<br>
* 例:+10 カタナ (装備)
*/
public String getViewName() {
return getNumberedViewName(_count);
}
/**
* ログに表示される形式の名前を返す。<br>
* 例:アデナ(250) / +6 ダガー
*/
public String getLogName() {
return getNumberedName(_count);
}
/**
* ログに表示される形式の名前を、數量を指定して取得する。
*/
public String getNumberedName(int count) {
StringBuilder name = new StringBuilder();
if (isIdentified()) {
if (getItem().getType2() == 1 || getItem().getType2() == 2) { // 武器防具
if (getEnchantLevel() >= 0) {
name.append("+" + getEnchantLevel() + " ");
} else if (getEnchantLevel() < 0) {
name.append(String.valueOf(getEnchantLevel()) + " ");
}
}
}
name.append(_item.getNameId());
if (isIdentified()) {
if (getItem().getMaxChargeCount() > 0) {
name.append(" (" + getChargeCount() + ")");
}
if (getItem().getItemId() == 20383) { // 騎馬用ヘルム
name.append(" (" + getChargeCount() + ")");
}
if (getItem().getMaxUseTime() > 0 && getItem().getType2() != 0) { // 武器防具で使用時間制限あり
name.append(" (" + getRemainingTime() + ")");
}
}
if (count > 1) {
name.append(" (" + count + ")");
}
return name.toString();
}
// 飾品強化卷軸
private int _FireMr = 0;
public int getFireMr() {
return _FireMr;
}
public void setFireMr(int i) {
_FireMr = i;
}
private int _WaterMr = 0;
public int getWaterMr() {
return _WaterMr;
}
public void setWaterMr(int i) {
_WaterMr = i;
}
private int _EarthMr = 0;
public int getEarthMr() {
return _EarthMr;
}
public void setEarthMr(int i) {
_EarthMr = i;
}
private int _WindMr = 0;
public int getWindMr() {
return _WindMr;
}
public void setWindMr(int i) {
_WindMr = i;
}
private int _Mpr = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -