10月 202013
 

今月中にプロバイダを変更するため、一時的に当ブログなど各種ウェブサービスにアクセス出来ない状態になります。ご了承ください。

ビッグローブは障害が多すぎるのと、サポートがあまりにずさんなので二度と利用しません。
http://megalodon.jp/2013-1020-2340-07/support.biglobe.ne.jp/info/shogaiap/broadband.html

 Posted by at 11:46 PM
9月 202013
 

Sourcemodでコーディングするときはround_startなどのゲームイベントをフックして処理を行うという書き方が一般的です。
ゲームイベントはこのページで見ることができます。
このリンクを見てもらうと分かると思うのですが、warmup_startとかwarmup_endのようなウォームアップに関するイベントが存在しません。

というわけでウォームアップ終了を検知するためには別の手段を取る必要があります。
OnMapStartイベントでmp_warmuptimeの秒数分のタイマーを作ってあげれば動くと思ったのですが、MapStartイベントにバグがあるため実用的ではありませんでした。(このMapStartのバグがDEMOをクラッシュさせる原因にもなってます。昨年Valveに報告しましたが未だに修正されていません)

なにかいい感じに使えるものがないかと思って、CS:GOのネットコードをキャプチャしてみたところNetProps内にウォームアップを制御している部分を発見しました

CCSGameRulesProxy
m_bWarmupPeriod (int)
m_fWarmupPeriodEnd (float)

というわけで以下の様にコーディングすることでウォームアップの状態を取得することができます

//GameRules_GetPropを使用するためにはsdktoolsをインクルードする必要があります
//1 = ウォームアップ中 0 = ウォームアップ終了
GameRules_GetProp("m_bWarmupPeriod")

ウォームアップ終了時に「warm up end」と表示するためには以下のようにコーディングします

#include<sourcemod>
#include<sdktools>

new bool:IsWarmUp=true;

public OnPluginStart()
{
	HookEvent("round_start",ev_round_start);
}

public OnMapStart()
{
    IsWarmUp=true;
}

public Action:ev_round_start(Handle:event, const String:name[], bool:dontBroadcast)
{
    if(IsWarmUp)
    {
        if(GameRules_GetProp("m_bWarmupPeriod")==0)
        {
            IsWarmUp=false;
            PrintToChatAll("warm up end");
        }
    }
}

ウォームアップを制御している部分さえ見つけてしまえばスマートなコードでウォームアップイベントを制御できますね!

 Posted by at 10:04 PM