--.--.-- *--*
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

はじめてのAurigaスクリプト 基本編(17)

2011.05.14 *Sat*
NPC名について

前回のアイテム交換NPCの続きを書こうかと思いましたが
ちょっと脱線して、NPC名のお話です。

eAthenaは重複するNPC名が使用できない為、早い時期にぶつかる壁かもしれませんが
Aurigaでは使用できるので、知らない人が多いと思います。

例えば、以下のように2体の同じ名前のNPCにそれぞれOnInitイベントを入れて
mapserver.exeを起動すると・・・・
※真似する場合、win32_start.batは絶対使わないで下さい。
 自動再起動の永久ループになって大変です。


prontera.gat,154,184,4 script NPC_AAA 715,{
OnInit:
end;
}
prontera.gat,157,184,4 script NPC_AAA 716,{
OnInit:
end;
}


!?

一瞬にしてマップサーバーが落ちてしまいます!!

こういう時は、DOSコマンドの pause を使ったバッチファイルを作って
エラーメッセージを見てみます。
pause はユーザーの入力待ちを行うDOSコマンドです。

エラー検査用のバッチファイルの内容。作成場所はmapserver.exeと同じフォルダです。
mapserver.exe
@pause

バッチファイルができたらできたら、ダブルクリックで起動します。
エラー検査用のバッチの実行結果。
~~ 省略 ~~
npc_exportlabel_data : dup event NPC_AAA::OnInit
memmgr: args of aFree is invalid pointer npc.c line 2610
memmgr: args of aFree is invalid pointer npc.c line 2610
memmgr: args of aFree is invalid pointer npc.c line 2610
memmgr: args of aFree is invalid pointer npc.c line 2610
memmgr: args of aFree is invalid pointer npc.c line 2610
close DB connect....
close DB connect....
memmgr: memory leaks found.
続行するには何かキーを押してください . . .


ここでは何故落ちるかは置いておき、(いずれ修正されるかもしれないので)
エラー原因を読み取りましょう。
 npc_exportlabel_data : dup event NPC_AAA::OnInit

どうやら原因はこれのようです。

翻訳すれば
「NPC名"NPC_AAA"の"OnInit"というイベントが重複しています。」
ということでしょうか。

であれば、NPC名をユニークな名前に修正すれば解決するということですね。

しかし、本鯖にも同じ名前のNPCはいっぱい居ますし
もちろん、そのNPCの中にはイベント処理を持っている物もあります。
それを実現するにはどうしたらいいのでしょうか?

解決方法はNPCの
「副名(仮)」、「識別子」、「副識別子(仮)」
を使うのです。

それでは、NPCの特殊な命名規則を説明しましょう。

NPC名の定義規則は以下のような仕組みです。
 <表示名>#<副名>::<識別子>#<副識別子>


■副名(仮)
※なぜ(仮)かといいますと、正式な名称が謎な為です。
 eAだと"sub name"などと言うのかな
 兵士#prontera
 兵士#morocc
 兵士#event

prontera.gat,154,184,4	script	兵士#prontera	105,{
}

副名はこのように、# を使用して定義します。
そしてもちろん、# 以降はクライアントでは表示されません。
 #吹き出しNPC

という風に、表示名の無いNPCを作る際にもよく使われます。

この場合、donpceventなどでイベントラベルを実行させる場合は
 donpcevent "兵士#prontera::OnStart";

という風に記述すればOKです。
ただし表示名だけで指定しても無効になります。

一見全て解決のようですが、問題点があり、
表示名をあわせ半角23文字以上の長さを定義することが出来ない
ということです。

例えば、
「気難しそうなおじいさん」というNPCがいたとします。
半角で22文字(22バイト)なので
 気難しそうなおじいさん#prontera
 気難しそうなおじいさん#morocc

とするとどうなるかと言うと
内部では、23文字以降は削られて定義されてしまい、
どちらも「気難しそうなおじいさん#」となってしまいます。

そこで登場するのが識別子です。

■識別子
 気難しそうなおじいさん::kmおじい_pro
 気難しそうなおじいさん::kmおじい_moc

識別子はこのように::を使用して定義します。
表示名は23バイト、識別子も23バイトまで指定できます。
クライアントからはもちろん::以降は表示されません。

ただし識別子は副名と扱いが異なるのでよく覚えてください。

識別子を定義したNPCの場合、
donpceventなどでイベントラベルを実行させる場合は
 donpcevent "kmおじい_pro::OnStart";

という風に識別子だけで指定します。

もちろん表示名で指定しても無効になり、
 donpcevent "気難しそうなおじいさん::kmおじい_moc::OnStart";

などと::を2回いれても無効になります。(エラーにはなりません)

では、副名と識別子を両方定義するとどうなるかというと?
 兵士#prontera::soldier_pro

エラーにはなりませんが、複名は意味が無くなってしまいます。
でもちゃんと内部では複名も定義されています。(strnpcinfo関数で取得可能)

こちらも donpcevent などでNPC名を指定する場合は、識別子を使って指定します。
 hideonnpc "soldier_pro";


■副識別子(仮)
※これも正式な名称は不明。
 気難しそうなおじいさん::kmおじい#pro
 気難しそうなおじいさん::kmおじい#moc

副識別子を定義する場合、こう書きます。

donpceventなどでイベントラベルを実行させる場合は
 donpcevent "kmおじい#pro::OnStart";

という風に記述します。

これは普通に使うぶんには使うことは無いと思います。
でもテクニカルですが使いどころはあります。
※duplicateとstrnpcinfo関数と組み合わせるといろいろ便利。
 この辺はそのうち応用編あたりで説明したいですね。


■職位(eAthenaでは廃止)【番外】
※とてもマニアックなので読み流してもOK
実はNPCにも職位があります。

クライアントで表示されるかは謎で、用途も不明。
クライアントへのパケットには使用されています。

本鯖でギルド関連に使用されるのかもしれませんが、
しかし、未だ解析されていないようです。

設定方法は、getnpcposition関数を使います。
 getnpcposition "係長";

23バイト制限で、取得するには、strnpcinfo(6)を使います。

使い道としては、VBやC#で言うところのTagプロパティのように
なんでも入れて使えるメンバ変数のようなものと考えれば、
まあ使えなくもないかもしれない。

でもやっぱいらない・・・。
関連記事

COMMENT

Comment Form


秘密にする
 


TRACKBACK

TrackBack List



プロフィール

Author:みのり

すごく面倒臭がりで大雑把です。
なので、すぐ楽をしようとして
ツールを作り始めます。
ツールを作る時間と手作業で費やす時間
はたしてどちらが短いのか……


-構築環境-

Auriga0945 MySQL 5.5
with 2011-12-20bRagexeRE

3CeAM rev525
with 2010-07-30aRagexeRE



カテゴリ

未分類 (9)
RagexeRE (9)
eAthena (1)
Auriga (5)
ツール:eAthena用 (4)
ツール:Auriga用 (6)
ツール:その他 (14)
はじめてのAurigaスクリプト (8)
はじめてのAurigaスクリプト基本編 (21)
はじめてのAurigaスクリプト応用編 (7)
Aurigaスクリプト (3)
本鯖 (7)
Aurigaスクリプト:冒険者アカデミー (6)
ドラクエ10 (2)
新生FF14 (3)
EVE Online (2)



最新記事



最新コメント



月別アーカイブ



検索フォーム



リンク

このブログをリンクに追加する



ブロとも申請フォーム

この人とブロともになる



QRコード

QR



12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Copyright © Rocco di Forte All Rights Reserved.
テンプレート配布者: サリイ  ・・・  素材: HELIUM  ・・・ 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。