2008年11月18日
割り箸銃の作り方 - 逐次解説(その3)
default {-----
state_entry() {
llReleaseControls();
llRequestPermissions(llGetOwner(),
PERMISSION_TRIGGER_ANIMATION| PERMISSION_TAKE_CONTROLS | PERMISSION_ATTACH);
llPreloadSound(firesound);
-----
発射音を事前ロードしておく
-----
if (reloadsound) {
llPreloadSound(rsound);
}
-----
リロード音がある場合も事前ロード
-----
init();
-----
その他 初期化処理
-----
}
on_rez(integer start_param) {
llReleaseControls();
llRequestPermissions(llGetOwner(),
PERMISSION_TRIGGER_ANIMATION| PERMISSION_TAKE_CONTROLS | PERMISSION_ATTACH);
llPreloadSound(firesound);
if (reloadsound) {
llPreloadSound(rsound);
}
-----
llResetScript とするのと同じ?
-----
}
run_time_permissions(integer permissions) {
if (permissions > 0) {
if (!attached) {
llAttachToAvatar(ATTACH_RHAND);
// This tells it where to attach to.
-----
装着されてない場合 右手に装着
-----
}
llTakeControls(CONTROL_ML_LBUTTON, TRUE, FALSE);
-----
左クリックの制御を横取りする w
-----
if (!holstered) {
-----
ホルスターに入れられてない場合
-----
if (customanimation) {
llStartAnimation(customname);
} else if (handgun) {
llStartAnimation("hold_R_handgun");
} else {
llStartAnimation("hold_R_rifle");
}
-----
それぞれの条件で 銃を構えるアクションを起動
-----
}
attached = TRUE;
permissions = TRUE;
}
}
attach(key attachedAgent) {
-----
装着状態が変化した場合 以下を実行する
-----
if (attachedAgent != NULL_KEY) {
-----
装着された場合
-----
attached = TRUE;
if (multibullet) {
if (llGetInventoryType(bulletname) == -1) {
llSay(0, bulletname + " could not be found. Please select a new bullet");
}
}
init();
if (!permissions) {
llReleaseControls();
llRequestPermissions(llGetOwner(),
PERMISSION_TRIGGER_ANIMATION| PERMISSION_TAKE_CONTROLS | PERMISSION_ATTACH);
}
} else {
-----
外された場合
-----
attached = FALSE;
if (customanimation) {
llStopAnimation(customname);
} else if (handgun) {
llStopAnimation("hold_R_handgun");
} else {
llStopAnimation("hold_R_rifle");
}
-----
それぞれの条件で 銃を構えるアクションを終了
-----
llReleaseControls();
-----
制御の横取りを止める
-----
}
}
control(key name, integer levels, integer edges) {
if ((levels & CONTROL_ML_LBUTTON) && (edges & CONTROL_ML_LBUTTON)) {
-----
左クリックされたタイミングで
-----
if (firemode == "Single") {
-----
Single モード(初期状態)の場合
-----
fire();
-----
発射
-----
} else if (firemode == "Burst") {
-----
バーストモードの場合
-----
integer x;
for (x = 0; x < 3; x++) {
fire();
}
-----
三回発射する
-----
}
}
if ((levels & CONTROL_ML_LBUTTON) && !(edges & CONTROL_ML_LBUTTON)) {
-----
左クリックを継続していると
-----
if (firemode == "Full Auto") {
-----
フルオートモードの場合
-----
fire();
-----
発射
-----
}
}
}
touch_start(integer num_detected) {
-----
銃をクリックした場合 以下を実行する
-----
if (llDetectedKey(0) == llGetOwner()) {
-----
クリックしたのが銃の所有者の場合
-----
if (fullauto || burst || multibullet || loader || holster) {
// This will create a list of buttons for the menu
-----
メニューを表示する条件に合致する場合
-----
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(llDetectedKey(0), "Please make a selection.", dialog, listen1c);
-----
所有者にダイアログを表示
-----
入力は listen1c 経由でゲット
-----
}
}
}
(続く)
Posted by walkinglint at 16:03│Comments(0)
│walking のスクリプティング講座