ucchyocean / colorteaming Goto Github PK
View Code? Open in Web Editor NEW扱いにくいスコアボードを簡単に使用できるようにするためのプラグイン。原案はsakusouzu2氏。
扱いにくいスコアボードを簡単に使用できるようにするためのプラグイン。原案はsakusouzu2氏。
フォーラムに要望があった機能。
どちらかチームのキル数が規定数を超えたときに、全体に通知する機能を追加する。
【追加するコマンド】
/ct trophy 30 - いずれかのチームが30キルを達成したときに、下記メッセージを全体通知する。
「redチームは、30キル数を達成しました!」
ただし、/cl コマンドでリーダーが選出されている場合は、本機能は自動で無効になる。
/ct trophy off または /ct trophy 0 - キル数達成時の通知機能をオフにする。
【検討】
デス数、ポイント数(キル数-デス数)でも、同様に通知できそうだが、あまり需要がなさそう・・・?
とりあえず今回は見送りとする。
銃プラグインを使った場合、/cff コマンドでFriendlyFireを防ぐことができるのかどうか、確認をしてみる。
確認1)PVPGunPlus : このプラグインは EntityDamageByEntityEvent を発生させているので、たぶんそのままで cff コマンドで防げる
確認2)CrackShot : このプラグインは、独自に実装してしまっているので、多分防ぐことができない。
フォーラムに要望があった機能。
【コマンド】
/ct reachTrophy (amount) - キル数がamountに達すると、
「redチームが、○キルまでもう少しです!」というメッセージを送信する。
(amount) は、killTrophy より小さくないと、エラーになる。
また、killTrophy が設定されていない場合も、エラーになる。
/ct reachTrophy 0 または /ct reachTrophy off で、本機能をオフにする。
【設定】
killReachTrophy: 0
コマンドの設定値と同様。コマンド実行時に、config.yml にも反映する。
従来の仕様では、autoColorRemove設定をオンにすると、死亡時も、ログアウト時も、チームを離脱する。
仕様です(キリッ)で通していたが、フォーラムでも質問があり、混乱を招いている。
死亡時設定と、ログアウト時設定に分割して、それぞれ独立して設定できるようにしたい。
設定)
colorRemoveOnDeath: 死亡時にグループから離脱
colorRemoveOnQuit: ログアウト時にグループから離脱
従来の autoColorRemove が指定されている場合、colorRemoveOnDeathが指定されているものとみなす。
コマンド)
/colorremove on|off - 死亡時およびログアウト時のチーム離脱オンオフ(従来どおり)
/colorremove death on|off - 死亡時のチーム離脱オンオフ
/colorremove quit on|off - ログアウト時のチーム離脱オンオフ
現在の仕様では、cspawnコマンドを実行したときに、対象グループのユーザー全員に対して、setBedRespawnPointを実行しているだけである。
しかし、これではrcでグループが変更されたときに、毎回 リスポンポイントを新しいグループで再設定しなければならず、誤解を招く上、面倒である。
cspawnはグループのリスポーンポイントをconfig.ymlなどに保存し、そのグループのメンバープレイヤー死亡時に、リスポーンポイントを再設定する必要がある。
なお、検証時にEssentialsとの優先度がどのようになるかを確認する必要がある。
仲間同士の攻撃無効化:
誤)firelyFireDisabler
正)friendlyFireDisabler
なんで今までずっと気付かなかったんでしょうか・・・
全部修正しましょう。
チームチャットのかな文字に反応して、ローマ字をかな文字に変換して、表示する。
オンオフはconfig.yml からのみ指定可能で、オンオフをゲーム内から行うコマンドは提供しない。
【例-変換オフ】
[red] koreha tyanto henkan dekimasuka? dekimasita!
【例-変換オン】
[red] koreha tyanto henkan dekimasuka? dekimasita!(これは ちゃんと へんかん できますか? できました!)
【設定】
通常のチャットをかな文字変換化する。
showJapanizeGlobalChat: false
チームチャットをかな文字変換化する。
showJapanizeTeamChat: true
【サンプル】
https://dl.dropboxusercontent.com/u/34781847/2013-04-23_00.51.09.png
フォーラムにリクエストがあった件。
ログアウト時のチーム離脱を無効に設定、死亡時のチーム離脱を有効に設定した時に、リーダー設定をしている場合にリーダーがログアウトした際従来通り○○チームの大将、○○は逃げ出した!と表示されてしまうのですが、大将も安心してリログできるように変えられないでしょうか・・・
バグです。ごめんなさい。 修正します。
/cchat logOn、 /cchat logOff で、チームチャットのコンソール記録を設定する。
ctpコマンドに、ポイントを登録する機能と、登録したポイントへ転送する機能を追加する。
【既存のコマンド】
/ctp (group) (world) (x) (y) (z) - groupのメンバー全員を、(world):(x),(y),(z) の場所に
テレポートします。 worldは省略可能。
/ctp (group) here - groupのメンバー全員を、コマンドを実行した人の場所にテレポートします。
/ctp (group) spawn - groupのメンバー全員を、グループのリスポーンポイントに
テレポートします。
【新しく追加するコマンド】
/ctp all spawn - 全プレイヤーを、各groupのリスポーンポイントにテレポートします。
ignoreGroupsに所属しているプレイヤーはテレポートしません。
また、リスポーンポイントが登録されていないgroupも
テレポートしません。
/ctp set (point) (world) (x) (y) (z) - (world):(x),(y),(z) の場所を、point という名前の
ポイントで登録します。worldは省略可能。
/ctp set (point) here - コマンドを実行した人の場所を、point という名前のポイントで
登録します。
/ctp remove (point) - pointという名前のポイント登録を削除します。
/ctp (group) (point) - groupのメンバー全員を、point という名前のポイントへテレポートします。
/ctp all (point) - pointという名前のポイントへ、全プレイヤーをテレポートします。
ただし、ignoreGroups のプレイヤーはテレポートしません。
/ctp list - 登録されたポイントをリスト表示します。
【その他の仕様】
登録したポイントは、「plugins/ColorMeTeaming/tppoint.yml」というファイルで管理する。
コンフィグリロードの対象としない(直接ファイルへ書き込んだり、読み込んだりする)。
【要望、やりたいこと】
前回分けたチームを、再度同じチームに振り分けしたい。
【追加するコマンド】
/rc rest - 色が設定されていない人を、現在設定されているグループにランダム割り振りする。
ただし、人数が少ないチームへの割り振りを優先する。
また、色設定が無い人だけでなく、Whiteの人も割り振り対象とする。
/csave [(filename)] - 現在の割り振り内容、チームのキルデス数、個人のキルデス数を、name に保存する
name を省略した場合、 /plugins/ColorMeTeaming/saves/lastdata.yml へ保存する。
/crestore [(filename)] - filename から、チームメンバー、キルデス数をリストアする
name を省略した場合、 /plugins/ColorMeTeaming/saves/lastdata.yml からリストアする。
【その他の仕様】
/rc コマンド実行時に、自動的に /plugins/ColorMeTeaming/saves/lastdata.yml で保存する。
これは、/csave lastdata を実行した場合と同等。
/crestore lastdata で、直前のチーム分けを復元することができるようになる。
大将設定は保存しない。
/cff invisible (on|off) - チームメンバーの透明化を見えるようにする/見えなくする
うまく動くのかどうかは、十分な検証が必要と思われる。
同時に、ColorTeaming.setFriendlyFilre(boolean) は@deprecatedに設定し、今後使用しないこととする。
フォーラムにも報告があった件。
http://forum.minecraftuser.jp/viewtopic.php?f=38&t=9729#p82131
cclassコマンドを連続で呼び出すと、動作が正しくならないのかもしれない。
Essentials Spawn の setspawn 相当のコマンドを、隠しコマンドで実装する
【コマンド】
/cspawn world - コマンドを指定した場所を、指定したワールドの初期リスポーン地点として設定する
【備考】
コマンドは、ゲーム内からしか実行できない。(コンソール実行不可)
念のために、設定だけでもしておきましょうか…
従来は、/rc コマンド(/colorrandomコマンド)の実行時に、ignoreGroupsを除く全てのプレイヤーをチーム分け対象としていたが、config.yml の world で指定されているワールドに居るユーザーのみを対象に変更する。
いわゆる、“生活鯖”といわれるタイプのサーバーで、プラグインを導入するケースに対応するため。
ワールドを分割してイベントをしたい場合、イベントに参加していない人をチーム分けに巻き込まないようにする必要がある。
今は、各プレイヤーが死亡した瞬間(PlayerDeathEvent)に、ベッドリスポーン場所を各グループのリスポーン場所で上書き設定している。
しかしそれだと、グループ抜けた後もそのプレイヤーのリスポーン場所が残ってしまう、という問題がある。
今後は、死んだときのイベントを取得するのではなく、リスポーンするイベント(PlayerRespawnEvent)を取得して、そのプレイヤーのベッドリスポーン場所を変更せずに、グループのリスポーン場所へ飛ばすようにする。
仕様変更後は、
・/ct remove、/ct removeAll コマンドで、リスポーン場所の初期化設定を行っているが、この部分は削除する。
・EssentialsSpawnとは、イベント設定の優先度を確認しておく必要がある。
event.setDeathMessage(event.getDeathMessage().replace(player.getName(), player.getDisplayName() + ChatColor.RESET));
これで行けんじゃね?
面倒なのは、設定ファイルの項目の準備のほうかも。
フォーラムにご意見があった件。
cclassコマンドで、色づけした革装備を配布できるようにして欲しい。
【config.yml の classes: の、従来の記載例】
(アイテムID)^(エンチャントID)-(エンチャントレベル)@(データ値)
【config.yml の classes: の、新仕様案】
(アイテムID)^(エンチャントID)-(エンチャントレベル)@(データ値)$(色値6桁16進数)
【色値6桁16進数】
HTMLとかで指定する、6桁16進数と同じような形式。RGBの順で2桁ずつ指定する。
例)
赤:993333、青:334CB2、黄:E5E533
【classes指定例】
RedLeather:
armor: 298$993333,299$993333,300$993333,301$993333
BlueLeather:
armor: 298$334CB2,299$334CB2,300$334CB2,301$334CB2
YellowLeather:
armor: 298$E5E533,299$E5E533,300$E5E533,301$E5E533
GreenLeather:
armor: 298$667F33,299$667F33,300$667F33,301$667F33
【再現方法】
【問題点】
2. 3. のところで、サイドバーコンポーネントを再構成していない。
そのため、古い red チームのオブジェクトに対して、スコア更新を実施しようとし、Exception が発生する。
【対策】
チームの構成が変更される可能性のある、/ct remove や /ct removeAll、/cjoin (group) は、常にサイドバーを再構成するようにする。
【廃止するコマンド】
/cspawn (group) here - 今後は、/cspawn (group) コマンドで代替してもらう。
【追加するコマンド】
/cspawn (group) [MapName] - マップ名MapNameにおける、グループgroupのリスポーンポイントを登録する。マップ名MapNameは省略可能で、省略した場合は MapName="" とみなす。
/cspawn switch [MapName] - リスポーンポイント設定を、マップ名MapNameに切り替えする。マップ名MapNameは省略可能で、省略した場合は MapName="" とみなす。
【備考】
マップ名は、実際にワールドや領域が存在しなくても、任意に指定可能とする。
マップ名に指定できる文字列は、
「string.matches("[a-zA-Z]{1,10}");」(英字10文字以内)を満たすこと。
【respawn.yml の保存形式】
マップ名が空、またはnullである場合は、チーム名のみをキーとする。
マップ名が設定されている場合は、「(チーム名)-(マップ名)」の形式をキーとする。
例1)チーム red、マップ指定なし:「red」がキー
例2)チーム blue、マップ指定 lunasys:「blue-lunasys」がキー
【終了条件(案)】
キル数達成、大将キル達成、他チーム全滅、設定時間経過
例)50キル達成、10分経過 など
終了条件は、同時に1つしか設定できない。(15キル達成または大将キル達成、のような設定はできない)
【終了時】
指定したゲーム終了条件を満たすと、全員を初期リスポーン地点にTPする。
TP時に死亡している人は、リスポーン時に初期リスポーン地点に移動する。
【制約条件】
下記の制約条件を設定する。
・キル数達成 を設定するには、killTrophy を事前に設定しておく必要がある。
(killTrophyが、終了条件値になる。)
・他チーム全滅 を設定するには、colorRemoveOnDeath をtrueに設定しておく必要がある。
(死亡時にチーム離脱しないと、ずっと全滅しないから。)
・設定時間経過 も同様。別途用意するコマンドで、経過時間を設定しておく必要がある。
(用意するコマンドはTBD)
※その他、気付いたら追記する予定。
コマンドは、「/cc all」、または、「/cc say all」、とする。
DelayedTeleportTask を実装し、多人数のテレポートを遅延付きで実行する。
遅延量はconfig.yml の teleportDelay で設定可能とし、tick単位で指定できる。
デフォルトは 3 tick。1人テレポートするごとに3tick待つ。20人いたら、60tick(=3秒)かかることになる。
ColorTeaming v1.5.3 で再現する。
worldSpawn 設定は false であるにもかかわらず、既定のリスポーン地点が 0, 65, 0 になってしまう。
player.getKiller() が null の場合、PlayerDeathListenerクラス内での処理が途中で終了するため、autoColorRemove設定が適用されず、グループ設定が残ったままになる。
https://github.com/ucchyocean/ColorMeTeaming/blob/master/src/main/java/com/github/ucchyocean/cmt/listener/PlayerDeathListener.java
現在の、/cchat opCopyOn、/cchat opCopyOff が、すごくわかりにくい!
/cchat opon、/cchat opoff とかじゃダメかい?
→ opon、opoff も追加しよう。一応、既存の opcopyon、opcopyoff もとっとく。
cclass hand コマンドの実行結果表示にミスがあり、「耐久消耗度」(Durability)と、「染色」(Color)の順序が逆になっている。
そのため、染色して耐久度を消耗した革装備のIDを cclass hand で調べて、そのIDをconfig.yml に設定すると、cclass コマンド実行時に正規表現のパースエラーで、正しく実行されなくなる。
というか、今まで無くて、不便はなかったのだろうか・・・
【既存のコマンド】
/cspawn (group) (world) (x) (y) (z) - group のリスポーンポイントを、(x, y, z) に設定する。
/cspawn (group) here - group のリスポーンポイントを、コマンド実行者の場所に設定する。
【新しく追加するコマンド】
/cspawn remove (group) - group のリスポーンポイントを削除する。
/cspawn remove all - 全てのグループリスポーンポイントを削除する。
/cspawn list - 全てのグループリスポーンポイントをリスト表示する。
設定されたワールドにのみ影響があるようにして、複数ワールド運営しているサーバーでの動作時に、他のワールドに影響がでないようにする。
設定値は、
world: 'world'
のようにする。(String)
フォーラムに報告があった件。
http://forum.minecraftuser.jp/viewtopic.php?f=38&t=9729#p82131
Command Signs というプラグインで、「/cclass <name> Knight」などのように、cclass コマンドを登録して実行すると、アイテムが見えないことがある。
ただし、インベントリを開き、下段の9個のアイテム欄をクリックすると、全て現れる。
Command Sings - http://dev.bukkit.org/server-mods/command-signs/
issue #42 で修正されきっていない例外パターンがあるようだ。
スタックトレースは次のとおり。
17:27:55 [SEVERE] null
org.bukkit.command.CommandException: Unhandled exception executing command 'ct' in plugin ColorTeaming v1.5.5
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46)
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:189)
at org.bukkit.craftbukkit.v1_5_R2.CraftServer.dispatchCommand(CraftServer.java:523)
at net.minecraft.server.v1_5_R2.PlayerConnection.handleCommand(PlayerConnection.java:966)
at net.minecraft.server.v1_5_R2.PlayerConnection.chat(PlayerConnection.java:884)
at net.minecraft.server.v1_5_R2.PlayerConnection.a(PlayerConnection.java:841)
at net.minecraft.server.v1_5_R2.Packet3Chat.handle(Packet3Chat.java:44)
at net.minecraft.server.v1_5_R2.NetworkManager.b(NetworkManager.java:292)
at net.minecraft.server.v1_5_R2.PlayerConnection.d(PlayerConnection.java:110)
at net.minecraft.server.v1_5_R2.ServerConnection.b(SourceFile:35)
at net.minecraft.server.v1_5_R2.DedicatedServerConnection.b(SourceFile:30)
at net.minecraft.server.v1_5_R2.MinecraftServer.r(MinecraftServer.java:580)
at net.minecraft.server.v1_5_R2.DedicatedServer.r(DedicatedServer.java:225)
at net.minecraft.server.v1_5_R2.MinecraftServer.q(MinecraftServer.java:476)
at net.minecraft.server.v1_5_R2.MinecraftServer.run(MinecraftServer.java:409)
at net.minecraft.server.v1_5_R2.ThreadServerApplication.run(SourceFile:573)
Caused by: java.lang.IllegalStateException: Unregistered scoreboard component at org.bukkit.craftbukkit.v1_5_R2.scoreboard.CraftScoreboardComponent.checkState(CraftScoreboardComponent.java:13)
at org.bukkit.craftbukkit.v1_5_R2.scoreboard.CraftObjective.unregister(CraftObjective.java:98)
at com.github.ucchyocean.ct.scoreboard.SidebarScoreDisplay.remove(SidebarScoreDisplay.java:186)
at com.github.ucchyocean.ct.ColorTeaming.removeSidebar(ColorTeaming.java:451)
at com.github.ucchyocean.ct.command.CTeamingCommand.onCommand(CTeamingCommand.java:60)
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
... 15 more
あまり、必要無いかもだけど...
コマンドは、「/ctp (group) spawn」 とする。
例)/ctp red spawn
当然ながら、cspawnでグループのスポーンポイントを指定していない場合は、エラー表示で終了する。
※やらなきゃいけなかったけど、すっかり忘れてた......
スコアボードの、BelowName相当の機能を提供する。
コマンド仕様は、/ct list とまったく同じにする。
【コマンド仕様】
/ct below (kill|death|health|point|clear)
【実際の表示(案)】
kill : ○kill
https://dl.dropboxusercontent.com/u/34781847/2013-05-04_23.15.10.png
death : ○death
https://dl.dropboxusercontent.com/u/34781847/2013-05-04_23.14.23.png
health : ○ / 20
https://dl.dropboxusercontent.com/u/34781847/2013-05-04_23.15.47.png
point : ○point
https://dl.dropboxusercontent.com/u/34781847/2013-05-04_23.15.17.png
フォーラムに要望があった機能。
一般プレイヤーが、グループへの参加を行うコマンド。
【コマンド 一般プレイヤー用】
コマンドは colorjoin、短縮形は cjoin、
パーミッションノードは colorteaming.join、デフォルトは全プレイヤーとする。
/cjoin - 現在存在するグループ(ignoreGroupsを除く)のうち、人数の少ないグループへ参加する。
最小の人数のグループが複数ある場合、いずれかがランダムに選択される。
/cjoin random - /cjoin と同様。
/cjoin (color) - 指定のグループへ参加する。
【コマンド 管理者用】
/ct allowJoinAny (on|off) - 一般プレイヤーの「/cjoin (color)」コマンドの使用許可の可否を設定する。
デフォルトは off とする。
/ct allowJoinRandom (on|off) - 一般プレイヤーの「/cjoin」コマンドの使用許可の可否を設定する。
デフォルトは on とする。
【設定ファイル】
config.yml に下記の項目を追加する。意味は、/ct allowJoinAny (on|off) 、/ct allowJoinRandom (on|off) と一緒。
allowPlayerJoinAny: false
allowPlayerJoinRandom: true
【コマンド形式】
/cclass hand
手に持っているアイテムのIDを解析して、config.yml に書ける形式にして、画面に表示する。
表示例
https://dl.dropbox.com/u/34781847/2013-03-23_06.17.15.png
【再現方法】
teamChatMode が true
showJapanizeGlobalChat が true
showJapanizeTeamChat が true
チームに所属している人のチャット発言内容が、Japanize変換後も2バイトコードが含まれない
この条件を満たすと、Japanize変換が2回実行される。
【バグの原因】
chat のリスナーで、グローバルチャット用処理部分が、
チームチャットの場合も通過するケースがあり、
2回重複してJapanize変換処理が実行される。
https://github.com/ucchyocean/ColorTeaming/blob/master/src/main/java/com/github/ucchyocean/ct/listener/PlayerChatListener.java#L44
Japanize変換処理を、if文の中に入れることで、対処可能。
フォーラムに要望があった件
チームメンバーの持ち物を上書きせずに、アイテムをインベントリへ追加する。
【コマンド案】
/cgive (チーム名) (アイテムID) - 指定したアイテムを配布
/cgive (チーム名) hand - 自分が手に持っているアイテムを配布
【副案(ボツ)】
/cgive (チーム名) exp set (数値) - 経験値を指定した値に設定
/cgive (チーム名) exp add (数値) - 経験値を指定した値ぶん追加
PlayerRespawnEvent のときに、ColorMeのremoveを実行したとき、TagAPI.refresh() がExceptionになるようだ。
コマンドは、「/cclass all (class)」 とする。
例)/cclass all Knight
進入不可領域を設定できるようにしたが、外から矢を放って当てれてしまう、という穴がある...
新しいコマンド、cexplodeを追加する。
していされたプレイヤーまたはグループは、爆発して死ぬ。
負けチームの残党処理用。。。というか、爆発オチ用。
爆発はエフェクトのみにして、ワールドを破壊しない
余裕があったら、派生で /cthunder なんてのも考えたい
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.