<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/vipdeaos/">
    <title>VIPでAoSwiki</title>
    <link>http://w.atwiki.jp/vipdeaos/</link>
    <atom:link href="https://w.atwiki.jp/vipdeaos/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>VIPでAoSwiki</description>

    <dc:language>ja</dc:language>
    <dc:date>2018-05-07T19:10:51+09:00</dc:date>
    <utime>1525687851</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/vipdeaos/pages/46.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/vipdeaos/pages/2.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/vipdeaos/pages/45.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/vipdeaos/pages/40.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/vipdeaos/pages/44.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/vipdeaos/pages/43.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/vipdeaos/pages/42.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/vipdeaos/pages/39.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/vipdeaos/pages/41.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/vipdeaos/pages/17.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/vipdeaos/pages/46.html">
    <title>鯖一覧</title>
    <link>https://w.atwiki.jp/vipdeaos/pages/46.html</link>
    <description>
      *&amp;bold(){・鯖一覧}
鯖立てれるぞ！って鯖缶はどんどん追加してってくれ

|~鯖名|~[[ルール]]|~鯖缶名(任意)|~備考|h
|例)example鯖　|ctf|Deuce|非常設|
|deuce process|dp|vippei|非常設|
|ypubg|ypubg|vippei|非常設|
|NvsS arena|arena|ニー社|非常設|
|T0M arena|arena|T0M|非常設 TDMも可|
|再現arena|arena|T0M|非常設 TDMも可|
|改造nuke|tdm|T0M|非常設|
#table_sorter(){head=#ffa500,zebra=1,repeathead=10}    </description>
    <dc:date>2018-05-07T19:10:51+09:00</dc:date>
    <utime>1525687851</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/vipdeaos/pages/2.html">
    <title>メニュー</title>
    <link>https://w.atwiki.jp/vipdeaos/pages/2.html</link>
    <description>
      **メニュー
-[[トップページ]]
-[[ページの追加・編集の仕方]]
-[[プレイするまで]]
-[[初心者ガイド]]
****プレイガイド
-[[操作・武器]]
-[[ルール]]
-[[小ネタ]]
****鯖関連
-[[鯖の建て方]]
-[[鯖一覧]]
#region(closed,[[鯖の管理]])
[[鯖の管理]]
・[[config.txtについて]]
・[[マップについて]]
#endregion
#region(closed,[[スクリプト]])
[[スクリプト]]
・[[スクリプトの作り方]]
・[[platform]]
・[[button]]
・[[和製スクリプト]]
#endregion
-[[マップの作り方]]
****その他
-[[mod製作]]
-[[てすと]]
-[[とりあえず情報集積所]]
-[[建築計画一覧]]
-[[AA置き場]]

----
**リンク集
-[[ベータ版サーバーリスト(無料版)&gt;http://www.buildandshoot.com]]
-[[ベータ版フォーラム(無料版)&gt;http://www.buildandshoot.com/forums]]
-[[OPENSPADE(高画質版)&gt;http://openspades.yvt.jp/]]
----
**アップローダー
-[[AoS専用画像うｐろだ&gt;&gt;http://yui.oopsup.com/aospictureuploader/]]
-[[AoS専用アップローダー&gt;&gt;http://ux.getuploader.com/aosuploader/]]
-[[AoS専用アップローダー2&gt;&gt;http://ux.getuploader.com/aosuploader2/]]
-[[AoS専用アップローダー3&gt;&gt;http://ux.getuploader.com/aosuploader3/]]
-[[AoS専用アップローダー(大)&gt;&gt;http://ux.getuploader.com/aosuploader4/]]
-[[英語wikiアップローダー&gt;&gt;http://aceofspadeswiki.com/index.php?title=Special:Log/upload]]
----
// リンクを張るには &quot;[&quot; 2つで文字列を括ります。
// &quot;&gt;&quot; の左側に文字、右側にURLを記述するとリンクになります


**更新履歴
#recent(10)

&amp;link_editmenu(text=ここを編集)    </description>
    <dc:date>2018-05-01T20:12:57+09:00</dc:date>
    <utime>1525173177</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/vipdeaos/pages/45.html">
    <title>スクリプトの作り方</title>
    <link>https://w.atwiki.jp/vipdeaos/pages/45.html</link>
    <description>
      [[スクリプト]]の作り方

　[[基礎編&gt;https://www25.atwiki.jp/vipdeaos/pages/40.html]]    </description>
    <dc:date>2017-03-15T21:42:52+09:00</dc:date>
    <utime>1489581772</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/vipdeaos/pages/40.html">
    <title>スクリプトの作り方（基本編）</title>
    <link>https://w.atwiki.jp/vipdeaos/pages/40.html</link>
    <description>
      AoSプログラムの基本的なお話

AoS世界はpythonっていう言語で動いている
大文字と小文字に区別がある
インデントが大事



**基礎の基礎
#region　
いろんな言葉

インデント
if
else
elif
and
or
not
=
==
関数
引数
戻り値
コメント

***インデント
#region　
プログラムの行頭に入れる空白のこと
AoSの動いてるpythonだとめちゃ重要でこれがしっかりしてないとプログラムが動かない
プログラムがインデントで階層分けされてて、同じ高さの部分が、その一個上の階層の中身になってる
def (関数名)やif (条件)などの下のインデントを下げることで、インデントが下がっている区画は上の関数や条件文に属することを意味する。

Tabキーを使ったインデントとスペースキーを使ったインデントでは見た目が同じでもコンピュータ上では違う風に処理されてインデントエラーとか言われる場合があるので注意
#endregion

***:(コロン)
#region
階層が変わることを表す
def (関数名)やif (条件)などの行末に付けて次の行からインデントを一つ下げる
インデントが下がる直前に : が無いとエラーになる
#endregion

***if
#region　
もし～～ならって意味の部分
pythonでは
&gt;	if （条件）:
&gt;		（動作）
&gt;		（動作）	
みたいになってる
条件を満たすならその下の階層を読み込んで中身を実行
条件を満たさないならスルー
条件は基本的に論理式で作られて、満たすなら１（True）、満たさないなら0（False）って感じになる
#endregion
***else
#region　
ifの後にくっついたりする
さもなくば、みたいな意味
&gt;	if （条件）:
&gt;		（動作１）
&gt;	else:
&gt;		（動作２）
こうなると、条件を満たすなら動作1を、満たさないなら動作２を実行
#endregion
***elif
#region　
else + if みたいな感じ
条件を大量に用意する場合使う
&gt;	if （条件A）:
&gt;		（動作１）
&gt;	elif (条件B):
&gt;		（動作２）
&gt;	elif (条件C):
&gt;		（動作３）
&gt;	else:
&gt;		（動作４）
これだともし条件Aを満たすなら動作１、Aを満たさずBを満たすなら動作２、A,Bを満たさずCを満たすなら動作３、どれも満たさないなら動作４になる。

上のやつをelifを使わないで書くとこうなる
&gt;	if （条件A）:
&gt;		（動作１）
&gt;	else:
&gt;		if (条件B):
&gt;			（動作２）
&gt;		else:
&gt;			if (条件C):
&gt;				（動作３）
&gt;			else:
&gt;				（動作４）
どちらでも動作は同じ
#endregion

***and
#region　
且つ
条件式をが両方満たされたら条件成立にする
&gt;	if （条件A） and (条件B):
&gt;		（動作１）
&gt;	else:
&gt;		（動作２）
これだと条件ABが双方満たされれば動作1を、どちらかでも欠けてれば動作２を行う

論理式はゼロイチで作られるって上で書いたけど、これは掛け算にあたる
一個でもゼロが入ったらゼロ
#endregion
***or
#region　
または
条件式のどちらか一方がOKなら成立にする
&gt;	if （条件A） or (条件B):
&gt;		（動作１）
これだと、A,Bの一方が満たされれば、もう一方はだめでも動作1が実行される。
#endregion
***not
#region　
否定文
条件を満たさないなら成立
&gt;	if（条件A）and not (条件B):
&gt;		（動作１）
これだと「Aを満たす」かつ「Bを満たさない」ならば条件成立になる。
#endregion

***=
#region　
プログラムの世界では数学のやつと違って「 = 」は代入を意味する。
例えばmedkitの所持数にを3を代入したければ
&gt;       medkits = 3
って書く
当然数値を計算することも可能
medkit使って所持数が一個減る時は
&gt;	if (medkitが使用された):
&gt;		medkits = medkits - 1
となる。
また、上の例のように、自分自身に自分自身を変化させたものを代入する場合、
（上の例だとmedkitsに「計算前のmedkits」 - 1を代入している）の場合は、
&gt;	medkits -= 1
と書くことができる。既存スクリプトではこっちの書き方が使われることが多い
増やすときも同様に
&gt;	nantara += kantara
と書くこともできる。この場合は
「計算後のnantara」は、「元のnantara」 + kantara になる

加減乗除の計算記号は
&gt; + - * /
小数点以下切り落とし割り算と、割り算の余りを計算する記号は
&gt; //　%
例えば
&gt; a = 7 // 3
だとaは2になり、
&gt; a = 7 % 3
だとaは1になる
#endregion

***==
#region　
これは数学で使うのと同じような感じの意味な気がするイコール
ifの条件のところみたいな論理式で使われる
a == b って書くとaがbと等しいかどうかを問うことになる
&gt;	if a == b:
って書いたら、aイコールbのときifの中身を実行
他には
  &lt;   &lt;=   &gt;=   &gt;  != 
の記号がある
前の4つは見てのとおり大なり小なりの意味
&gt;	if a &lt;= 3:
&gt;		（動作１）
&gt;	elif a &lt; 8:
&gt;		（動作２）	
これだとaが3以下なら動作１、3より大きくてかつ8未満なら動作２、8以上ならスルーということになる
イコールがつくかつかないかでその数が入るか決まるのでそこ重要
!=の!はnotを示す。すなわち≠。

ちなみにif文の中でaが3の時動作させようと思って
&gt;	if a = 3:
とか書くとエラ―吐くぞ。ifの時は==だぞ、間違えるな。


#endregion

***関数、引数、戻り値
#region　
プログラム長くなると読みづらいし書くのもめんどくさいしいいことがないから、よく使う部分をモジュール化して置いておこうというプログラムの概念
プログラムの中の小さいプログラム的な
pythonだとdef()なんちゃらの部分が関数にあたる

例えば、a+bとa*bの大きい方をXに代入する場合
&gt;	A = a+b
&gt;	B = a*b
&gt; 
&gt;	if A&gt;=B:
&gt;		X = A
&gt;	else:
&gt;		X = B
となるが、これがプログラムの中で何回も使われる場合、Xを求める関数を作ってしまう方がよい

&gt;	def nanika_betuno_kansuu:
&gt;		～動作１～
&gt;		dmg = 5
&gt;		～動作２～
&gt;		rate = 2
&gt;		damage = keisan(dmg, rate)
&gt;		～動作４～
&gt;	
&gt;  ～～～～～～～中略～～～～～～～～～～～～～～～～
&gt;	def keisan(a,b)
&gt;		A = a+b
&gt;		B = a*b
&gt; 
&gt;		if A&gt;=B:
&gt;			X = A
&gt;		else:
&gt;			X = B
&gt;		return X
って書いてしまえば、長々しい計算部分は一度書けばよくて、後はX=keisan(3,4)とでも打てば1行でXに答えが計算される

この場合プログラムの走る経路は
&gt;	関数「nanika_betuno_kansuu」が実行される
&gt;		動作１
&gt;		変数dmgに5を代入
&gt;		動作２
&gt;		変数rateに2を代入
&gt;		変数damageにkeisan(5, 2)を代入しようとする
&gt;		関数keisan(___, ___)を実行
&gt;			keisan(a,b)の a,b に 5,2 を代入
&gt;			Aに 5+2 すなわち 7 を代入
&gt;			Bに 5*2 すなわち 10 を代入
&gt;			AはB以上か？ 7 &gt;= 10 ではないのでelseへ
&gt;				XにBすなわち 10 を代入
&gt;			Xすなわち 10 を元の関数に返却する
&gt;		keisan(dmg, rate)はすなわちkeisan(5,2)、すなわち 10 
&gt;		damageに10が代入される
&gt;		動作４
という流れ

このkeisan()みたいなのを関数
keisan(a,b)のa,bみたいに突っ込む値を引数
return Xみたいに計算終了後keisan()の結果となる数値を戻り値という

関数で引数を3つ指定してんのに、使うときに引数を2つしか送らなかったりするとエラー吐くからこれ大事
#endregion

***既存のスクリプトの読み方
#region　
ここまでで既存スクリプトの断片が読めるはず
例としてmedkit.pyの一部分を切り取った
&gt;	def medkit(connection):
&gt;	    if connection.medkits and connection.hp &lt; 100:
&gt;	        connection.set_hp(connection.hp + connection.protocol.heal_amount,type = FALL_KILL)
&gt;	        connection.medkits -= 1
&gt;	        connection.send_chat(&#039;You have been healed&#039;)
&gt;	    else:
&gt;	        connection.send_chat(&quot;You don&#039;t have any medkits or have full health!&quot;)

構造としては
&gt; 一番上位の階層のdef～～が最上階層。medkitが使用される際に呼び起される関数。
&gt;   2層目に if と else がある
&gt;     最下層は実際に実行して何かを動作させる部分にあたる

connection.set_hp(～～)はHPを括弧の中身に変化させる関数
,で区切られてるから、値とタイプの二つを引数として必要としてるっぽいな
connection.protocol.heal_amountはスクリプトのどっか別の場所で指定されてる回復量
connection.send_chat(&#039;～～&#039;)はプレイヤーにメッセージをを送る関数。これが読まれたら&#039;&#039;の中身がチャットに赤字で表示される。
この辺の関数はゲームにもともと用意されてるっぽいから関数のカッコに好きな値突っ込めば動作する感じ

connectionがなんだかは後述

日本語に起こすと

&gt;  medkitの関数
&gt;  	もしmedkit所持数が1以上 かつ HP が100未満ならば：
&gt;  		HPを（今のHP + 回復量）にタイプはFALL_KILLで変更
&gt;		medkit所持数を1減らす
&gt;		「You have been healed」とチャット送る
&gt;	「medkit所持数が1以上 かつ HP が100未満」を満たさない（どっちか一方でも満たさない）ならば
&gt;	        「You don&#039;t have any medkits or have full health!」とチャットを送る
となる
#endregion

***コメント
#region　
プログラム的には読み込まれない、読みやすくするためのメモ的な機能
スクリプトの一行目に
&gt;   # -*- coding: utf-8 -*-
って入れると日本語のコメントを入れれるようになる
これ入れないで日本語コメント使うとバグる
****コメントの入れ方
「#」を入れるとその行はそこから先無かったことになる

&gt; &quot;&quot;&quot;
&gt; &quot;&quot;&quot;
で挟むとその間はなかったことになる
&gt; &#039;&#039;&#039;
&gt; &#039;&#039;&#039;
で挟んでもその間はなかったことになる
&quot;&quot;&quot;とか&#039;&#039;&#039;で挟む場合はインデント合わせないとエラー吐くので注意
例
&gt; # -*- coding: utf-8 -*-
&gt;      &quot;&quot;&quot;
&gt;  この間は何書いても基本的にプログラムに支障ない
&gt;  上の方にプログラムの説明書いとくといいね
&gt;      &quot;&quot;&quot;
&gt; 	def medkit(connection):
&gt; 	    if connection.medkits and connection.hp &lt; 100:　 #ここに説明とか書くとgood
&gt; 	        connection.set_hp(connection.hp + connection.protocol.heal_amount,type = FALL_KILL)
&gt; 	        &#039;&#039;&#039;
&gt; 　　　　コメントだから何書いてもセーフ
&gt;          うんこちんこまんこ
&gt; 　　　　チョンチョンチョンのインデントを周りに合わせないとエラーする
&gt; 	        &#039;&#039;&#039;
&gt; 	        connection.medkits -= 1　　　　
&gt; 	     #  connection.send_chat(&#039;You have been healed&#039;) これでこの行はなかったことにできる。簡単だからエラーの原因探るのとかに便利
&gt; 	    else:
&gt; 	        connection.send_chat(&quot;You don&#039;t have any medkits or have full health!&quot;)
#endregion


***print （コンソール(run.exeの黒いウィンドウ)に文字列や内部数値などを表示）
#region

&gt; print &quot;hogehoge&quot;
とやると、黒いウィンドウにhogehogeと表示される。
読み込まれたらすぐに表示されるので、エラーの原因となる部分の1行でも上にあれば表示される。
逆に、一行でもエラー部分の下にあれば表示されないので、この文字列がログに表示されるかどうかを見ることでどこがエラーの原因かを探ることができる。
あるいは、if,elifの中に別々の文字列を突っ込んだら、どのルートをプログラムが読んでるのかを把握することができる。

&gt; 例
&gt;	if （条件A）:
&gt;		print &quot;ルートA&quot;
&gt;	elif (条件B):
&gt;		print &quot;ルートB&quot;
&gt;	elif (条件C):
&gt;		print &quot;ルートC&quot;
&gt;	else:
&gt;		print &quot;ルートE&quot;
&gt;
&gt;
&gt; コンソール表示
&gt; ルートB
このようになれば、このプログラムがその時の条件では条件Bを満たしていたことがわかる。



&gt; print x　　　　（xは変数）
とやると、xの代入値が表示される。
例えばプレイヤーの座標とかを表示させればプレイヤーの座標をコンソールで把握できる。
これのいいところは、数値として表示されないスポーン座標や内部計算などを数値として表示させることができるので、自作スクリプトがどこまで意図したとおりに動作しているかを把握することができる所である。

基本的にスクリプトのどの部分に突っ込んでも正常に動作してくれるので安心。

&gt; print &quot;otimmpo!&quot;　
のようにダブルクォーテーション&quot;&quot;またはシングルクォーテーション&#039;&#039;で囲むと文字列をprintできる。便利。
日本語入れるとさすがにエラー吐く。半角英数のみ

#endregion

***import
#region　
インポート
標準ライブラリ（デフォルトで用意されてる関数の辞書的なもの）を呼び出すのにつかう。
あと他の.pyファイルを連動させる場合に使う（A.pyの中の特定の関数が読まれたらB.pyのある関数に飛ぶ、みたいな）。

実際のスクリプトを見ると、スクリプトの上の方で
&gt; import csv
&gt; from StringIO import StringIO
&gt; from collections import deque, defaultdict
&gt; from functools import partial
&gt; from itertools import izip, islice, chain
&gt; from random import choice
&gt; from twisted.internet.reactor import callLater, seconds
&gt; from pyspades.world import cube_line
こんな感じになってると思う。これがインポート。

例えばランダムな値を生成したい場合、
&gt;import random
これをスクリプトのインポートのところに書くと、[[http://docs.python.jp/2/library/random.html]]にある機能が使えるようになる。
例えばある値xに100～200の間のランダムな値を代入したい場合、
&gt; x=random.randint(100, 200)
と書けばよい。ランダムとかの各機能の詳細は別項で書くと思う。

import randomならrandomライブラリの中のどの機能も使えるようになるが、機能（例えばrandint）の前にいちいちrandom.randintのようにインポート元を書かないといけない。
ここで、
from random import randint, uniform, vonmisesvariate
のように各機能をインポートすると、
&gt; x=randint(100, 200)
のようにインポート元を書かなくても使えるようになる。
しかしこの場合、インポートした機能（この場合randint, uniform, vonmisesvariate）しか使えない

よく使われるライブラリとしては、
randomのほかに、サインコサインとか√とか数学系の機能を使えるようになるmathや、n秒後に関数呼び出しのなどの時間系の機能を使えるreactorなどがよく使われる。
あとAoS内固有のライブラリ
&gt; from pyspades.common import Vertex3
&gt; from commands import add, admin
&gt; from pyspades.world import Grenade
&gt; from pyspades.server import grenade_packet
なんかもあったりする。

なお、筆者がよくわかっていないので詳しく書けないが、標準ライブラリの中でも使えるライブラリと使えないライブラリがあるっぽい気がする
多分pyspadesのコンパイラにデフォルトで用意されてたりされてなかったりするってことでしょう

#endregion

#endregion




**AoSスクリプトのなんやかんや
#region

***動作をしたら割り込みを起こす感じのやつについて
#region
スクリプトを作る場合プレイヤーが何か行動を起こしたときに何かが起こるようなものを作りたい場合がほとんどだと思う
ゲームの方にもともと「プレイヤーが○○をしたときに呼び出される関数」ってのが用意されてるからそれを使うといい感じにできる

例えば
&gt;	def on_spawn(self,pos):
ってのはスポーンした瞬間にスポーン位置posって情報が入力されて呼び出される関数

&gt;	def on_spawn(self,pos):
&gt;		動作１
&gt;	 	return connection.on_spawn(self,pos)
ってやるとスポーンしたら動作１が行われる

例として、緑チームのときだけなんかチャットが出る文を作った
&gt;	def on_spawn(self,pos):
&gt;		if self.team == self.protocol.green_team:
&gt;			self.send_chat(&quot;you spawned in green team&quot;)
&gt;		return connection.on_spawn(self,pos)

他には
&gt;	def on_animation_update(self,jump,crouch,sneak,sprint):
はジャンプ、しゃがむ（またはしゃがみ解除）、V（またはV離す）、ダッシュ（またはダッシュ解除）の状態変化が起こった瞬間に呼び出される

&gt;	def on_animation_update(self,jump,crouch,sneak,sprint):
&gt;		if self.team == self.protocol.blue_team:
&gt;	 	    	if jump:
&gt;				self.send_chat(&quot;space osita&quot;)
&gt;			elif sprint:
&gt;				self.send_chat(&quot;shift osita&quot;)
&gt;			elif sneak:
&gt;				self.send_chat(&quot;V osita&quot;)
&gt;			elif crouch:
&gt;				self.send_chat(&quot;ctrl osita&quot;)
&gt;			else:
&gt;				self.send_chat(&quot;Shift ka V ka Ctrl wo hanasita&quot;)
&gt;		return connection.on_animation_update(self,jump,crouch,sneak,sprint)
この例だと青チームの人が上記動作を行うとそれに応じたメッセージが表示される



他にもいろいろ

&gt;    def on_hack_attempt(self, reason):
&gt;    def on_position_update(self):    
&gt;    def on_weapon_set(self, value):    
&gt;    def on_fall(self, damage):
&gt;    def on_orientation_update(self, x, y, z):
&gt;    def on_shoot_set(self, fire):
&gt;    def on_secondary_fire_set(self, secondary):
&gt;    def on_walk_update(self, up, down, left, right):
など用意されている（ここに書いたのはごく一部）
戻り値を与えないとバグったり、エラー吐かないのに他のスクリプトが正常に動かなくなったりすることがあるので注意
基本的には 
&gt; def xxxxxx(self, aaaa, bbbb):
っていう関数には
&gt;     return connection.xxxxxx(self, aaaa, bbbb)
と戻り値を与えておけばよい

[[https://github.com/Colorpinpoint/pysnip/blob/master/pyspades/server.py]]
ここの1100行目辺りにトリガーとして使える関数一覧が載ってる。
#endregion

***AoS世界の座標について
#region
AoS世界のマップは高さ64,縦横512ブロックの箱庭であるのは常識である。

マップの左右方向がx軸、上下方向がy軸、そして天地方向がz軸である
マップ左上の上空が原点となり、マップ右がx軸正方向、マップ下がy軸正方向、マップの地面方向がz軸正方向となる。
また、z=62は一番下の掘れない地面で、z=63は水面ブロックである。

512*512*64の領域はブロックを置けたりグレネードが爆発できたりする領域の話で、プレイヤーが存在できる世界はこれだけではない。
z&gt;63の、海よりも深い領域も存在する。スクリプトを使うと掘れたりする。なんか真っ黒で、プレイヤーも真っ黒になった。
しかしその領域に足を踏み入れるとバグって鯖が落ちるので注意。

z&lt;0のzがマイナスになるゾーンも存在する。この領域では問題なくプレイヤーが動くことができる。
しかし、z&lt;0領域ではグレネードにダメージが乗らないほか、ブロックを置くことができない。
また、あまり高く行き過ぎる(z&lt;-80くらい)とクライアントが落ちる事があるので注意。
マップ左右（0&lt;x&lt;511）からはみ出した領域では、コマンドなどは打てるが移動ができなくなる。
マップ上下(0&lt;y&lt;511)からはみ出すとクライアントが落ちる。



AoS世界の座標まとめ

　通常世界は
　0&lt;x&lt;511
　0&lt;y&lt;511
　0&lt;z&lt;63
　の領域。
　
　x軸は右が正
　y軸は下が正
　z軸は地面が正
#endregion

***現在位置取得するやつについて
#region
&gt;	x, y, z = self.world_object.position.get()

この一行で変数x,y,zにselfで指定されるプレイヤーの座標が代入される。
&gt;	pos = self.world_object.position
でも同様にpという変数に座標が代入されるが、この座標はvertex3型である（俺もよくわからん）
つまるところ pos = vertex3(x,y,z) である

もちろん変数名は適当なものでおkである


なお、この座標はプレイヤーの頭の位置であるので、足元の座標だとx,y,z-2くらいになる
#endregion

***現在方向取得するやつについて
#region
プレイヤーの向いてる方向を取得する
方向は半径1の球の表面の点の座標で表されることが多い
例えば真上を向くときは(0,0,-1)であるし、マップ右側を向くときは(0,0,1)、マップ左下正面を向くならば(-0.7,0.7,0)くらいである。


&gt;	x2,y2,z2 = self.world_object.orientation.get()
座標の取得と同様にこの一行でおｋ
&gt;	ori = self.world_object.orientation
でもおｋ
座標と同様に ori = vertex3(x2,y2,z2)
#endregion

***グレネード生成するやつについて
#region

基本的なこととして、AoS世界のグレネードは「ダメージの発生する見えないグレネード」と「目に見えるグラフィックだけのハリボテグレネード」の二種類が存在して、
この二つが重なって同じ向きに同じ速さで投射されることでいつものグレネードが出来上がっている。

&gt;	self.protocol.world.create_object(Grenade, time, pos, None, ori, self.grenade_exploded)
これが目に見えないダメージのある方のグレネード生成部分
括弧内のGrenadeはさておき、二つ目のtimeが生成から爆発までの時間。より正確にいうと、生成から最後のself.grenade_exprodedという関数を呼び出すまでの時間。
最後の引数の関数を変えれば爆発時に別の関数を呼び出すことも可能
三つ目のposはグレネードの生成点の座標（vertex3型）
四つ目のNoneはよくわからん（誰か教えて）
↑この部分にposやoriと同形式のデータを与えるとその分が初速に加算されるらしい　まあ気にしなくてよいかと
五つ目のoriはグレネードの初速

というわけで、この関数ひとつで、目に見えないtime秒後に爆発するグレネードがposからoriに向けて発射される。
例えば
&gt;	self.protocol.world.create_object(Grenade, 2.0, Vertex3(255,255,32), None, Vertex3(0,0,-2), self.grenade_exploded)
とやると、座標(255,255,32)の点から(0,0,-1)（真上向き）に結構な速度でグレネードが発射され、2秒後に爆発される。
だがこれだけだと目に見えない。

目に見えるハリボテグレネードの生成はコチラ
&gt;	grenade_packet.value = time
&gt;	grenade_packet.player_id = self.player_id
&gt;	grenade_packet.position = pos.get()
&gt;	grenade_packet.velocity = (a,b,c)
&gt;	self.protocol.send_contained(grenade_packet)
1行目は爆発までの時間
2行目は誰のグレネードかを書く
3行目は生成座標。vertex3ではなく普通の座標。
4行目は初速。こちらも普通の座標
5行目はよくわからんけどこのまま突っ込んどきゃいいと思う

というわけでこれらを合わせると、目に見えて爆発グラフィックも出るしダメージも喰らうグレネードができる。

例として3秒で爆発するグレネードをプレイヤーの頭の2ブロック前から向いてる向きに、すごい速さですっ飛ばすスクリプト部分はこんな感じ
&gt;		SPEED=5
&gt;		x, y, z = self.world_object.position.get()
&gt;		p = Vertex3(x+a*2,y+b*2,z+c*2)
&gt;		a,b,c = self.world_object.orientation.get()
&gt;		a = a * SPEED
&gt;		b = b * SPEED
&gt;		c = c * SPEED
&gt;		self.protocol.world.create_object(Grenade, 3.0, p, None, vertex3(a,b,c), self.grenade_exploded)
&gt;		grenade_packet.value = 3.0
&gt;		grenade_packet.player_id = self.player_id
&gt;		grenade_packet.position = p.get()
&gt;		grenade_packet.velocity = (a,b,c)
&gt;		self.protocol.send_contained(grenade_packet)


***グレネードの着発信管の作り方

グレネードを時間じゃなくて、砲弾みたいにブロックと衝突した瞬間に爆発するようにしたいことは多いはず
そのやり方がこれ
&gt;		grenade = self.protocol.world.create_object(Grenade, 0.0, pos, None, ori, None)	
&gt;		collision = grenade.get_next_collision(UPDATE_FREQUENCY)
&gt;		if collision:
&gt;			impact, x, y, z = collision
弾道計算用仮想グレネードを生成して、弾道を計算させるというもの。
一行目で弾道計算用のダミーグレネード「grenade」を生成（posから、初速oriで投射爆発は起こらない）というもの
二行目でダミーグレネードの弾道上でブロックへの衝突が生じる地点の座標、衝突までの時間を計算
collosionの中身はimpact=衝突までの時間、x,y,z=衝突座標の二点
重要なのは時間。
衝突までの時間がわかったので、それを実際に発射するグレネードの爆発時間にすれば、ちょうど衝突の瞬間に爆発が起こる。

例として、右クリでスコープ除いてるときにVを押すと向いてる向きに着発グレネードが飛んでゆくスクリプト全文を示す。
&gt;	from pyspades.constants import *
&gt;	from pyspades.world import Grenade
&gt;	from pyspades.server import grenade_packet
&gt;	from pyspades.common import Vertex3
&gt;	from pyspades.constants import UPDATE_FREQUENCY
&gt;            
&gt;	SPEED = 1.5
&gt;	def apply_script(protocol,connection,config):
&gt;		class GrenadeConnection(connection):
&gt;			def on_animation_update(self,jump,crouch,sneak,sprint):
&gt;				if sneak and self.world_object.secondary_fire:
&gt;					x, y, z = self.world_object.position.get()
&gt;					pos = Vertex3(x, y, z+1)
&gt;					a,b,c = self.world_object.orientation.get()
&gt;					a = a * SPEED
&gt;					b = b * SPEED
&gt;					c = c * SPEED
&gt;					forward = Vertex3(a, b, c)
&gt;					grenade = self.protocol.world.create_object(Grenade, 0.0, pos, None, forward, None)	
&gt;					collision = grenade.get_next_collision(UPDATE_FREQUENCY)
&gt;					if collision:
&gt;						impact, x, y, z = collision
&gt;					self.protocol.world.create_object(Grenade, impact, pos, None, forward, self.grenade_exploded)
&gt;					grenade_packet.value = impact
&gt;					grenade_packet.player_id = self.player_id
&gt;					grenade_packet.position = pos.get()
&gt;					grenade_packet.velocity = (a,b,c)
&gt;					self.protocol.send_contained(grenade_packet)
&gt;				return connection.on_animation_update(self,jump,crouch,sneak,sprint)
&gt;	   
&gt;		return protocol,GrenadeConnection

あと、これ見てわかるようにグレネード生成のときにはVertex3とかgrenade_packetとかいろいろインポートしなきゃならんので注意
#endregion

***何秒後に動作を起こす系
#region
&gt;	callLater(時間, self.関数, 呼び出す関数の引数)

例
&gt;	def _on_reload(self):
&gt;		if self.weapon == 0 or self.weapon == 1:
&gt;			callLater(0.01, self.reload_after)
&gt;		----略---
&gt;		self.send_contained(weapon_reload)
&gt;		return connection._on_reload(self)
これだとリロード時に武器が0または1（rifleまたはSMG）の時、リロードの0.01秒後に引数なしのreload_afterを実行

例
&gt;	def flight(self, x, y, z):
&gt;		if self.flying:
&gt;			x2, y2, z2 = self.world_object.orientation.get()
&gt;			x += x2
&gt;			y += y2
&gt;			z += z2
&gt;			self.set_location((x, y, z))
&gt;			callLater(0.04, self.flight, x, y, z)
これは
  座標(x,y,z)を引数としてflight関数が読み込まれたとき
    flying が True であれば
      向いてる方向をゲットして、それぞれ三軸x2,y2,z2(-1から1まで)として
      各座標を方向の分だけずらして
      プレイヤーを新たなx,y,zにワープさせて
      0.04秒後に flight関数を x,y,zを引数として呼び起こす
  以下ループ
という意味



使うにはreactorのimportが必要
&gt; from twisted.internet.reactor import callLater

#endregion

***メッセージを表示する関数の使い方
#region
&gt; self.send_chat(&#039;message no naiyou&#039;)
が基本
変数を突っ込む場合はメッセージに%sを入れて、引用符閉じた後に% 変数名　を入れる
&gt; self.send_chat(&#039;You have %s medkit!&#039; % self.medkits)
&gt;     →チャットの内容「You have 3 medkit!」

上記のだと赤い文字で個人にだけ送られるタイプのチャットになる。

青い文字で鯖からのメッセージとして表示する場合はselfとsend_chatの間にprotocolを入れて
&gt;self.protocol.send_chat(&quot;----&quot;)
とすればおｋ

#endregion

***selfとは、connectionとはなんぞや
#region　
スクリプト眺めてるとめっちゃ出てくるこいつらは、変数や関数にくっついて「誰の」という部分を表す。

例えばこの例では(connection)が引数で出てる
コマンド打ってこの関数を呼び出した奴がconnectionになる。
だからconnection.medkits は「コマンド打ったプレイヤー」のmedkitsを表す変数になるし、connection.set_hp()はそいつのHPを変化させる関数になる

&gt;	def medkit(connection):
&gt;	    if connection.medkits and connection.hp &lt; 100:
&gt;	        connection.set_hp(connection.hp + connection.protocol.heal_amount,type = FALL_KILL)
&gt;	        connection.medkits -= 1
&gt;	        connection.send_chat(&#039;You have been healed&#039;)
&gt;	    else:
&gt;	        connection.send_chat(&quot;You don&#039;t have any medkits or have full health!&quot;)

こっちの例ではスポーンしたときに自動で呼び出される関数なのでselfになってる
つまりこの場合、self=スポーンしたプレイヤーとなる。
&gt;	def on_spawn(self, pos):
&gt;		self.medkits = default_medkits
&gt;		self.send_chat(&#039;You have %s medkit!&#039; % self.medkits)
&gt;		return connection.on_spawn(self, pos)
self.medkits = default_medkitsではスポーンしたひとのmedkit所持数にdefault_medkitsを代入している。
self.send_chat()ではselfの人にメッセージを送っている。

引数がconnectionの関数にselfをつけるとエラー吐くし、逆もだめなので引数を見て適当な方をつけましょう。


例えばあるプレイヤー&quot;player&quot;が味方か敵かを判定する場合
&gt;	if player.team == connection.team:
とやるか、
&gt;	if player.team == self.team:
とやるかを判断する場合は、そのdef____()のなかにselfがあるかconnectionがあるかを見て、それをつければいいのである。
#endregion

#endregion


**こんな動作をさせたい！
#region
***動作主の持ってる武器によって動作を変化
#region
&gt;		if self.tool == WEAPON_TOOL:
&gt;			if self.weapon == RIFLE_WEAPON:
&gt;				(ライフル動作)
&gt;			elif self.weapon == SMG_WEAPON:
&gt;				(SMG動作)
&gt;			elif self.weapon == SHOTGUN_WEAPON:
&gt;				(SG動作)



&gt;		if self.tool == WEAPON_TOOL:
は持ってるツールSPADE,BLOCK,WEAPON,GRENADEを判別

&gt;			if self.weapon == RIFLE_WEAPON:
は持ってる武器RIFLE,SMG,SHOTGUNを判別
ショットガンは&quot;SG&quot;じゃなくて&quot;SHOTGUN&quot;って書かないとダメ
全部大文字じゃないとダメ

#endregion

***スポーン時に何か動作をさせたい
#region

&gt;        def on_spawn(self,pos):
&gt;				(させたい動作)
&gt;           	return connection.on_spawn(self,pos)
スクリプトの中にこれがあればこの中に書き込む
無ければ書き足す（インデントの高さに注意）


&gt;        def on_spawn(self,pos):
は、スポーンするときに読み込まれる部分
selfはスポーンするプレイヤー、posはスポーン座標

細かいこと上の方の割り込みについての項目に詳しく書いてあるはず
#endregion


***HPを変化させたい
#region

&gt;					self.set_hp(50)
こう書く
selfの部分はconnectionとかhit_playerとかそのHPを変える対象によっていろいろ変化

変数値を突っ込む場合はfloat型じゃないとまずいようなので注意
よくわからない人はとりあえず変数を&quot;float()&quot;で包めばおｋ
&gt;					self.set_hp(float(x))
#endregion


***右クリでアイアンサイト覗いてるときになんかする系
#region
アイアンサイトなうの状況かどうかを判定するには
&gt; self.world_object.secondary_fire
を使います。ただこれだけだとSPADEで右クリ一気掘りとかしてる時にも判定されちゃう気がするので
&gt; if self.tool == WEAPON_TOOL and self.world_object.secondary_fire:
のようにするといいと思います。

右クリでスコープのぞいた瞬間になんかするなら
&gt; def on_secondary_fire_set(self,secondary):
を使うといいと思います。
これは右クリ押した瞬間に呼び出されるトリガーなので、解除のために右クリ押したときとか別の道具もってるときに右クリ押しても呼び出されてしまうので、いい感じにifとか使ってやるといいと思います。
なお、引数のsecondaryはスコープのぞいてる状態の時にTrueに、解除状態の時にFalseになります。
#endregion


***特定状況下では落下ダメを無効化したい
#region
&gt;        def on_fall(self, damage):
&gt;            if （状況）:
&gt;                return False
&gt;            else:
&gt;                return connection.on_fall(self, damage)
落下時に呼び出されるやつにFalse返せば落下ダメは無視される。
引数damageは落下ダメージ量
#endregion

***プレイヤーの名前を取得したい、IDを取得したい
#region
名前はself.name
ID(#○○)はself.player_id
selfの部分は関数の呼び出した人が入る
#endregion


#endregion





意見や気になることがあったら書いてどうぞ
わからないことを書くと偉い人が加筆してくれるかもしれない
- てすと  -- あ  (2016-08-20 14:48:36)
- 右クリスコープで狙ってるときにVみたいな動作はどうやるの  -- 名無しさん  (2016-09-17 14:02:59)
- ↑on_secondary_fire_set(self,secondary):で検出出来ると思う  -- 名無しさん  (2016-10-18 17:57:24)
- ↑追記。connection.world_object.secondary_fireで静的にも状態を取得できます  -- 名無しさん  (2016-10-18 17:58:13)
#comment    </description>
    <dc:date>2016-12-09T16:24:42+09:00</dc:date>
    <utime>1481268282</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/vipdeaos/pages/44.html">
    <title>スクリプトの作り方（実際のスクリプト構造編）</title>
    <link>https://w.atwiki.jp/vipdeaos/pages/44.html</link>
    <description>
      実際の[[スクリプト]]を例に構造や機能を説明します。
本物は長くて解説がだるいのでサンプルスクリプトです。
VやShiftを押すと数値が加算されて、/testを打つと値がチャットに表示されます。

&gt; from pyspades.constants import *
&gt; from commands import alias,add
&gt; from commands import admin, add, name 
&gt; 
&gt; GLOBAL_HENSUU = 100
&gt; 
&gt; @alias(&#039;test&#039;)			
&gt; @name(&#039;testhyouji&#039;)		
&gt; def testhyouji(connection):
&gt; 	return &quot;V %s , S %s&quot;%(connection.v_count, connection.s_count)
&gt; add(testhyouji)		
&gt; 
&gt; def apply_script(protocol,connection,config):
&gt; 
&gt; 	class TestConnection(connection):
&gt; 		v_count=0
&gt; 		s_count=0	
&gt; 
&gt; 		def test(self):
&gt; 			print self.v_count, self.s_count
&gt; 
&gt; 		def on_spawn(self, pos):
&gt; 			self.v_count =0	   
&gt; 			self.s_count =0
&gt; 			return connection.on_spawn(self, pos)
&gt; 	
&gt; 		def on_animation_update(self, jump, crouch, sneak, sprint):
&gt; 			hensuu=1
&gt; 			if sneak:
&gt; 				self.v_count += GLOBAL_HENSUU
&gt; 				hensuu=3
&gt; 			if sprint:
&gt; 				self.s_count +=1
&gt; 				hensuu=self.s_count
&gt; 			print hensuu
&gt; 			self.test()
&gt; 			return jump, crouch, sneak, sprint
&gt; 
&gt; 	return protocol, TestConnection
&gt; 

スクリプトはこのように
&gt; インポート
&gt; グローバル変数定義
&gt; コマンド関数
&gt; def apply_script
&gt; 　　class ～～Connection:
&gt; 　　　　クラス変数定義
&gt; 　　　　関数
と言う構造をしていることが多い
#image(https://pbs.twimg.com/media/CzD4GtgUAAAq3pJ.jpg)

グローバル変数とは、基本的に変更されることのない定数的な存在。
多くのスクリプトで、鯖缶が設定しやすいように上の方に置いてあることが多い気がする
例えばTOWのスクリプトではテント数をいくつにするか、とかそういう基本的な設定みたいな
あとこの例では1回しか使われてないから関係ないけど、この100みたいな定数がスクリプトないでよく出てくる場合は、グローバル変数にしちゃった方が見やすいし後から変更するときにグローバルの部分一個いじるだけで全部修正できるから楽だったりする。

コマンドの関数は表層に置くことが多い（というか表層に置かないとダメな気がする）

def apply_scriptの中がscriptとしては本番な気がする。def apply_scriptの中にはプレイヤーの動きや鯖の動作がトリガーとなって起動する関数が基本的に入れられる。
def apply_scriptの中にはclass　～～Connectionを入れるパターンと、～～Protocolを入れるパターンと両方入れるパターンなどがある。
どちらを使うかはトリガーとする関数による。

関数間のやり取りをする場合は
&gt; self.test()
と書けばその関数に飛ぶ

コマンドの関数からclass内の関数に飛ばす場合もクラス内同士の時と同様に
&gt; connection.test()
とすればよい

classの中にはクラス変数を置ける。この変数はプレイヤー固有の変数とできるので、上記スクリプトではv_countの前にself.をつけて、誰のv_countであるかを表している。
self.v_countのようなクラス変数は関数をまたいで継続的に使用することができる。
一方def on_animation_update内のhensuuは、関数def on_animation_update内でしか通用しない変数であるので、hennsuuの値をdef testで呼び出すことはできない。もし呼び出したいような場合は引数をつけて
&gt; def test(self, x):
とし、def on_animation_update側でも
&gt; self.test(hensuu)
として送ってやらなければならない    </description>
    <dc:date>2016-12-07T17:41:51+09:00</dc:date>
    <utime>1481100111</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/vipdeaos/pages/43.html">
    <title>ミス</title>
    <link>https://w.atwiki.jp/vipdeaos/pages/43.html</link>
    <description>
      ミスった    </description>
    <dc:date>2016-12-07T16:36:31+09:00</dc:date>
    <utime>1481096191</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/vipdeaos/pages/42.html">
    <title>platform</title>
    <link>https://w.atwiki.jp/vipdeaos/pages/42.html</link>
    <description>
      *platform
ボタンアクション等が可能になる

**設定
[[マップ]]が変わった時に台とボタンの情報を保存する
    SAVE_ON_MAP_CHANGE = True

台とボタンの情報を定期的に自動保存する(分単位、0.0は自動保存無効)
    AUTOSAVE_EVERY = 0.0

**コマンド
(説明の※印は、コマンド実行後に各コマンドの実行対象をシャベルで叩いて選択する必要があることを意味する)

***/platform (/p)
台の作成・設定を行う
この台はplatform[[スクリプト]]で用いられる特別なブロック構造物として扱われる
アクションと無関係の直方体を作りたいだけの場合は、mapmakingtools.pyの/insert等を用いるべきである

-/platform new &lt;ラベル&gt;
名前が&quot;ラベル&quot;の台を作成する
コマンドを実行してからブロックを2つ配置し、再度/platformを実行すると新しい台が出来上がる
配置する2つのブロックは同じ高度でなければならない
「new &lt;ラベル&gt;」なしで実行することもできる(名前は自動的に割り振られる)

-/platform name &lt;ラベル&gt;
台の名前を変更する※

-/platform height &lt;高さ&gt;
台の高さを変更する※

-/platform freeze
台を固定してアクションを無効化する(再度実行すると元に戻る)※

-/platform destroy
台を削除する※
台に接触しているブロックも削除されるので注意

-/platform last
台の選択時に実行すると、最後に選択・作成された台が選択される

台の選択時等に台に向けてスネークキー(V)を押すと、その台の情報が表示される
但し、シャベルを持っている必要がある

***/button (/b)
ボタンの作成・設定を行う
ボタンは/triggerで設定したトリガーが成立する場合に/actionで設定したアクションが実行される。
ボタン作成時のトリガーは「シャベルで叩く」であり、アクションは設定されていない。

-/button new &lt;ラベル&gt;
名前が&quot;ラベル&quot;のボタンを作成する
コマンドを実行してからブロックを1つ配置すると、配置したブロックがボタンになる
「new &lt;ラベル&gt;」なしで実行することもできる(名前は自動的に割り振られる)

-/button name &lt;ラベル&gt;
ボタンの名前を変更する※

-/button toggle
ボタンを無効化する(再度実行すると元に戻る)※

-/button cooldown &lt;時間(秒)&gt;
ボタンアクションの最小間隔を設定する※
デフォルトは0.5秒

-/button destroy
ボタンを削除する※

-/button last
ボタンの選択時に実行すると、最後に選択・作成されたボタンが選択される

***/action (/ac)
ボタンアクションを設定する

以下で「/action add &lt;アクション&gt;」はアクションをボタンに追加する
addの部分をsetとすると、設定されていたアクションを全て削除して新たに設定する
(説明の※※印は、コマンド実行後に台とボタンを順にシャベルで叩いて選択する必要があることを意味する)

-/action add height &lt;height&gt; [speed=0.25] [delay]
台の高さを&quot;height&quot;に変更する※※
speedで台の高さが変更される速さ、delayで変更が始まるまでの時間(秒)を設定する(省略可能)

-/action add raise &lt;amount&gt; [speed=0.25] [delay]
台の高さを&quot;amount&quot;だけ増やす※※
speedで台の高さが変更される速さ、delayで変更が始まるまでの時間(秒)を設定する(省略可能)

-/action add lower &lt;amount&gt; [speed=0.25] [delay]
台の高さを&quot;amount&quot;だけ減らす※※
speedで台の高さが変更される速さ、delayで変更が始まるまでの時間(秒)を設定する(省略可能)

-/action add elevator &lt;height&gt; [speed=0.25] [delay] [wait=3.0]
台の高さを&quot;height&quot;まで変化させ、その後もとの高さに戻る※※
speedで台の高さが変更される速さ、delayで変更が始まるまでの時間(秒)を設定する(省略可能)
またwaitで途中止まっている時間(秒)を設定する(省略可能)

-/action add output [delay]
台の高さを一瞬で１にする。※※
delayで変更が始まるまでの時間（秒）を調整する。(省略可)

-/action add teleport &lt;x y z|where&gt;
&quot;x y z&quot;で示した座標にテレポートする※
「where」を指定すると、あらかじめ/whereコマンドで指定した位置にテレポートする

-/action add chat &lt;text&gt;
チャットにメッセージを送信する※
「&quot;」でメッセージを囲うこともできる

-/action add damage &lt;amount&gt;
実行したプレイヤーに&quot;amount&quot;のダメージを与える※
&quot;amount&quot;に負値を設定すると回復となる

-/action list
ボタンに設定されたアクションを表示する※
表示されるインデックスは次のdelで用いる

-/action del &lt;#|all&gt;
ボタンに設定されたアクションを削除する※
数字でインデックスを指定して削除するか、「all」を指定して全てのアクションを削除する

***/trigger (/t)
ボタンのトリガーを設定する

以下で「/trigger add &lt;アクション&gt;」はアクションをトリガーとしてボタンに追加する
addの部分をsetとすると、設定されていたトリガーを全て削除して新たに設定する
add, set の直後にnotを挿入すると、指定したアクションの否定をトリガーとして設定する
(説明の※※印は、コマンド実行後に台とボタンを順にシャベルで叩いて選択する必要があることを意味する)

/trigger add press
ボタンをシャベルで叩く※

/trigger add distance [radius=3]
ボタンとの距離が&quot;radius&quot;以内※
領域は球状ではなく箱状に捉える必要がある

/trigger add track [radius=3]
ボタンとの距離が&quot;radius&quot;以内※
領域は球状ではなく箱状に捉える必要がある
distanceとは異なり、誰かがこのトリガーを満たしていれば別のプレイヤーに対しては満たしていないと判断される

/trigger add height &lt;height&gt;
台の高さが&quot;height&quot;である※※
別のトリガーと組み合わせて使うべきであろう

-/trigger list
ボタンに設定されたトリガーを表示する※
表示されるインデックスは次のdelで用いる

-/trigger del &lt;#|all&gt;
ボタンに設定されたトリガーを削除する※
数字でインデックスを指定して削除するか、「all」を指定して全てのトリガーを削除する

-/trigger logic &lt;and|or&gt;
複数設定されたトリガーの条件に対して行う論理演算を設定する※
「and」ではすべての条件が満たされる場合、「or」では少なくともどれか1つの条件が満たされる場合にトリガーが成立する
デフォルトでは「and」の状態である

-/trigger quiet
トリガー成立時になる音を消す再度実行すると元に戻る※

***/save
設定した台とボタンの情報を「マップ名_platform.txt」に保存する    </description>
    <dc:date>2016-07-04T20:35:38+09:00</dc:date>
    <utime>1467632138</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/vipdeaos/pages/39.html">
    <title>AA置き場</title>
    <link>https://w.atwiki.jp/vipdeaos/pages/39.html</link>
    <description>
      #aa(){
jisure killed maesure (Headshot)
　────────┐
. 　　　　　　　　　┌─┘
.　　　　　　 ┌─┘
　　　　┌─┘
　┌─┘
　│ 　┌─────┐
　│ 　│　　　　　　　.│
　│ 　│　　　　　　　.│
　└─┼┬┬─┬┬┼･∵.　ﾀｰﾝ
　　　　│└┘　 └┘│
　　　　│　　　　　　　.｜
　　　　┴─────┴
こ、これは乙じゃなくてHeadshotされてるだけなんだから
変な勘違いしないでよね！
}
----
#aa(){
Deuce1 killed Deuce2 (Headshot)

　　　　　　　　　　　　　　　　　　┌─┐
　　　　　　　　　　　　　　　　 ┌┴┐│
　　　　　　　　　　　　　　　┌┘　 ├┘
　　　　　　　　　　　　　 ┌┘　 ┌┘
　　　　　　　　　　　　┌┘　 ┌┘
　　　　　　　　　　 ┌┘　 ┌┘
　　　　　　　　　　 │　 ┌┘
　　　　　　　　　┌┴─┴─────┬─────┬┬─┐
.┌──┬──┤　　　　　　　　　　　 .│　　　　　　　.││　 │
.│　　　├┐　 │　　　　　　　　　　　 .│　　　　　　　.││　 │
.│　　　├┘　 │　　　　　　　　　　　 .├─────┴┴─┘
.│　　　│　　　│　　　　　　　　　　　 │
.│　　　├┐　 │　　　　　　　　　　　 .├─────┬┬─┐
.│　　　├┘　 │　　　　　　　　　　　 .│　　　　　　　 ││　 │
.└──┴──┤　　　　　　　　　　　 .│　　　　　　　 ││　 │
　　　　　　　　　└┬─┬─────┴─────┴┴─┘
　　　　　　　　　　 │　 └┐
　　　　　　　　　　 └┐　 └┐
　　　　　　　　　　　　└┐　 └┐
　　　　　　　　　　　　┌┘　 ┌┘
　　　　　　　　　　 ┌┘　 ┌┘
　　　　　　　　　┌┤　 ┌┘
　　　　　　　　　│└┬┘
　　　　　　　　　└─┘
}
----
#aa(){
　 ┌────────────┐
　 │　　　　　　　　　　　　　　　　　 │
　 │　　　　　　　　　　　　　　　　　 │
　 │　　　　　　　　　　　　　　　　　 │
　 │　　　　　　　　　　　　　　　　　 │
　 ├─_;;-＝=ｪ;､　　 ,,,,,,,,,,,,,,,＿ -─┤　　　／￣￣￣￣￣￣￣￣
　 │　　&quot;-ー:ｪｪヮ;::)　 f&#039;;;_-ｪｪ-ニ　 │　 　|　久々にﾜﾛﾀ
　 │　 ::&#039;&#039;　　￣´.::;i,　 i　`&#039;&#039;￣　　　　│　　 |　こういう事を沢山してた
　 │　　::.　　....:;イ;:&#039;　　l　､　　　　　 │　 ＜　のが昔のAoSなんだよな今の新参は
　 │　ヽ;:...:::／　ﾞ&#039;&#039;&#039;=-=&#039;&#039;&#039;´｀ヽ.　　／ │　　 |　BnSしか知らないから困る
　 │　::ﾞl　 ::´~＝==&#039; &#039;==＝&#039;&#039;`　,il&quot; 　│　　　＼＿＿＿＿＿＿＿＿
　 │　 ::|　､ ::　`::=====::&quot;　,　il. 　　│
─┴─┴────────┴─┴─
}
----
#aa(){
　 ┌────────────┐ 　ﾋﾞｷ 　　:..
　 │　　　　.. .. : : ::ノし ）（::: :.　　　 │　　　　　. : :
　 │　 ::.　 ﾉ（　　 ⌒ｊ（⌒) (:::::::...　 │　 　ﾋﾞｷ : .
　 │　　::　 ⌒. .::: ::: :: .. . .⌒:: :....　 │ 　　　　, : ;
　 │　 　,/＼,,_::..、,;_､_...:::_,,,ノ＼　　│　　　　　: .
　 ├─ _;;: ::: .&quot;&#039;&#039;=:))il（(=&#039;&#039;&quot; . . . ::`─┤　　　　. ::
　 │　　&quot;-ー:ｪｪヮ;::);;;;;f&#039;;;_-ｪｪ-ニ,,. │　　　　 . : :
　 │　 ::::&#039;&#039;_;:&#039;&quot;￣´.::;i;;;;;;i,..`&#039;&#039;￣`:;_　　│　　 ／￣￣￣￣￣￣￣￣￣￣
　 │　　::.　.....:::;イ;:&#039;;;;;;;;;l;;;i､::... . . ...:. │　 ＜そのルールは昨日やっただろう！！
　 │　ヽ;:...::::::/::.ﾞ&#039;&#039;&#039;=-=&#039;&#039;&#039;´｀ヽ::.....:／ │　　 ＼＿＿＿＿＿＿＿＿＿＿
　 │:.:.::ﾞl　 :::i　,-==&#039; &#039;==::、..:i .::,il&quot;.:. │　　　　: . .
　 │　　::|:::.､ ::（┼┼┼┼｝ :::....:il　 │ 　　　　 : : . ..
─┴─┴────────┴─┴─ 　　 :: : . .
}
----
#aa(){
　 ┌────────────┐
　 │　　　　　　　　　　　　　　　　　 │
　 │　　　　　　　　　　　　　　　　　 │
　 │　　　　　　　　　　　　　　　　　 │
　 │　　　　　　　　　　　　　　　　　 │
　 ├─_;;-＝＿　　●,,,,,,,,＿＿ -─┤
　 │　 &quot;- （ ○ ）;::)　 f&#039;;;（ ○ ）ニ　│
　 │　 ::&#039;&#039;　　￣´.::;i,　 i.　`&#039;&#039;￣　　　 │
　 │　　::.　　....:;イ;:&#039;　　l　､　　　　　│
　 │　ヽ;:...:::／　ﾞ&#039;&#039;&#039;=-=&#039;&#039;&#039;´｀ヽ.　　／.│
　 │　::ﾞl　 ::´~　r=&#039; &#039;＝=i.`　　,il.&quot; 　│
　 │　 ::|　､ : :　`::=====::&quot;　,　il　　│
─┴─┴────────┴─┴─
}
----
#aa(){
　　　　　　　 　 　 　|￣￣￣￣￣￣￣￣|￣￣|
　　　　　　 　 　 　　|　　　　　　　　　　　 |　　　|
　　　　　　　　　　　 |＿＿＿＿＿＿＿＿|＿＿|　　　集まるべきurlがスレに無い
───‐─┬┐　　|:/, ﾆ丶　　,r,=-、　　|　　　|
　 ___,,,...-‐&#039;&#039;&quot;|　|　　 | ｨ&#039;｡｀&gt;ｿ { ィ&#039;｡｀&#039;ｧ::..　 |　　　|　　　ただそれだけのことがDeuceにとって
￣7　　　　　|　|　　 l:! ｀~´/　,l、 ￣´ 　 , |　　　|
　 i　　　　　 |　|. 　　ll　　 (､ っ）　　　　 : ,|　　　|　　　恐怖であり、同時に存在の証明でもあった
　.| 　　.|　 　|　| 　 　l　　 ,.,__､　　　　　,:&#039; f|　　　|
　|　　　|　 　|　|　　　l ､ f{二ﾐｧ ,）　　　　{ |　　　|
　|　　　|　 　|　|　　　| ヽ`ー &#039;　: ヽ　　　,_,|　　　|
　　　 　: 　　|　|￣￣￣￣￣￣￣￣￣￣|￣￣￣￣￣|
　　　　 :　 　|　|　　　　　　　　　　　　　　 |　　 ＿＿　　|
::::::::　　　　　|　|　　　　　　　　　　　　　　 |　 ／　／＼ |
::::::::::　　　　 |　|　　　　　　　　　　　　　　 |／　／　／　|
:::::::::::::::|______|__|　　　　　　　　　　　　　／　／　／　　　|
￣￣￣__/.￣/　　　　　　　　　　　　／　／　／　　　　 |
ニ二二i -二ﾆ---､　　　　　　　　／　／　／　　　　　　|
________________ンｰ|.|　　　　　　　／　／　／　　　　　　　 |
　　　　　　　　￣￣￣￣￣￣　
}
----
#aa(){
　　　　　 ＼　　　　　　　　　　　　　　　　　　　　　／
　　　　　　　＼　　　　　　　　　　　　　　　　　　／
　　　　　　　　 ＼　　　　　　　　　　　　　　　／
　　　　　　　　　　＼　　　　　　　　　　　　／
　　　　　　　　　　　 ＼　　　　　　　　　／
　　　　　　　　　　　　　＼∧∧∧∧／
　　　　　　　　　　　　　＜　 　 俺　＞
　　　　　　　　　　　　　＜　予 し　 ＞
　　　　　　　　　　　　　＜　 　 か　＞
─────────＜　感 い　＞──────────
　　　　　　　　　　　　　＜　　　な　＞
　　　　　　　　　　　　　＜　 !!! い　＞
　　　　　　　　　　　　　／∨∨∨∨＼
　　　　　　　　　　 　／　　　┌──┐＼
　　　　　　　　　　／　　　　　|┰┰ ┤　 ＼
　　　　　　　 　／|￣|　　　|￣|──┤　　　＼
　　　　　　　／　 |￣|　　　￣□二.　|　　　　　＼
　　　　　 ／　　　| 　|　　　　 |　　　　|　　　　　　 ＼
　　　 　　　　　|￣　 ￣|　　　凵￣凵
}
----
#aa(){
　　　　　　＼　　　　　　　ヽ 　 　 　 　 　 |　　　　　　 　/　　　　　　　　／
　　　　　　　　　 ＼　　 　 　ヽ　　　　　　　 　 　 　 　/　　　　　　／
‐､、　 　 　 　 殺　伐　と　し　た　ス　レ　に　H a l l w a y　が　！　！　 　 　 _,,－&#039;&#039;
　　｀－､、　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　_,,－&#039;&#039;
　　　　　　｀－､、　　　　　　　　　　　　　　　　　　　　　　　　　　　　　_,,－&#039;&#039;

　　　　　|￣￣￣￣￣￣￣￣＼　　　　　　　　　／￣￣￣￣￣￣￣￣|
　　　　　|　　　　　　　　　　　　　＼　　　　　　／　　　　　　　　　　　　　 |
　　　　　|　　　　　　　　　　　　　　 ＼　　　／　　　　　　　　　　　　　　　|
　　　　　|　　　　　　face　　　　　　　 ＼／　　　　　　　oｆｆ.　　　　　　　 |
　　　　　|　　　　　　　　　　　　　　　　 ／＼　　　　　　　　　　　　　　　　|
　　　　　|　　　　　　　　　　　　　　　／　　　＼　　　　　　　　　　　　　　 |
　　　　　|　　　　　　　　　　　　　 ／　　　　　　＼　　　　　　　　　　　　　|　　　人_人_人_人_人_
───-|＿＿＿＿＿＿＿＿／　　　　　　　　　＼＿＿＿＿＿＿＿＿|　_ノ　　　　　　　　　　 ゝ
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 ）　anticbridge！　（
　　　　_,,－&#039;.　　　　　　　　　　　　　　　　　　　　　　　　　lllll 　lll,｀－､、　　´ヽ　　　　　　　　　　γ
　_,,－&#039;.　,,,,,,,,,,, 　　,,,,,,,,,,,,, 　,,,,,,,,,,,,,, 　,,,,,,,,,,,,　,,,,,,,, 　 ,,,,,,,,　llllll,,,,lllll,,,,,,,｀－､、　 Y⌒Y⌒Y⌒Y⌒Y
　　　　 lll&#039; 　&#039;llll,　lllll　 &#039;&#039;llll ,llll&#039;　 &#039;&#039;llll ,lllll&#039; 　lllll,　lllll　　 &#039;lllll　llllll　lllll　　　　　｀－､、
　　　　 ,,,,,llllllllll　&#039;&#039;llllll,,,,,, 　&#039;&#039;llllll,,,,, 　 ,,,,,,llllllllll　llllll 　　lllll 　llll　 llll
　　　 ,lllll&#039; 　 lllll　,,　 &#039;&#039;&#039;&#039;lllll, ,,　 &#039;&#039;&#039;&#039;lllll,lllll&#039;&#039; 　 lllll　lllll 　 　llll　 llll 　llll
　　　 &#039;lllll,,,,,,,llllll,llllll,,,, ,,,llll&#039; llll,,,, ,,,llll&#039;llllll,,,,,,,llllll,lll&#039;lllll,,,,,,,lllllll,,,,lllll,　lllll,,,,lll&#039;
　　　　 &#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039; &#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039; 　&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039; 　 &#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039; &#039;&#039;&#039;&#039;&#039;&#039; 　&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039; &#039;&#039;&#039;&#039; &#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;　&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;
}
----
#aa(){
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。:::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::。::::::...... ...　　 　　　　　　　:::::::::::::::::::: ..::::: . ..::::::::
:::::::::::::::::...... ....:::::::゜::::::::::..　　|￣￣￣￣￣|::::。:::::::::::::::::　゜.::::::::::::
:. .:::::。:::........　.　.:::::::::::::::::: _ |　　　　　　　 |:::::::::::::。::::::::::: . . . ..::::
:::: :::::::::.....:☆彡::::　　　／./ |-┬┬┬┬-|　 ::::::::::゜:::::::::: ...:: :::::
　:::::::::::::::::: . . . ..: ::::　/　ﾍ ｜└┘└┘　|　:::::::::::.... .... ..　.::::::::::::::
::::::...゜　.　.:::::::::　　／ヽ ﾉ　 |＿＿＿＿＿|.......　.　.::::::::::::........ ..::::
:.... .... ..　.　　　　 く　 /　　　 　三三三∠⌒＞:.... .... ..　.:.... .... ..
:.... .... ..:.... .... ..... .... ..　.:.... .... ..　..... .... ..　..... ............. ..　.　........　......
:.... .|￣￣|　　|￣￣|　 |￣￣|　 |￣￣|　.... .... ..　.:.... .... ..... .... ..　.
... ..:|￣￣|ゝ　|￣￣|ゝ|￣￣|ゝ |￣￣|ゝ無茶しやがって… ..........
....　 i⌒　/ 　 i⌒　/ 　i⌒　/ 　 i⌒　/　..　..... ................... ..　.　...
.. 　 三　 | 　 三　 | 　 三　 | 　 三　|　　... ............. ...........　.　.....
...　 ∪ ∪ 　 ∪ ∪ 　 ∪ ∪ 　∪ ∪　............. ............. ..　........　...
　　三三　　三三　　三三　　　三三
　三三　　三三　　三三　　　三三
}
----
#aa(){
　　　　　　 ＿＿＿＿＿＿
　　　　　　│　　　　　　　.│
　　　　　　│　　　　　　　.│
　　　　　　├┬┬─┬┬┤
　　　　　　│└┘　 └┘│　褒美として製品版AoSを買う権利をやろう
　　　　　　│　　　　　　　.｜　　　　　☆
　　　　　/ヽ､--ー､＿＿,-‐´　＼─／
　　 　／　&gt; 　　ヽ▼●▼&lt;＼　　||ｰ､.
　 　/ ヽ､　　　＼ i　|｡|　|/　 ヽ　(ニ､｀ヽ.
　　.l　　　ヽ 　　　 l　|｡|　| ｒ-､y　｀ﾆ　 ﾉ ＼
　　l　　　　 |　　 　|ー─ | ￣ l 　　｀~ヽ＿ノ＿＿＿_
　　　　　／￣￣￣￣ヽ-&#039;ヽ--&#039;　　／　　 AoS　　 ／|
　　　　.|￣￣￣￣￣￣|／|　　　 |￣￣￣￣￣￣|／| ＿＿＿＿＿＿
　／￣AoS　　　／|　￣|__」／　　　AoS 　　／|￣|__,」＿＿_　　　　／|
　|￣￣￣￣￣|／　　AoS　￣／￣￣￣￣|／　 AoS　　／|　　 ／　.|
　|￣￣￣￣￣|￣￣￣￣￣|／l￣￣￣￣|￣￣￣￣￣|／|　／
　|￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣| 
}    </description>
    <dc:date>2016-07-04T19:52:14+09:00</dc:date>
    <utime>1467629534</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/vipdeaos/pages/41.html">
    <title>和製スクリプト</title>
    <link>https://w.atwiki.jp/vipdeaos/pages/41.html</link>
    <description>
      ヴぃっぱーのつくった[[スクリプト]]群まとめ

* mapmakingtools
[[DL先&gt;http://ux.getuploader.com/aosuploader/download/419/mapmakingtools.py]]
-概要
[[マップ]]作製補助スクリプト

* conv
[[DL先&gt;http://ux.getuploader.com/phoscr/download/30/conv.py]]

* buildtools

* bomb

* iromura    </description>
    <dc:date>2016-06-23T21:42:08+09:00</dc:date>
    <utime>1466685728</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/vipdeaos/pages/17.html">
    <title>とりあえず情報集積所</title>
    <link>https://w.atwiki.jp/vipdeaos/pages/17.html</link>
    <description>
      フォーラムやら何やらから引っ張ってきた情報を、
「ページ作るの面倒だけどとりあえず置いときたい…」
という時に使ってね
----
情報共有所
https://docs.google.com/spreadsheets/d/1Hgo-0e_wh4AxJ194hATXuxK1IBmuNu7JZU5VMAfYzVc/edit?pli=1#gid=1091620321



*wikiより、そのまんま

[[β0.75の情報]]
-[[プレイするまで]]　　　
-[[初心者ガイド]]　　　　　　　－－ここまで内容を整理してメニューに追加
-[[キーコンフィグ]]
プレイガイドbeta
-[[武器(β)]]
-[[建物建設]]
-[[マップ]]
-[[ゲームルール]]
-[[小技、テクニック]]
-[[用語集]]
-[[操作方法]]　　　　　　　　　　　　ここまでコピー完了

-[[サーバーの立て方]]
-[[pyspades]]
-[[config.txt]]
-[[コマンド]]
-[[スクリプト]]
-[[各ゲームモード設定方法]]
-[[script設定]]
-[[スクリプト製作]]
-[[マップ作成]]
-[[エラー・ダイアログ]]
-[[ダウンロード]]
-[[ソフトウェア]]
-[[mod]]
-[[mod製作]]
-[[Modloader]]
-[[プレリリース]]
-[[Q&amp;A　(β0.75、B&amp;S)用]]
-[[過去ログ]]
-[[Q&amp;A]]

----
・スポーン地点の座標に来るのは足じゃなくて頭
・スポーンは0.5単位で調整ができる。+0.5で半分下、-0.5で半分上

/t set distance …誰かが範囲内に入る度に動作
/t set track …誰か一人が範囲内に入ると動作
/t set not distance …範囲内に誰も居なくなると動作
/t set not track…誰かが範囲外に出る度に動作    </description>
    <dc:date>2015-12-11T19:17:03+09:00</dc:date>
    <utime>1449829023</utime>
  </item>
  </rdf:RDF>
