📄 l1npcinstance.java
字号:
}
}
}
// 目標を指定のスキルで攻撃
public void attackTarget(L1Character target) {
if (target instanceof L1PcInstance) {
L1PcInstance player = (L1PcInstance) target;
if (player.isTeleport()) { // テレポート処理中
return;
}
} else if (target instanceof L1PetInstance) {
L1PetInstance pet = (L1PetInstance) target;
L1Character cha = pet.getMaster();
if (cha instanceof L1PcInstance) {
L1PcInstance player = (L1PcInstance) cha;
if (player.isTeleport()) { // テレポート処理中
return;
}
}
} else if (target instanceof L1SummonInstance) {
L1SummonInstance summon = (L1SummonInstance) target;
L1Character cha = summon.getMaster();
if (cha instanceof L1PcInstance) {
L1PcInstance player = (L1PcInstance) cha;
if (player.isTeleport()) { // テレポート処理中
return;
}
}
}
if (this instanceof L1PetInstance) {
L1PetInstance pet = (L1PetInstance) this;
L1Character cha = pet.getMaster();
if (cha instanceof L1PcInstance) {
L1PcInstance player = (L1PcInstance) cha;
if (player.isTeleport()) { // テレポート処理中
return;
}
}
} else if (this instanceof L1SummonInstance) {
L1SummonInstance summon = (L1SummonInstance) this;
L1Character cha = summon.getMaster();
if (cha instanceof L1PcInstance) {
L1PcInstance player = (L1PcInstance) cha;
if (player.isTeleport()) { // テレポート処理中
return;
}
}
}
if (target instanceof L1NpcInstance) {
L1NpcInstance npc = (L1NpcInstance) target;
if (npc.getHiddenStatus() != HIDDEN_STATUS_NONE) { // 地中に潜っているか、飛んでいる
allTargetClear();
return;
}
}
boolean isCounterBarrier = false;
L1Attack attack = new L1Attack(this, target);
if (attack.calcHit()) {
if (target.hasSkillEffect(L1SkillId.COUNTER_BARRIER)) {
L1Magic magic = new L1Magic(target, this);
boolean isProbability = magic
.calcProbabilityMagic(L1SkillId.COUNTER_BARRIER);
boolean isShortDistance = attack.isShortDistance();
if (isProbability && isShortDistance) {
isCounterBarrier = true;
}
}
if (!isCounterBarrier) {
attack.calcDamage();
}
}
if (isCounterBarrier) {
attack.actionCounterBarrier();
attack.commitCounterBarrier();
} else {
attack.action();
attack.commit();
}
setSleepTime(calcSleepTime(getAtkspeed(), ATTACK_SPEED));
}
// ターゲットアイテムを探す
public void searchTargetItem() {
ArrayList<L1GroundInventory> gInventorys =
new ArrayList<L1GroundInventory>();
for (L1Object obj : L1World.getInstance().getVisibleObjects(this)) {
if (obj != null && obj instanceof L1GroundInventory) {
gInventorys.add((L1GroundInventory) obj);
}
}
if (gInventorys.size() == 0) {
return;
}
// 拾うアイテム(のインベントリ)をランダムで選定
int pickupIndex = (int) (Math.random() * gInventorys.size());
L1GroundInventory inventory = gInventorys.get(pickupIndex);
for (L1ItemInstance item : inventory.getItems()) {
if (getInventory().checkAddItem(item, item.getCount())
== L1Inventory.OK) { // 持てるならターゲットアイテムに加える
_targetItem = item;
_targetItemList.add(_targetItem);
}
}
}
// 飛んでいる状態からアイテムを探し、あれば降りて拾う
public void searchItemFromAir() {
ArrayList<L1GroundInventory> gInventorys =
new ArrayList<L1GroundInventory>();
for (L1Object obj : L1World.getInstance().getVisibleObjects(this)) {
if (obj != null && obj instanceof L1GroundInventory) {
gInventorys.add((L1GroundInventory) obj);
}
}
if (gInventorys.size() == 0) {
return;
}
// 拾うアイテム(のインベントリ)をランダムで選定
int pickupIndex = (int) (Math.random() * gInventorys.size());
L1GroundInventory inventory = gInventorys.get(pickupIndex);
for (L1ItemInstance item : inventory.getItems()) {
if (item.getItem().getType() == 6 // potion
|| item.getItem().getType() == 7) { // food
if (getInventory().checkAddItem(item, item.getCount())
== L1Inventory.OK) {
if (getHiddenStatus() == HIDDEN_STATUS_FLY) {
setHiddenStatus(HIDDEN_STATUS_NONE);
broadcastPacket(new S_DoActionGFX(getId(),
ActionCodes.ACTION_Movedown));
setStatus(0);
broadcastPacket(new S_NPCPack(this));
onNpcAI();
startChat(CHAT_TIMING_HIDE);
_targetItem = item;
_targetItemList.add(_targetItem);
}
}
}
}
}
public static void shuffle(L1Object[] arr) {
for (int i = arr.length - 1; i > 0; i--) {
int t = (int) (Math.random() * i);
// 選ばれた値と交換する
L1Object tmp = arr[i];
arr[i] = arr[t];
arr[t] = tmp;
}
}
// 有效なターゲットアイテムか確認及び次のターゲットアイテムを設定
public void checkTargetItem() {
if (_targetItem == null
|| _targetItem.getMapId() != getMapId()
|| getLocation().getTileDistance(_targetItem.getLocation()) > 15) {
if (!_targetItemList.isEmpty()) {
_targetItem = _targetItemList.get(0);
_targetItemList.remove(0);
checkTargetItem();
} else {
_targetItem = null;
}
}
}
// ターゲットアイテムがある場合の処理
public void onTargetItem() {
if (getLocation().getTileLineDistance(_targetItem.getLocation()) == 0) { // ピックアップ可能位置
pickupTargetItem(_targetItem);
} else { // ピックアップ不可能位置
int dir = moveDirection(_targetItem.getX(), _targetItem.getY());
if (dir == -1) { // 拾うの諦め
_targetItemList.remove(_targetItem);
_targetItem = null;
} else { // ターゲットアイテムへ移動
setDirectionMove(dir);
setSleepTime(calcSleepTime(getPassispeed(), MOVE_SPEED));
}
}
}
// アイテムを拾う
public void pickupTargetItem(L1ItemInstance targetItem) {
L1Inventory groundInventory = L1World.getInstance().getInventory(
targetItem.getX(), targetItem.getY(), targetItem.getMapId());
L1ItemInstance item = groundInventory.tradeItem(targetItem, targetItem
.getCount(), getInventory());
turnOnOffLight();
onGetItem(item);
_targetItemList.remove(_targetItem);
_targetItem = null;
setSleepTime(1000);
}
// ターゲットがいない場合の処理 (返り値はAI処理を終了するかどうか)
public boolean noTarget() {
if (_master != null && _master.getMapId() == getMapId()
&& getLocation().getTileLineDistance(_master
.getLocation()) > 2) { // 主人が同じマップにいて離れてる場合は追尾
int dir = moveDirection(_master.getX(), _master.getY());
if (dir != -1) {
setDirectionMove(dir);
setSleepTime(calcSleepTime(getPassispeed(), MOVE_SPEED));
} else {
return true;
}
} else {
if (L1World.getInstance().getRecognizePlayer(this).size() == 0) {
return true; // 周りにプレイヤーがいなくなったらAI処理終了
}
// 移動できるキャラはランダムに動いておく
if (_master == null && getPassispeed() > 0 && !isRest()) {
// グループに属していないorグループに属していてリーダーの場合、ランダムに動いておく
L1MobGroupInfo mobGroupInfo = getMobGroupInfo();
if (mobGroupInfo == null
|| mobGroupInfo != null && mobGroupInfo
.isLeader(this)) {
// 移動する予定の距離を移動し終えたら、新たに距離と方向を決める
// そうでないなら、移動する予定の距離をデクリメント
if (_randomMoveDistance == 0) {
_randomMoveDistance = _random.nextInt(5) + 1;
_randomMoveDirection = _random.nextInt(20);
// ホームポイントから離れすぎないように、一定の確率でホームポイントの方向に補正
if (getHomeX() != 0 && getHomeY() != 0
&& _randomMoveDirection < 8
&& _random.nextInt(3) == 0) {
_randomMoveDirection = moveDirection(getHomeX(),
getHomeY());
}
} else {
_randomMoveDistance--;
}
int dir = checkObject(getX(), getY(), getMapId(),
_randomMoveDirection);
if (dir != -1) {
setDirectionMove(dir);
setSleepTime(calcSleepTime(getPassispeed(),
MOVE_SPEED));
}
} else { // リーダーを追尾
L1NpcInstance leader = mobGroupInfo.getLeader();
if (getLocation().getTileLineDistance(leader
.getLocation()) > 2) {
int dir = moveDirection(leader.getX(), leader.getY());
if (dir == -1) {
return true;
} else {
setDirectionMove(dir);
setSleepTime(calcSleepTime(getPassispeed(),
MOVE_SPEED));
}
}
}
}
}
return false;
}
public void onFinalAction(L1PcInstance pc, String s) {
}
// 現在のターゲットを削除
public void tagertClear() {
if (_target == null) {
return;
}
_hateList.remove(_target);
_target = null;
}
// 指定されたターゲットを削除
public void targetRemove(L1Character target) {
_hateList.remove(target);
if (_target != null && _target.equals(target)) {
_target = null;
}
}
// 全てのターゲットを削除
public void allTargetClear() {
_hateList.clear();
_dropHateList.clear();
_target = null;
_targetItemList.clear();
_targetItem = null;
}
// マスターの設定
public void setMaster(L1Character cha) {
_master = cha;
}
// マスターの取得
public L1Character getMaster() {
return _master;
}
// AIトリガ
public void onNpcAI() {
}
// アイテム精製
public void refineItem() {
int[] materials = null;
int[] counts = null;
int[] createitem = null;
int[] createcount = null;
if (_npcTemplate.get_npcId() == 45032) { // ブロッブ
// オリハルコンソードの刀身
if (getExp() != 0 && !_inventory.checkItem(20)) {
materials = new int[] { 40508, 40521, 40045 };
counts = new int[] { 150, 3, 3 };
createitem = new int[] { 20 };
createcount = new int[] { 1 };
if (_inventory.checkItem(materials, counts)) {
for (int i = 0; i < materials.length; i++) {
_inventory.consumeItem(materials[i], counts[i]);
}
for (int j = 0; j < createitem.length; j++) {
_inventory.storeItem(createitem[j], createcount[j]);
}
}
}
// ロングソードの刀身
if (getExp() != 0 && !_inventory.checkItem(19)) {
materials = new int[] { 40494, 40521 };
counts = new int[] { 150, 3 };
createitem = new int[] { 19 };
createcount = new int[] { 1 };
if (_inventory.checkItem(materials, counts)) {
for (int i = 0; i < materials.length; i++) {
_inventory.consumeItem(materials[i], counts[i]);
}
for (int j = 0; j < createitem.length; j++) {
_inventory.storeItem(createitem[j], createcount[j]);
}
}
}
// ショートソードの刀身
if (getExp() != 0 && !_inventory.checkItem(3)) {
materials = new int[] { 40494, 40521 };
counts = new int[] { 50, 1 };
createitem = new int[] { 3 };
createcount = new int[] { 1 };
if (_inventory.checkItem(materials, counts)) {
for (int i = 0; i < materials.length; i++) {
_inventory.consumeItem(materials[i], counts[i]);
}
for (int j = 0; j < createitem.length; j++) {
_inventory.storeItem(createitem[j], createcount[j]);
}
}
}
// オリハルコンホーン
if (getExp() != 0 && !_inventory.checkItem(100)) {
materials = new int[] { 88, 40508, 40045 };
counts = new int[] { 4, 80, 3 };
createitem = new int[] { 100 };
createcount = new int[] { 1 };
if (_inventory.checkItem(materials, counts)) {
for (int i = 0; i < materials.length; i++) {
_inventory.consumeItem(materials[i], counts[i]);
}
for (int j = 0; j < createitem.length; j++) {
_inventory.storeItem(createitem[j], createcount[j]);
}
}
}
// ミスリルホーン
if (getExp() != 0 && !_inventory.checkItem(89)) {
materials = new int[] { 88, 40494 };
counts = new int[] { 2, 80 };
createitem = new int[] { 89 };
createcount = new int[] { 1 };
if (_inventory.checkItem(materials, counts)) {
for (int i = 0; i < materials.length; i++) {
_inventory.consumeItem(materials[i], counts[i]);
}
for (int j = 0; j < createitem.length; j++) {
L1ItemInstance item = _inventory.storeItem(
createitem[j], createcount[j]);
if (getNpcTemplate().get_digestitem() > 0) {
setDigestItem(item);
}
}
}
}
} else if (_npcTemplate.get_npcId() == 81069) { // ドッペルゲンガー(クエスト)
// ドッペルゲンガーの体液
if (getExp() != 0 && !_inventory.checkItem(40542)) {
materials = new int[] { 40032 };
counts = new int[] { 1 };
createitem = new int[] { 40542 };
createcount = new int[] { 1 };
if (_inventory.checkItem(materials, counts)) {
for (int i = 0; i < materials.length; i++) {
_inventory.consumeItem(materials[i], counts[i]);
}
for (int j = 0; j < createitem.length; j++) {
_inventory.storeItem(createitem[j], createcount[j]);
}
}
}
} else if (_npcTemplate.get_npcId() == 45166 // ジャックオーランタン
|| _npcTemplate.get_npcId() == 45167) {
// パンプキンの種
if (getExp() != 0 && !_inventory.checkItem(40726)) {
materials = new int[] { 40725 };
counts = new int[] { 1 };
createitem = new int[] { 40726 };
createcount = new int[] { 1 };
if (_inventory.checkItem(materials, counts)) {
for (int i = 0; i < materials.length; i++) {
_inventory.consumeItem(materials[i], counts[i]);
}
for (int j = 0; j < createitem.length; j++) {
_inventory.storeItem(createitem[j], createcount[j]);
}
}
}
}
}
private boolean _aiRunning = false; // AIが実行中か
// ※AIをスタートさせる時にすでに実行されてないか確認する時に使用
private boolean _actived = false; // NPCがアクティブか
// ※この値がfalseで_targetがいる場合、アクティブになって初行動とみなしヘイストポーション等を使わせる判定で使用
private boolean _firstAttack = false; // ファーストアッタクされたか
private int _sleep_time; // AIを停止する時間(ms) ※行動を起こした場合に所要する時間をセット
protected L1HateList _hateList = new L1HateList();
protected L1HateList _dropHateList = new L1HateList();
// ※攻撃するターゲットの判定とPT時のドロップ判定で使用
protected List<L1ItemInstance> _targetItemList = new ArrayList<L1ItemInstance>(); // ダーゲットアイテム一覧
protected L1Character _target = null; // 現在のターゲット
protected L1ItemInstance _targetItem = null; // 現在のターゲットアイテム
protected L1Character _master = null; // 主人orグループリーダー
private boolean _deathProcessing = false; // 死亡処理中か
// EXP、Drop分配中はターゲットリスト、ヘイトリストをクリアしない
private int _paralysisTime = 0; // Paralysis RestTime
public void setParalysisTime(int ptime) {
_paralysisTime = ptime;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -