📄 l1npcinstance.java
字号:
public L1HateList getHateList() {
return _hateList;
}
public int getParalysisTime() {
return _paralysisTime;
}
// HP自然回復
public final void startHpRegeneration() {
int hprInterval = getNpcTemplate().get_hprinterval();
int hpr = getNpcTemplate().get_hpr();
if (!_hprRunning && hprInterval > 0 && hpr > 0) {
_hprTimer = new HprTimer(hpr);
L1NpcRegenerationTimer.getInstance().scheduleAtFixedRate(_hprTimer,
hprInterval, hprInterval);
_hprRunning = true;
}
}
public final void stopHpRegeneration() {
if (_hprRunning) {
_hprTimer.cancel();
_hprRunning = false;
}
}
// MP自然回復
public final void startMpRegeneration() {
int mprInterval = getNpcTemplate().get_mprinterval();
int mpr = getNpcTemplate().get_mpr();
if (!_mprRunning && mprInterval > 0 && mpr > 0) {
_mprTimer = new MprTimer(mpr);
L1NpcRegenerationTimer.getInstance().scheduleAtFixedRate(_mprTimer,
mprInterval, mprInterval);
_mprRunning = true;
}
}
public final void stopMpRegeneration() {
if (_mprRunning) {
_mprTimer.cancel();
_mprRunning = false;
}
}
// ■■■■■■■■■■■■ タイマー関連 ■■■■■■■■■■
// HP自然回復
private boolean _hprRunning = false;
private HprTimer _hprTimer;
class HprTimer extends TimerTask {
@Override
public void run() {
try {
if ((!_destroyed && !isDead())
&& (getCurrentHp() > 0 && getCurrentHp() < getMaxHp())) {
setCurrentHp(getCurrentHp() + _point);
} else {
cancel();
_hprRunning = false;
}
} catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
}
public HprTimer(int point) {
if (point < 1) {
point = 1;
}
_point = point;
}
private final int _point;
}
// MP自然回復
private boolean _mprRunning = false;
private MprTimer _mprTimer;
class MprTimer extends TimerTask {
@Override
public void run() {
try {
if ((!_destroyed && !isDead())
&& (getCurrentHp() > 0 && getCurrentMp() < getMaxMp())) {
setCurrentMp(getCurrentMp() + _point);
} else {
cancel();
_mprRunning = false;
}
} catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
}
public MprTimer(int point) {
if (point < 1) {
point = 1;
}
_point = point;
}
private final int _point;
}
// アイテム消化
private Map<Integer, Integer> _digestItems;
public boolean _digestItemRunning = false;
class DigestItemTimer implements Runnable {
@Override
public void run() {
_digestItemRunning = true;
while (!_destroyed && _digestItems.size() > 0) {
try {
Thread.sleep(1000);
} catch (Exception exception) {
break;
}
Object[] keys = _digestItems.keySet().toArray();
for (int i = 0; i < keys.length; i++) {
Integer key = (Integer) keys[i];
Integer digestCounter = _digestItems.get(key);
digestCounter -= 1;
if (digestCounter <= 0) {
_digestItems.remove(key);
L1ItemInstance digestItem = getInventory().getItem(key);
if (digestItem != null) {
getInventory().removeItem(digestItem,
digestItem.getCount());
}
} else {
_digestItems.put(key, digestCounter);
}
}
}
_digestItemRunning = false;
}
}
// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
public L1NpcInstance(L1Npc template) {
setStatus(0);
setMoveSpeed(0);
setDead(false);
setStatus(0);
setreSpawn(false);
if (template != null) {
setting_template(template);
}
}
// 指定のテンプレートで各種値を初期化
public void setting_template(L1Npc template) {
_npcTemplate = template;
int randomlevel = 0;
double rate = 0;
double diff = 0;
setName(template.get_name());
setNameId(template.get_nameid());
if (template.get_randomlevel() == 0) { // ランダムLv指定なし
setLevel(template.get_level());
} else { // ランダムLv指定あり(最小値:get_level(),最大値:get_randomlevel())
randomlevel = _random.nextInt(
template.get_randomlevel() - template.get_level() + 1);
diff = template.get_randomlevel() - template.get_level();
rate = randomlevel / diff;
randomlevel += template.get_level();
setLevel(randomlevel);
}
if (template.get_randomhp() == 0) {
setMaxHp(template.get_hp());
setCurrentHpDirect(template.get_hp());
} else {
double randomhp = rate
* (template.get_randomhp() - template.get_hp());
int hp = (int) (template.get_hp() + randomhp);
setMaxHp(hp);
setCurrentHpDirect(hp);
}
if (template.get_randommp() == 0) {
setMaxMp(template.get_mp());
setCurrentMpDirect(template.get_mp());
} else {
double randommp = rate
* (template.get_randommp() - template.get_mp());
int mp = (int) (template.get_mp() + randommp);
setMaxMp(mp);
setCurrentMpDirect(mp);
}
if (template.get_randomac() == 0) {
setAc(template.get_ac());
} else {
double randomac = rate
* (template.get_randomac() - template.get_ac());
int ac = (int) (template.get_ac() + randomac);
setAc(ac);
}
if (template.get_randomlevel() == 0) {
setStr(template.get_str());
setCon(template.get_con());
setDex(template.get_dex());
setInt(template.get_int());
setWis(template.get_wis());
setMr(template.get_mr());
} else {
setStr((byte) Math.min(template.get_str() + diff, 127));
setCon((byte) Math.min(template.get_con() + diff, 127));
setDex((byte) Math.min(template.get_dex() + diff, 127));
setInt((byte) Math.min(template.get_int() + diff, 127));
setWis((byte) Math.min(template.get_wis() + diff, 127));
setMr((byte) Math.min(template.get_mr() + diff, 127));
addHitup((int) diff * 2);
addDmgup((int) diff * 2);
}
setPassispeed(template.get_passispeed());
setAtkspeed(template.get_atkspeed());
setAgro(template.is_agro());
setAgrocoi(template.is_agrocoi());
setAgrososc(template.is_agrososc());
setTempCharGfx(template.get_gfxid());
setGfxId(template.get_gfxid());
if (template.get_randomexp() == 0) {
setExp(template.get_exp());
} else {
setExp(template.get_randomexp() + randomlevel);
}
if (template.get_randomlawful() == 0) {
setLawful(template.get_lawful());
setTempLawful(template.get_lawful());
} else {
double randomlawful = rate
* (template.get_randomlawful() - template.get_lawful());
int lawful = (int) (template.get_lawful() + randomlawful);
setLawful(lawful);
setTempLawful(lawful);
}
setPickupItem(template.is_picupitem());
if (template.is_bravespeed()) {
setBraveSpeed(1);
} else {
setBraveSpeed(0);
}
if (template.get_digestitem() > 0) {
_digestItems = new HashMap<Integer, Integer>();
}
setKarma(template.getKarma());
setLightSize(template.getLightSize());
mobSkill = new L1MobSkillUse(this);
}
private int _passispeed;
public int getPassispeed() {
return _passispeed;
}
public void setPassispeed(int i) {
_passispeed = i;
}
private int _atkspeed;
public int getAtkspeed() {
return _atkspeed;
}
public void setAtkspeed(int i) {
_atkspeed = i;
}
private boolean _pickupItem;
public boolean isPickupItem() {
return _pickupItem;
}
public void setPickupItem(boolean flag) {
_pickupItem = flag;
}
@Override
public L1Inventory getInventory() {
return _inventory;
}
public void setInventory(L1Inventory inventory) {
_inventory = inventory;
}
public L1Npc getNpcTemplate() {
return _npcTemplate;
}
public int getNpcId() {
return _npcTemplate.get_npcId();
}
public void setPetcost(int i) {
_petcost = i;
}
public int getPetcost() {
return _petcost;
}
public void setSpawn(L1Spawn spawn) {
_spawn = spawn;
}
public L1Spawn getSpawn() {
return _spawn;
}
public void setSpawnNumber(int number) {
_spawnNumber = number;
}
public int getSpawnNumber() {
return _spawnNumber;
}
// オブジェクトIDをSpawnTaskに渡し再利用する
// グループモンスターは複雑になるので再利用しない
public void onDecay(boolean isReuseId) {
int id = 0;
if (isReuseId) {
id = getId();
} else {
id = 0;
}
_spawn.executeSpawnTask(_spawnNumber, id);
}
@Override
public void onPerceive(L1PcInstance perceivedFrom) {
perceivedFrom.addKnownObject(this);
perceivedFrom.sendPackets(new S_NPCPack(this));
onNpcAI();
}
public void deleteMe() {
_destroyed = true;
if (getInventory() != null) {
getInventory().clearItems();
}
allTargetClear();
_master = null;
L1World.getInstance().removeVisibleObject(this);
L1World.getInstance().removeObject(this);
List<L1PcInstance> players = L1World.getInstance().getRecognizePlayer(
this);
if (players.size() > 0) {
S_RemoveObject s_deleteNewObject = new S_RemoveObject(this);
for (L1PcInstance pc : players) {
if (pc != null) {
pc.removeKnownObject(this);
// if(!L1Character.distancepc(user, this))
pc.sendPackets(s_deleteNewObject);
}
}
}
removeAllKnownObjects();
// リスパウン設定
L1MobGroupInfo mobGroupInfo = getMobGroupInfo();
if (mobGroupInfo == null) {
if (isReSpawn()) {
onDecay(true);
}
} else {
if (mobGroupInfo.removeMember(this) == 0) { // グループメンバー全滅
setMobGroupInfo(null);
if (isReSpawn()) {
onDecay(false);
}
}
}
}
public void ReceiveManaDamage(L1Character attacker, int damageMp) {
}
public void receiveDamage(L1Character attacker, int damage) {
}
public void setDigestItem(L1ItemInstance item) {
_digestItems.put(new Integer(item.getId()), new Integer(
getNpcTemplate().get_digestitem()));
if (!_digestItemRunning) {
DigestItemTimer digestItemTimer = new DigestItemTimer();
GeneralThreadPool.getInstance().execute(digestItemTimer);
}
}
public void onGetItem(L1ItemInstance item) {
refineItem();
getInventory().shuffle();
if (getNpcTemplate().get_digestitem() > 0) {
setDigestItem(item);
}
}
public void approachPlayer(L1PcInstance pc) {
if (pc.hasSkillEffect(60) || pc.hasSkillEffect(97)) { // インビジビリティ、ブラインドハイディング中
return;
}
if (getHiddenStatus() == HIDDEN_STATUS_SINK) {
if (getCurrentHp() == getMaxHp()) {
if (pc.getLocation().getTileLineDistance(this.getLocation()) <= 2) {
appearOnGround(pc);
}
}
} else if (getHiddenStatus() == HIDDEN_STATUS_FLY) {
if (getCurrentHp() == getMaxHp()) {
if (pc.getLocation().getTileLineDistance(this.getLocation()) <= 1) {
appearOnGround(pc);
}
} else {
// if (getNpcTemplate().get_npcId() != 45681) { // リンドビオル以外
searchItemFromAir();
// }
}
}
}
public void appearOnGround(L1PcInstance pc) {
if (getHiddenStatus() == HIDDEN_STATUS_SINK) {
setHiddenStatus(HIDDEN_STATUS_NONE);
broadcastPacket(new S_DoActionGFX(getId(),
ActionCodes.ACTION_Appear));
setStatus(0);
broadcastPacket(new S_NPCPack(this));
if (!pc.hasSkillEffect(60) && !pc.hasSkillEffect(97) // インビジビリティ、ブラインドハイディング中以外、GM以外
&& !pc.isGm()) {
_hateList.add(pc, 0);
_target = pc;
}
onNpcAI(); // モンスターのAIを開始
} else if (getHiddenStatus() == HIDDEN_STATUS_FLY) {
setHiddenStatus(HIDDEN_STATUS_NONE);
broadcastPacket(new S_DoActionGFX(getId(),
ActionCodes.ACTION_Movedown));
setStatus(0);
broadcastPacket(new S_NPCPack(this));
if (!pc.hasSkillEffect(60) && !pc.hasSkillEffect(97) // インビジビリティ、ブラインドハイディング中以外、GM以外
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -