実際のスクリプトを例に構造や機能を説明します。
本物は長くて解説がだるいのでサンプルスクリプトです。
VやShiftを押すと数値が加算されて、/testを打つと値がチャットに表示されます。
from pyspades.constants import *
from commands import alias,add
from commands import admin, add, name
GLOBAL_HENSUU = 100
@alias('test')
@name('testhyouji')
def testhyouji(connection):
return "V %s , S %s"%(connection.v_count, connection.s_count)
add(testhyouji)
def apply_script(protocol,connection,config):
class TestConnection(connection):
v_count=0
s_count=0
def test(self):
print self.v_count, self.s_count
def on_spawn(self, pos):
self.v_count =0
self.s_count =0
return connection.on_spawn(self, pos)
def on_animation_update(self, jump, crouch, sneak, sprint):
hensuu=1
if sneak:
self.v_count += GLOBAL_HENSUU
hensuu=3
if sprint:
self.s_count +=1
hensuu=self.s_count
print hensuu
self.test()
return jump, crouch, sneak, sprint
return protocol, TestConnection
スクリプトはこのように
インポート
グローバル変数定義
コマンド関数
def apply_script
class ~~Connection:
クラス変数定義
関数
と言う構造をしていることが多い
グローバル変数とは、基本的に変更されることのない定数的な存在。
多くのスクリプトで、鯖缶が設定しやすいように上の方に置いてあることが多い気がする
例えばTOWのスクリプトではテント数をいくつにするか、とかそういう基本的な設定みたいな
あとこの例では1回しか使われてないから関係ないけど、この100みたいな定数がスクリプトないでよく出てくる場合は、グローバル変数にしちゃった方が見やすいし後から変更するときにグローバルの部分一個いじるだけで全部修正できるから楽だったりする。
コマンドの関数は表層に置くことが多い(というか表層に置かないとダメな気がする)
def apply_scriptの中がscriptとしては本番な気がする。def apply_scriptの中にはプレイヤーの動きや鯖の動作がトリガーとなって起動する関数が基本的に入れられる。
def apply_scriptの中にはclass ~~Connectionを入れるパターンと、~~Protocolを入れるパターンと両方入れるパターンなどがある。
どちらを使うかはトリガーとする関数による。
関数間のやり取りをする場合は
self.test()
と書けばその関数に飛ぶ
コマンドの関数からclass内の関数に飛ばす場合もクラス内同士の時と同様に
connection.test()
とすればよい
classの中にはクラス変数を置ける。この変数はプレイヤー固有の変数とできるので、上記スクリプトではv_countの前にself.をつけて、誰のv_countであるかを表している。
self.v_countのようなクラス変数は関数をまたいで継続的に使用することができる。
一方def on_animation_update内のhensuuは、関数def on_animation_update内でしか通用しない変数であるので、hennsuuの値をdef testで呼び出すことはできない。もし呼び出したいような場合は引数をつけて
def test(self, x):
とし、def on_animation_update側でも
self.test(hensuu)
として送ってやらなければならない
最終更新:2016年12月07日 17:41