Sourecemod
Sourcepawn
TF2

Sourcemod [TF2]ゲームモードを判定する方法

マップのタイプを知りたい

前置き

ゲームモードごとに違う動作をさせるために今がなんのルールなのかを判定したかった
で、KOTH、PL、PLR、CTFはマップ名で判断が付くが コントロールポイントと攻撃防衛マップは同じcp_...なのでマップ名からの判断ができない。

まぁ、ゲームモード格納されてるデータあるでしょ?って思って探したが使い物にならないものばかり(cp_...マップだと同じ値が出てしまう)

本題

俺がちゃんと探してないだけかもしれんけど、見つからなかったので他の方法を考えました
その方法は

1.マップ名に"cp_"が含まれている
2.コントロールポイントがある
3.コントロールポイントはすべて赤チームの所属である

といった流れです、当然ながらマップ開始直後に判定しないとだめです(青チームが占領するから)

ソースコード

sourcemod.sp
public int GetMapType()
{
    //マップの名前を取得
    GetCurrentMap(MapName,255);
    //...に「PL」が含まれる
    if(StrContains(MapName,"pl_",false) != -1)
    {
        return 0;
    }
    //...に「KOTH」が含まれる ...に「event」が含まれない
    if(StrContains(MapName,"koth_",false) != -1 && StrContains(MapName,"event",false) == -1 )
    {
        return 1;
    }
    //...に「KOTH」が含まれる
    if(StrContains(MapName,"koth_",false) != -1)
    {
        return 2;
    }
    //...に「CP」が含まれる
    if(StrContains(MapName,"cp_",false) != -1)
    {
        new iTeam;
        new iEnt = -1;
        //CPを検索
        while ((iEnt = FindEntityByClassname(iEnt, "team_control_point")) != -1)
        {
            //見つかったらそれが青チームか検証
            iTeam = GetEntProp(iEnt, Prop_Send, "m_iTeamNum");
            if (iTeam != 2)
            {
                return 3;//青チームのCPが見つかったのでこれは普通のCP
            }
        }
        return 4;//すべて赤チームのCPだったら攻撃/防衛マップである
    }
        //...に「ctf」が含まれる
    if(StrContains(MapName,"ctf_",false) != -1)
    {
        return 5;
    }
    //...に「plr」が含まれる
    if(StrContains(MapName,"plr_",false) != -1)
    {
        return 6;
    }

    return 0;
}

これでOK、もっといい方法知ってる人いたら教えてください

もしSourcemodに興味を持ったら、ぜひwikiを訪れてみてくださいね
日本人MOD作者が指で数えられるほどしかいないので...