ソラマメブログ

2008年11月18日

割り箸銃の作り方 - 逐次解説(その4)

    listen(integer channel, string name, key id, string message) {
if (id == llGetOwner()) {
-----
所有者からの入力の場合
-----
if ((message == "Ammo") && (multibullet)) {
-----
銃弾を選択するボタン(Ammo)が選ばれた場合
-----
integer counter = 0;
integer fakes = 0;
bullets = [];
integer finding = TRUE;
while (finding) {
if (llGetInventoryName(INVENTORY_OBJECT, counter) != "" && counter < 12 - fakes) {
if (llListFindList(exceptions, [llGetInventoryName(INVENTORY_OBJECT, counter)]) == -1) {
bullets += [llGetSubString(llGetInventoryName(INVENTORY_OBJECT, counter), 0, 23)];
} else {
fakes++;
}
counter++;
-----
除外するものを除きながらコンテンツ中の弾丸を bullets に設定
-----
} else {
llDialog(id, "Please select your ammunition.", bullets, listen1c);
-----
全部見終わったら それで ダイアログを表示
-----
1つのダイアログで表示できるボタンの数は 12 個までなので それで上限を設定していたわけだな
-----
finding = FALSE;
}
}
} else if ((message == "Fire Modes") && (fullauto || burst)) {
-----
発射モードを選択するボタン(Fire Modes)が選ばれた場合
-----
list dialog = ["Single"];
if (fullauto) {
dialog += ["Full Auto"];
}
if (burst) {
dialog += ["Burst"];
}
llDialog(id, "Please select a fire mode.", dialog, listen1c);
-----
モードを選択するダイアログを表示
-----
} else if (message == "Single" || message == "Full Auto" || message == "Burst") {
firemode = message;
-----
それぞれのモードを firemode に設定し
-----
llSay(0, firemode + " Firing mode has been activated");
-----
その 発射モードが起動された とメッセージを出す
-----
} else if ((llToLower(message) == "holster") && (holster) && (!holstered)) {
-----
ホルスターに入れるボタンが選ばれた場合
-----
llSetLinkAlpha(LINK_SET, 0.0, ALL_SIDES);
-----
銃を透明にし
-----
holstered = TRUE;
if (customanimation) {
llStopAnimation(customname);
} else if (handgun) {
llStopAnimation("hold_R_handgun");
} else {
llStopAnimation("hold_R_rifle");
}
-----
構えているアクションを終了(あれ? 制御は?)
-----
} else if ((llToLower(message) == "unholster") && (holster) && (holstered)) {
-----
ホルスターから取り出すボタンが選ばれた場合
-----
llSetLinkAlpha(LINK_SET, 1.0, ALL_SIDES);
-----
銃を透明でなくし
-----
holstered = FALSE;
llTakeControls(CONTROL_ML_LBUTTON, TRUE, FALSE);
if (customanimation) {
llStartAnimation(customname);
} else if (handgun) {
llStartAnimation("hold_R_handgun");
} else {
llStartAnimation("hold_R_rifle");
}
-----
左クリックの制御を横取りし 構えているアクションを起動
-----
} else if ((message == "Loader") && (loader)) {
llRezObject("Loader", llGetPos() + <0,0,2>, ZERO_VECTOR, ZERO_ROTATION, randomc);
-----
ローダーが選ばれた場合 ローダーを rez
-----
} else if (llGetInventoryType(message) != -1) {
-----
コンテンツ内にあるものである場合(つまり 弾丸の名前 であった場合)
-----
bulletname = message;
-----
bulletname に設定し
-----
llSay(0, message + " is now loaded");
-----
ロードされた とメッセージを出す
-----
}
} else if ((name == "Loader" + (string)llGetOwner()) && (loader)) {
-----
ローダー処理?(今回はローダーのソースも見ないのでスキップ w)
-----
// This is all for the loader system
if (message == "Connect") {
integer finding = TRUE;
integer counter = 0;
integer fake = 0;
while (finding) {
// This gives the bullets in the guns inventory to the loader.
if (llGetInventoryName(INVENTORY_OBJECT, counter) != "" && counter - fake < 12) {
if (llListFindList(exceptions, [llGetInventoryName(INVENTORY_OBJECT, counter)]) == -1) {
llGiveInventory(id, llGetInventoryName(INVENTORY_OBJECT, counter));
} else {
fake++;
}
counter++;
} else {
llSay(randomc, "Connected" + (string)llGetOwner());
finding = FALSE;
}
}
} else if (message == "Readyload" + (string)llGetOwner()) {
// This deletes bullets in the guns inventory before the loader gives it new ones
integer finding = TRUE;
integer fakes = 0;
while (finding) {
if (llGetInventoryName(INVENTORY_OBJECT, 0 + fakes) != "") {
if (llListFindList(exceptions, [llGetInventoryName(INVENTORY_OBJECT, 0 + fakes)]) == -1) {
llRemoveInventory(llGetInventoryName(INVENTORY_OBJECT, 0 + fakes));
} else {
fakes++;
}
} else {
// AllowInventoryDrop lets the loader put bullets in
llAllowInventoryDrop(TRUE);
llSay(randomc, "Ready" + (string)llGetOwner());
finding = FALSE;
}
}
} else if (message == "Done" + (string)llGetOwner()) {
llAllowInventoryDrop(FALSE);
}
} else if (message == "Menu" + (string)llGetOwner()) {
-----
メニュー処理?
-----
// Opens the menu
if (fullauto || burst || multibullet || loader || holster) {
list dialog;
if (fullauto || burst) {
dialog += ["Fire Modes"];
}
if (multibullet) {
dialog += ["Ammo"];
}
if (loader) {
dialog += ["Loader"];
}
if ((holster) && (holstered)) {
dialog += ["Unholster"];
} else if ((holster) && (!holstered)) {
dialog += ["Holster"];
}
llDialog(llGetOwner(), "Please make a selection.", dialog, listen1c);
}
}
}
timer() {
reloading = FALSE;
llSetTimerEvent(0.0);
-----
リロード時間が終わったら リロード中でなくす
-----
}
}

同じカテゴリー(walking のスクリプティング講座)の記事
 プロフィール写真の表示に問題 (2009-11-30 20:55)
 ミニ太陽系 (2009-03-21 06:03)
 関数から文字列を返したら何か問題になる? (2009-03-18 18:02)
 llListFindList って型って関係ないんだったっけ (2009-03-18 14:02)
 夏時間(PDT)の実験 (2009-03-08 22:04)
 15パズルの作り方(その3) (2009-03-08 06:03)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。