Raised This Month: $51 Target: $400
 12% 

Spy Disguise: Sentry *Beta*


Post New Thread Reply   
 
Thread Tools Display Modes
TheSpyHunter
Senior Member
Join Date: Jul 2009
Old 09-25-2009 , 07:58   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #11

Yep, as long as you have the relevant things to compile - RMF etc

Just open the .sp file and edit the model name.

You may also want to change the sounds to something different ;)
__________________
TheSpyHunter is offline
PenguinPrince
SourceMod Donor
Join Date: Jul 2006
Old 09-26-2009 , 23:00   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #12

I have the RMF files and when i go to change the model and the sounds i get a compile error 010. <_< however if i leave the sounds be or leave the model be it will compile. I checked several times to see if i might have misspelled something(common mistake with me) and I had not.
PenguinPrince is offline
(NW)Shane O' D
BANNED
Join Date: Aug 2009
Location: Ireland
Old 09-27-2009 , 10:33   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #13

Quote:
Originally Posted by PenguinPrince View Post
I have the RMF files and when i go to change the model and the sounds i get a compile error 010. <_< however if i leave the sounds be or leave the model be it will compile. I checked several times to see if i might have misspelled something(common mistake with me) and I had not.
I had this problem too,fixed it though
If there is a red line in pawn studio thats the line the errors in.
For me,the error was on the first line.
The problem for me is,when i changed the model and sounds...the plugin doesnt do ANYTHING after compiling

Last edited by (NW)Shane O' D; 09-27-2009 at 15:26.
(NW)Shane O' D is offline
PenguinPrince
SourceMod Donor
Join Date: Jul 2006
Old 09-27-2009 , 13:31   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #14

Quote:
Originally Posted by (NW)Shane O' D View Post
I had this problem too,fixed it though
If the is a red line in pawn studio thats the line the errors in.
For me,the error was on the first line.
The problem for me is,when i changed the model and sounds...the plugin doesnt do ANYTHING after compiling
omg i <3 you i was half asleep and didn't think to run through the code, i have no error now but I am getting the same thing as you where it just wont do anything after compiled.
PenguinPrince is offline
(NW)Shane O' D
BANNED
Join Date: Aug 2009
Location: Ireland
Old 09-28-2009 , 17:37   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #15

any idea spyhunter?
i gave you +karma
(NW)Shane O' D is offline
TheSpyHunter
Senior Member
Join Date: Jul 2009
Old 09-29-2009 , 07:22   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #16

Can I take a look at what you have made?

For some reason the version I have just stopped working.
__________________
TheSpyHunter is offline
(NW)Shane O' D
BANNED
Join Date: Aug 2009
Location: Ireland
Old 09-29-2009 , 11:34   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #17

Quote:
Originally Posted by TheSpyHunter View Post
Can I take a look at what you have made?

For some reason the version I have just stopped working.
Here it is:

Code:
/////////////////////////////////////////////////////////////////////
// Changelog
/////////////////////////////////////////////////////////////////////
// 2009/09/05 - 0.0.1
// ・サーバーに入って最初の復活の際、画面が観戦モードのようになるのを修正

/////////////////////////////////////////////////////////////////////
//
// インクルード
//
/////////////////////////////////////////////////////////////////////
#include <sourcemod>
#include <sdktools>
#include <tf2>
#include <tf2_stocks>
#include "rmf/tf2_codes"
#include "rmf/tf2_events"

/////////////////////////////////////////////////////////////////////
//
// 定数
//
/////////////////////////////////////////////////////////////////////
#define PL_NAME "Spy Jutsu"
#define PL_DESC "Spy Jutsu"
#define PL_VERSION "0.0.1"
#define PL_TRANSLATION "spyjutsu.phrases"

#define MDL_DISGUISE "models/buildables/dispenser.mdl"

#define SOUND_SPAWN_Disguise "player/pl_impact_stun.wav"
#define SOUND_CHARGE_POWER "ui/item_acquired.wav"
#define SOUND_NO_POWER "weapons/medigun_no_target.wav"

#define EFFECT_Disguise_SPAWN_SMOKE "Explosion_Smoke_1"
#define EFFECT_Disguise_SPAWN_FLASH "Explosion_Flash_1"

/////////////////////////////////////////////////////////////////////
//
// MOD情報
//
/////////////////////////////////////////////////////////////////////
public Plugin:myinfo = 
{
    name = PL_NAME,
    author = "RIKUSYO",
    description = PL_DESC,
    version = PL_VERSION,
    url = "http://ameblo.jp/rikusyo/"
}


/////////////////////////////////////////////////////////////////////
//
// グローバル変数
//
/////////////////////////////////////////////////////////////////////
new Handle:g_ChargeTime = INVALID_HANDLE;                        // ConVarチャージ時間

new g_DisguiseModel[MAXPLAYERS+1] = -1;            // モデル
new g_IsDisguiseActive[MAXPLAYERS+1] = -1;        // 樽の中?
new Handle:g_HideVoicehTimer[MAXPLAYERS+1] = INVALID_HANDLE;    // ボイスタイマー
new Handle:g_PowerChargeTimer[MAXPLAYERS+1] = INVALID_HANDLE;    // パワーチャージタイマー
new String:SOUND_START_VOICE[5][64];                            // 隠れ開始ボイス
new String:SOUND_HIDE_VOICE[5][64];                                // 隠れボイス
new String:SOUND_UNHIDE_VOICE[5][64];                            // 登場ボイス
new HideVoiceCount = 0;                                            // ボイスカウント
new g_NowHealth[MAXPLAYERS+1] = 0;                                 // 現在のヘルス
new Float:g_NextUseTime[MAXPLAYERS+1] = 0.0;                     // 次に使えるようになるまでの時間

/////////////////////////////////////////////////////////////////////
//
// イベント発動
//
/////////////////////////////////////////////////////////////////////
stock Action:Event_FiredUser(Handle:event, const String:name[], any:client=0)
{
    // プラグイン開始
    if(StrEqual(name, EVENT_PLUGIN_START))
    {
        // 言語ファイル読込
        LoadTranslations(PL_TRANSLATION);

        // コマンド作成
        CreateConVar("sm_rmf_tf_spyjutsu", PL_VERSION, PL_NAME, FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
        g_IsPluginOn = CreateConVar("sm_rmf_allow_spyjutsu","1","Enable/Disable (0 = disabled | 1 = enabled)");
        
        // ConVarフック
        HookConVarChange(g_IsPluginOn, ConVarChange_IsPluginOn);
        
        g_ChargeTime = CreateConVar("sm_rmf_spyjutsu_charge_time","0.0", "Power charge time (1.0-60.0)");
        HookConVarChange(g_ChargeTime, ConVarChange_ChargeTime);
        
        // 回復棚にタッチ
//        HookEntityOutput("func_regenerate",  "OnStartTouch",    EntityOutput_StartTouch);
    
        // アビリティクラス設定
        CreateConVar("sm_rmf_spyjutsu_class", "1", "Ability class");
        
        // 隠れボイス
        SOUND_HIDE_VOICE[0] = "weapons/dispenser_idle.wav";
        SOUND_HIDE_VOICE[1] = "weapons/dispenser_idle.wav";
        SOUND_HIDE_VOICE[2] = "weapons/dispenser_idle.wav";
        SOUND_HIDE_VOICE[3] = "weapons/dispenser_idle.wav3";
        SOUND_HIDE_VOICE[4] = "weapons/dispenser_idle.wav";
        // 登場ボイス
        SOUND_UNHIDE_VOICE[0] = "vo/spy_laughlong01.wav";
        SOUND_UNHIDE_VOICE[1] = "vo/spy_laughhappy01.wav";
        SOUND_UNHIDE_VOICE[2] = "vo/spy_laughhappy02.wav";
        SOUND_UNHIDE_VOICE[3] = "vo/spy_laughhappy03.wav";
        SOUND_UNHIDE_VOICE[4] = "vo/spy_laughevil01.wav";
        // 隠れ開始ボイス
        SOUND_START_VOICE[0] = "weapons/dispenser_generate_metal.wav";
        SOUND_START_VOICE[1] = "weapons/dispenser_generate_metal.wav";
        SOUND_START_VOICE[2] = "weapons/dispenser_generate_metal.wav";
        SOUND_START_VOICE[3] = "weapons/dispenser_generate_metal.wav";
        SOUND_START_VOICE[4] = "weapons/dispenser_generate_metal.wav";

    }
    // プラグイン初期化
    if(StrEqual(name, EVENT_PLUGIN_INIT))
    {
        // 初期化が必要なもの
        new maxclients = GetMaxClients();
        for (new i = 1; i <= maxclients; i++)
        {
            // モデル削除
            DeleteModel(client)
            
            
        }
    }
    // プラグイン後始末
    if(StrEqual(name, EVENT_PLUGIN_FINAL))
    {
        // 初期化が必要なもの
        new maxclients = GetMaxClients();
        for (new i = 1; i <= maxclients; i++)
        {
            // モデル削除
            DeleteModel(client)
        }
    }
    
    // マップスタート
    if(StrEqual(name, EVENT_MAP_START))
    {
        // エフェクト先読み
        PrePlayParticle(EFFECT_Disguise_SPAWN_SMOKE);
        PrePlayParticle(EFFECT_Disguise_SPAWN_FLASH);

        // モデル読み込み
        PrecacheModel(MDL_DISGUISE, true);
        
        //サウンド読み込み
        PrecacheSound(SOUND_SPAWN_Disguise, true);
        PrecacheSound(SOUND_CHARGE_POWER, true);
        PrecacheSound(SOUND_NO_POWER, true);
        for( new i = 0; i < 5; i++)
        {
            PrecacheSound(SOUND_HIDE_VOICE[i], true);
            PrecacheSound(SOUND_UNHIDE_VOICE[i], true);
            PrecacheSound(SOUND_START_VOICE[i], true);
        }
        
        // 初期化が必要なもの
        new maxclients = GetMaxClients();
        for (new i = 1; i <= maxclients; i++)
        {
            // モデル削除
            DeleteModel(client)
        }
        
    }
    

    // ゲームフレーム
    if(StrEqual(name, EVENT_GAME_FRAME))
    {
        new maxclients = GetMaxClients();
        for (new i = 1; i <= maxclients; i++)
        {
            FrameAction(i);
        }
    }

    
    // プレイヤーリセット
    if(StrEqual(name, EVENT_PLAYER_DATA_RESET))
    {
        // 速度戻す
        TF2_SetPlayerDefaultSpeed(client);

        // 次に使えるまでの時間リセット
        g_NextUseTime[client] = 0.0;
        
        // ボイスタイマー停止
        if(g_HideVoicehTimer[client] != INVALID_HANDLE)
        {
            KillTimer(g_HideVoicehTimer[client]);
            g_HideVoicehTimer[client] = INVALID_HANDLE;
        }
        
        // パワーチャージタイマー停止
        if(g_PowerChargeTimer[client] != INVALID_HANDLE)
        {
            KillTimer(g_PowerChargeTimer[client]);
            g_PowerChargeTimer[client] = INVALID_HANDLE;
        }
        
        // ボイスカウントリセット
        HideVoiceCount = 0;
        
        // 現在のヘルス保存
        g_NowHealth[client] = GetClientHealth(client);
        
        // 見える
        SetPlayerRenderHide(client, false);

        // 視点を戻す
        //SetClientViewEntity(client, client);
        //SetEntProp(client, Prop_Send, "m_iObserverMode", 0);

        // モデル削除
        DeleteModel(client);
        
        
        // 説明文
        if( TF2_GetPlayerClass( client ) == TFClass_Spy)
        {
            Format(g_PlayerHintText[client][0], HintTextMaxSize , "%T", "DESCRIPTION_0_SPYJUTSU", client);
            Format(g_PlayerHintText[client][1], HintTextMaxSize , "%T", "DESCRIPTION_1_SPYJUTSU", client);
        }
        
    }
    

    // プレイヤーダメージ
    if(StrEqual(name, EVENT_PLAYER_DAMAGE))
    {
        // パイロ
        if( TF2_GetPlayerClass( client ) == TFClass_Spy )
        {
            // 樽の中に入っている
            if(g_IsDisguiseActive[client])
            {
                // 食らったダメージ取得
                new damage = g_NowHealth[client] - GetEventInt(event, "health");
                
                // 50以上のダメージを受けたら解除
                if( damage > 50 )
                {
                    // ボイスタイマー停止
                    if(g_HideVoicehTimer[client] != INVALID_HANDLE)
                    {
                        KillTimer(g_HideVoicehTimer[client]);
                        g_HideVoicehTimer[client] = INVALID_HANDLE;
                    }

                    // 見える
                    SetPlayerRenderHide(client, false);

                    // 視点を戻す
                    SetEntProp(client, Prop_Send, "m_iObserverMode", 0);

                    // モデル削除
                    DeleteModel(client);
                    
                    // 速度戻す
                    TF2_SetPlayerDefaultSpeed(client);
        
                    // 次に使用可能になるまでの時間設定
                    g_NextUseTime[client] = GetGameTime() + GetConVarFloat(g_ChargeTime);
                                
                    // パワーチャージタイマー発動
                    if(g_PowerChargeTimer[client] != INVALID_HANDLE)
                    {
                        KillTimer(g_PowerChargeTimer[client]);
                        g_PowerChargeTimer[client] = INVALID_HANDLE;
                    }
                    g_PowerChargeTimer[client] = CreateTimer(GetConVarFloat(g_ChargeTime), Timer_PowerChargeTimer, client);
                                
                }
            }
        }
    }    
    return Plugin_Continue;
}



/////////////////////////////////////////////////////////////////////
//
// フレームアクション
//
/////////////////////////////////////////////////////////////////////
public FrameAction(any:client)
{
    // ゲームに入っている
    if( IsClientInGame(client) && IsPlayerAlive(client))
    {
        // パイロのみ
        if(TF2_GetPlayerClass(client) == TFClass_Spy && g_AbilityUnlock[client])
        {
            // 発動中なら終了チェック
            if( g_IsDisguiseActive[client] )
            {
                //AdjustCameraPos(client);
                // 終了チェック
                EndCheck(client);
            }
            
            // キーチェック
            if( CheckElapsedTime(client, 0.5) )
            {
                // 攻撃ボタン
                if ( GetClientButtons(client) & IN_ATTACK2 )
                {
                    // キーを押した時間を保存
                    SaveKeyTime(client);
                    SPYJUTSU(client);
                }

            }
        }
    }
}
/////////////////////////////////////////////////////////////////////
//
// 樽出現
//
/////////////////////////////////////////////////////////////////////
stock SPYJUTSU(any:client)
{
    // ゲームに入っている
    if( IsClientInGame(client) && IsPlayerAlive(client))
    {
        // 武器はバックバーナーのみ
        //new weaponIndex = GetPlayerWeaponSlot(client, 0);
        if(TF2_GetItemDefIndex( TF2_GetCurrentWeapon(client) ) == _:ITEM_WEAPON_PDA_DISGUISE )
        {
            // 発動していなかったら発動
            if( !g_IsDisguiseActive[client]  )
            {
                // まだ使えないならメッセージ
                if( g_NextUseTime[client] > GetGameTime() )
                {
                    EmitSoundToClient(client, SOUND_NO_POWER, client, _, _, _, 1.0);
                    PrintToChat(client, "\x05%T", "CANT_USE_SPYJUTSU", client, g_NextUseTime[client] - GetGameTime());
                    return;
                }
                
                // しゃがんだ状態・地上・移動していない
                if( GetEntityFlags(client) & FL_DUCKING
                    && GetEntityFlags(client) & FL_ONGROUND
                    && !(GetEntityFlags(client) & FL_INWATER)
                    && TF2_GetPlayerSpeed(client) == 0.0
                )
                {
                    // 発動エフェクト
                    new Float:pos[3];
                    new Float:ang[3];
                    ang[0] = -90.0;
                    pos[2] = -30.0;
                    
                    AttachParticle(client, EFFECT_Disguise_SPAWN_FLASH, 1.0, pos, ang);
                    for(new i = 0; i < 10; i++)
                    {
                        pos[0] = GetRandomFloat(-5.0, 5.0);
                        pos[1] = GetRandomFloat(-5.0, 5.0);
                        AttachParticle(client, EFFECT_Disguise_SPAWN_SMOKE, 1.0, pos, ang);
                    }
                    
                    // 画面を一瞬灰色に。
                    ScreenFade(client, 50, 50, 50, 255, 100, IN);
                    
                    // 発動サウンド
                    EmitSoundToAll(SOUND_SPAWN_Disguise, client, _, _, SND_CHANGEPITCH, 0.8, 50);
                    EmitSoundToAll(SOUND_START_VOICE[GetRandomInt(0, 4)], client, _, _, _, 1.0);
                    
                    // 樽モデル作成
                    g_DisguiseModel[client] = CreateEntityByName("prop_dynamic");
                    if (IsValidEdict(g_DisguiseModel[client]))
                    {
                        new String:tName[32];
                        GetEntPropString(client, Prop_Data, "m_iName", tName, sizeof(tName));
                        DispatchKeyValue(g_DisguiseModel[client], "targetname", "spy_Disguise");
                        DispatchKeyValue(g_DisguiseModel[client], "parentname", tName);
                        SetEntityModel(g_DisguiseModel[client], MDL_DISGUISE);
                        DispatchSpawn(g_DisguiseModel[client]);
                        if(GetClientTeam(client) == 2)
                        {
                            SetVariantInt(1);
                            AcceptEntityInput(g_DisguiseModel[client], "Skin");
                        }
                        
                        SetVariantInt(99999);
                        AcceptEntityInput(g_DisguiseModel[client], "SetHealth");    
                        // モデルをプレイヤーの位置に移動
                        new Float:Pos[3];
                        GetClientAbsOrigin(client, Pos);
                        Pos[2] -=30;
                        TeleportEntity(g_DisguiseModel[client], Pos, NULL_VECTOR, NULL_VECTOR);
                        
                    }    
                    
                    // プレイヤーを見えなくする
                    SetPlayerRenderHide(client, true);

                    // 視点が変わらないよう前の死体を消す
                    new body = -1;
                    while ((body = FindEntityByClassname(body, "tf_ragdoll")) != -1)
                    {
                        //PrintToChat(client, "%d %d",client, GetEntProp(body, Prop_Send, "m_iPlayerIndex"));
                        new iOwner = GetEntProp(body, Prop_Send, "m_iPlayerIndex");
                        if(iOwner == client)
                        {
                            AcceptEntityInput(body, "Kill");
                        }
                    }

                    // 三人称視点
                    SetEntPropEnt(client, Prop_Data, "m_hObserverTarget", client);
                    SetEntProp(client, Prop_Data, "m_iObserverMode", 1);
                
                    // ボイスタイマー発動
                    if(g_HideVoicehTimer[client] != INVALID_HANDLE)
                    {
                        KillTimer(g_HideVoicehTimer[client]);
                        g_HideVoicehTimer[client] = INVALID_HANDLE;
                    }
                    g_HideVoicehTimer[client] = CreateTimer(3.5, Timer_HideVoiceTimer, client, TIMER_REPEAT);
                    
                    // ボイスカウントリセット
                    HideVoiceCount = 0;

                    // 現在のヘルスを保存
                    g_NowHealth[client] = GetClientHealth(client);

                    // 樽の中に入った
                    g_IsDisguiseActive[client] = true;
                }
            }
        }
    }
}

/////////////////////////////////////////////////////////////////////
//
// 隠れさせる(見えなくする)
//
/////////////////////////////////////////////////////////////////////
stock SetPlayerRenderHide(any:client, bool:hide)
{
    // 透明にする
    if( hide )
    {
        // プレイヤー
        SetEntityRenderMode(client, RENDER_TRANSCOLOR);
        SetEntityRenderColor(client, 255, 255, 255, 0);
        
        // 武器
        for(new i = 0; i < 3; i++)
        {
            new weaponIndex = GetPlayerWeaponSlot(client, i);
            if( weaponIndex != -1 )
            {
                SetEntityRenderMode(weaponIndex, RENDER_TRANSCOLOR);
                SetEntityRenderColor(weaponIndex, 255, 255, 255, 0);
            }
        }    
        
        // 帽子
        new hat = -1;
        while ((hat = FindEntityByClassname(hat, "tf_wearable_item")) != -1)
        {
            new iOwner = GetEntPropEnt(hat, Prop_Send, "m_hOwnerEntity");
            if(iOwner == client)
            {
                SetEntityRenderMode(hat, RENDER_TRANSCOLOR);
                SetEntityRenderColor(hat, 255, 255, 255, 0);
            }
        }
    }
    else
    {
        // プレイヤー
        SetEntityRenderMode(client, RENDER_NORMAL);
        SetEntityRenderColor(client, 255, 255, 255, 255);
        
        // 武器
        for(new i = 0; i < 3; i++)
        {
            new weaponIndex = GetPlayerWeaponSlot(client, i);
            if( weaponIndex != -1 )
            {
                SetEntityRenderMode(weaponIndex, RENDER_TRANSCOLOR);
                SetEntityRenderColor(weaponIndex, 255, 255, 255, 255);
            }
        }        
        
        // 帽子
        new hat = -1;
        while ((hat = FindEntityByClassname(hat, "tf_wearable_item")) != -1)
        {
            new iOwner = GetEntPropEnt(hat, Prop_Send, "m_hOwnerEntity");
            if(iOwner == client)
            {
                SetEntityRenderMode(hat, RENDER_TRANSCOLOR);
                SetEntityRenderColor(hat, 255, 255, 255, 255);
            }
        }
    }
}

/////////////////////////////////////////////////////////////////////
//
// ボイスタイマー
//
/////////////////////////////////////////////////////////////////////
public Action:Timer_HideVoiceTimer(Handle:timer, any:client)
{
    // 発動中ならチェック
    if(g_IsDisguiseActive[client])
    {
        if( IsClientInGame(client) && IsPlayerAlive(client) )
        {
            EmitSoundToAll(SOUND_HIDE_VOICE[HideVoiceCount], client, _, _, _, 1.0);
            HideVoiceCount++;
            if(HideVoiceCount > 4)
            {
                HideVoiceCount = 0;
            }
            
        }
    }
    else
    {
        // ボイスタイマー削除
        if(g_HideVoicehTimer[client] != INVALID_HANDLE)
        {
            KillTimer(g_HideVoicehTimer[client]);
            g_HideVoicehTimer[client] = INVALID_HANDLE;
        }        
    }

}

/////////////////////////////////////////////////////////////////////
//
// 発動終了チェック
//
/////////////////////////////////////////////////////////////////////
stock EndCheck(any:client)
{
    // 移動・攻撃または立つ・地上以外は解除
    if( GetClientButtons(client) & IN_ATTACK 
        || GetEntityFlags(client) & FL_INWATER
    ) 
    {
        // ボイスタイマー停止
        if(g_HideVoicehTimer[client] != INVALID_HANDLE)
        {
            KillTimer(g_HideVoicehTimer[client]);
            g_HideVoicehTimer[client] = INVALID_HANDLE;
        }

        // プレイヤーが解除したならボイス出す
        if( IsPlayerAlive(client) && GetEntityFlags(client) & FL_ONGROUND && !TF2_IsPlayerTaunt(client))
        {
            EmitSoundToAll(SOUND_UNHIDE_VOICE[GetRandomInt(0, 4)], client, _, _, _, 1.0);
        }
        
        // 見える
        SetPlayerRenderHide(client, false);

        // 視点を戻す
        SetEntProp(client, Prop_Send, "m_iObserverMode", 0);
        
        // モデル削除
        DeleteModel(client);
        
        // 速度戻す
        TF2_SetPlayerDefaultSpeed(client);
        
        // 次に使用可能になるまでの時間設定
        g_NextUseTime[client] = GetGameTime() + GetConVarFloat(g_ChargeTime);
                
        // パワーチャージタイマー発動
        if(g_PowerChargeTimer[client] != INVALID_HANDLE)
        {
            KillTimer(g_PowerChargeTimer[client]);
            g_PowerChargeTimer[client] = INVALID_HANDLE;
        }
        g_PowerChargeTimer[client] = CreateTimer(GetConVarFloat(g_ChargeTime), Timer_PowerChargeTimer, client);
        
        
    }
    else
    {
        // もしプレイヤーが移動したら樽も移動
        if( g_DisguiseModel[client] != -1 && g_DisguiseModel[client] != 0)
        {
            if( IsValidEntity(g_DisguiseModel[client]) )
            {
                new Float:Pos[3];
                GetClientAbsOrigin(client, Pos);
                Pos[2] +=0.0;
                TeleportEntity(g_DisguiseModel[client], Pos, NULL_VECTOR, NULL_VECTOR);
            }
        }
        
        
        // 移動速度落とす
        //TF2_SetPlayerSpeed(client, 0.5);
        
    }
    
}

/////////////////////////////////////////////////////////////////////
//
// パワーチャージ完了
//
/////////////////////////////////////////////////////////////////////
public Action:Timer_PowerChargeTimer(Handle:timer, any:client)
{
    g_PowerChargeTimer[client] = INVALID_HANDLE;
    
    // ゲームに入っている
    if( IsClientInGame(client) && IsPlayerAlive(client))
    {
        PrintToChat(client, "\x05%T", "POWER_CHARGED_SPYJUTSU", client);
        EmitSoundToClient(client, SOUND_CHARGE_POWER, client, _, _, _, 1.0);
    }
}

/////////////////////////////////////////////////////////////////////
//
// 樽破壊
//
/////////////////////////////////////////////////////////////////////
stock BreakDisguise(any:client)
{
    // 樽の破片
    new gibModel = CreateEntityByName("prop_physics_override");
    if (IsValidEdict(gibModel))
    {
        SetEntityModel(gibModel, MDL_DISGUISE);
        DispatchSpawn(gibModel);
        if(GetClientTeam(client) == 2)
        {
            SetVariantInt(1);
            AcceptEntityInput(gibModel, "Skin");
        }
        
        // モデルをプレイヤーの位置に移動
        new Float:pos[3];
        GetEntPropVector(client, Prop_Data, "m_vecAbsOrigin", pos);
        pos[2] += 30.0;
        new Float:ang[3];
        GetClientEyeAngles(client, ang);
        ang[0] = 0.0;
        ang[1] += 40.0;
        ang[2] = 0.0;
        TeleportEntity(gibModel, pos, ang, NULL_VECTOR);
        AcceptEntityInput(gibModel, "Break");
        RemoveEdict(gibModel);
    }    
}
/////////////////////////////////////////////////////////////////////
//
// ロッカータッチ
//
/////////////////////////////////////////////////////////////////////
//public EntityOutput_StartTouch( const String:output[], caller, activator, Float:delay )
//{
//    PrintToChat(activator, "Touch");
//    if(TF2_EdictNameEqual(activator, "player"))
//    {
//        // 次に使用可能になるまでの時間設定
//        g_NextUseTime[activator] = GetGameTime();
//    }
//}



/////////////////////////////////////////////////////////////////////
//
// モデル削除
//
/////////////////////////////////////////////////////////////////////
stock DeleteModel(any:client)
{
    // モデルを削除
    if( g_DisguiseModel[client] != -1 && g_DisguiseModel[client] != 0)
    {
        if( IsValidEntity(g_DisguiseModel[client]) )
        {
            // 樽破壊
            BreakDisguise(client);
            
            ActivateEntity(g_DisguiseModel[client]);
            RemoveEdict(g_DisguiseModel[client]);
            g_DisguiseModel[client] = -1;
        }    
    }
    
    g_IsDisguiseActive[client] = false;
}

/////////////////////////////////////////////////////////////////////
//
// チャージ時間
//
/////////////////////////////////////////////////////////////////////
public ConVarChange_ChargeTime(Handle:convar, const String:oldValue[], const String:newValue[])
{
    // 1.0~60.0まで
    if (StringToFloat(newValue) < 1.0 || StringToFloat(newValue) > 60.0)
    {
        SetConVarFloat(convar, StringToFloat(oldValue), false, false);
        PrintToServer("Warning: Value has to be between 1.0 and 60.0");
    }
}
(NW)Shane O' D is offline
TheSpyHunter
Senior Member
Join Date: Jul 2009
Old 09-29-2009 , 15:23   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #18

ok try this, both tested and working.

DisguiseSpy (Sentry)

PHP Code:
/////////////////////////////////////////////////////////////////////
// Changelog
/////////////////////////////////////////////////////////////////////
// 2009/09/05 - 0.0.1
// ・サーバーに入って最初の復活の際、画面が観戦モードのようになるのを修正

/////////////////////////////////////////////////////////////////////
//
// インクルード
//
/////////////////////////////////////////////////////////////////////
#include <sourcemod>
#include <sdktools>
#include <tf2>
#include <tf2_stocks>
#include "rmf/tf2_codes"
#include "rmf/tf2_events"

/////////////////////////////////////////////////////////////////////
//
// 定数
//
/////////////////////////////////////////////////////////////////////
#define PL_NAME "Spy Jutsu"
#define PL_DESC "Spy Jutsu"
#define PL_VERSION "0.0.1"
#define PL_TRANSLATION "spyjutsu.phrases"

#define MDL_DISGUISE "models/buildables/sentry3.mdl"

#define SOUND_SPAWN_Disguise "player/pl_impact_stun.wav"
#define SOUND_CHARGE_POWER "ui/item_acquired.wav"
#define SOUND_NO_POWER "weapons/medigun_no_target.wav"

#define EFFECT_Disguise_SPAWN_SMOKE "Explosion_Smoke_1"
#define EFFECT_Disguise_SPAWN_FLASH "Explosion_Flash_1"

/////////////////////////////////////////////////////////////////////
//
// MOD情報
//
/////////////////////////////////////////////////////////////////////
public Plugin:myinfo 
{
    
name PL_NAME,
    
author "RIKUSYO",
    
description PL_DESC,
    
version PL_VERSION,
    
url "http://ameblo.jp/rikusyo/"
}


/////////////////////////////////////////////////////////////////////
//
// グローバル変数
//
/////////////////////////////////////////////////////////////////////
new Handle:g_ChargeTime INVALID_HANDLE;                        // ConVarチャージ時間

new g_DisguiseModel[MAXPLAYERS+1] = -1;            // モデル
new g_IsDisguiseActive[MAXPLAYERS+1] = -1;        // 樽の中?
new Handle:g_HideVoicehTimer[MAXPLAYERS+1] = INVALID_HANDLE;    // ボイスタイマー
new Handle:g_PowerChargeTimer[MAXPLAYERS+1] = INVALID_HANDLE;    // パワーチャージタイマー
new String:SOUND_START_VOICE[5][64];                            // 隠れ開始ボイス
new String:SOUND_HIDE_VOICE[5][64];                                // 隠れボイス
new String:SOUND_UNHIDE_VOICE[5][64];                            // 登場ボイス
new HideVoiceCount 0;                                            // ボイスカウント
new g_NowHealth[MAXPLAYERS+1] = 0;                                 // 現在のヘルス
new Float:g_NextUseTime[MAXPLAYERS+1] = 0.0;                     // 次に使えるようになるまでの時間

/////////////////////////////////////////////////////////////////////
//
// イベント発動
//
/////////////////////////////////////////////////////////////////////
stock Action:Event_FiredUser(Handle:event, const String:name[], any:client=0)
{
    
// プラグイン開始
    
if(StrEqual(nameEVENT_PLUGIN_START))
    {
        
// 言語ファイル読込
        
LoadTranslations(PL_TRANSLATION);

        
// コマンド作成
        
CreateConVar("sm_rmf_tf_spyjutsu"PL_VERSIONPL_NAMEFCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
        
g_IsPluginOn CreateConVar("sm_rmf_allow_spyjutsu","1","Enable/Disable (0 = disabled | 1 = enabled)");
        
        
// ConVarフック
        
HookConVarChange(g_IsPluginOnConVarChange_IsPluginOn);
        
        
g_ChargeTime CreateConVar("sm_rmf_spyjutsu_charge_time","0.0""Power charge time (1.0-60.0)");
        
HookConVarChange(g_ChargeTimeConVarChange_ChargeTime);
        
        
// 回復棚にタッチ
//        HookEntityOutput("func_regenerate",  "OnStartTouch",    EntityOutput_StartTouch);
    
        // アビリティクラス設定
        
CreateConVar("sm_rmf_spyjutsu_class""1""Ability class");
        
        
// 隠れボイス
        
SOUND_HIDE_VOICE[0] = "weapons/sentry_scan3.wav";
        
SOUND_HIDE_VOICE[1] = "weapons/sentry_scan3.wav";
        
SOUND_HIDE_VOICE[2] = "weapons/sentry_scan3.wav";
        
SOUND_HIDE_VOICE[3] = "weapons/sentry_scan.wav3";
        
SOUND_HIDE_VOICE[4] = "weapons/sentry_scan3.wav";
        
// 登場ボイス
        
SOUND_UNHIDE_VOICE[0] = "vo/spy_laughlong01.wav";
        
SOUND_UNHIDE_VOICE[1] = "vo/spy_laughhappy01.wav";
        
SOUND_UNHIDE_VOICE[2] = "vo/spy_laughhappy02.wav";
        
SOUND_UNHIDE_VOICE[3] = "vo/spy_laughhappy03.wav";
        
SOUND_UNHIDE_VOICE[4] = "vo/spy_laughevil01.wav";
        
// 隠れ開始ボイス
        
SOUND_START_VOICE[0] = "weapons/sentry_finish.wav";
        
SOUND_START_VOICE[1] = "weapons/sentry_finish.wav";
        
SOUND_START_VOICE[2] = "weapons/sentry_finish.wav";
        
SOUND_START_VOICE[3] = "weapons/sentry_finish.wav";
        
SOUND_START_VOICE[4] = "weapons/sentry_finish.wav";

    }
    
// プラグイン初期化
    
if(StrEqual(nameEVENT_PLUGIN_INIT))
    {
        
// 初期化が必要なもの
        
new maxclients GetMaxClients();
        for (new 
1<= maxclientsi++)
        {
            
// モデル削除
            
DeleteModel(client)
            
            
        }
    }
    
// プラグイン後始末
    
if(StrEqual(nameEVENT_PLUGIN_FINAL))
    {
        
// 初期化が必要なもの
        
new maxclients GetMaxClients();
        for (new 
1<= maxclientsi++)
        {
            
// モデル削除
            
DeleteModel(client)
        }
    }
    
    
// マップスタート
    
if(StrEqual(nameEVENT_MAP_START))
    {
        
// エフェクト先読み
        
PrePlayParticle(EFFECT_Disguise_SPAWN_SMOKE);
        
PrePlayParticle(EFFECT_Disguise_SPAWN_FLASH);

        
// モデル読み込み
        
PrecacheModel(MDL_DISGUISEtrue);
        
        
//サウンド読み込み
        
PrecacheSound(SOUND_SPAWN_Disguisetrue);
        
PrecacheSound(SOUND_CHARGE_POWERtrue);
        
PrecacheSound(SOUND_NO_POWERtrue);
        for( new 
05i++)
        {
            
PrecacheSound(SOUND_HIDE_VOICE[i], true);
            
PrecacheSound(SOUND_UNHIDE_VOICE[i], true);
            
PrecacheSound(SOUND_START_VOICE[i], true);
        }
        
        
// 初期化が必要なもの
        
new maxclients GetMaxClients();
        for (new 
1<= maxclientsi++)
        {
            
// モデル削除
            
DeleteModel(client)
        }
        
    }
    

    
// ゲームフレーム
    
if(StrEqual(nameEVENT_GAME_FRAME))
    {
        new 
maxclients GetMaxClients();
        for (new 
1<= maxclientsi++)
        {
            
FrameAction(i);
        }
    }

    
    
// プレイヤーリセット
    
if(StrEqual(nameEVENT_PLAYER_DATA_RESET))
    {
        
// 速度戻す
        
TF2_SetPlayerDefaultSpeed(client);

        
// 次に使えるまでの時間リセット
        
g_NextUseTime[client] = 0.0;
        
        
// ボイスタイマー停止
        
if(g_HideVoicehTimer[client] != INVALID_HANDLE)
        {
            
KillTimer(g_HideVoicehTimer[client]);
            
g_HideVoicehTimer[client] = INVALID_HANDLE;
        }
        
        
// パワーチャージタイマー停止
        
if(g_PowerChargeTimer[client] != INVALID_HANDLE)
        {
            
KillTimer(g_PowerChargeTimer[client]);
            
g_PowerChargeTimer[client] = INVALID_HANDLE;
        }
        
        
// ボイスカウントリセット
        
HideVoiceCount 0;
        
        
// 現在のヘルス保存
        
g_NowHealth[client] = GetClientHealth(client);
        
        
// 見える
        
SetPlayerRenderHide(clientfalse);

        
// 視点を戻す
        //SetClientViewEntity(client, client);
        //SetEntProp(client, Prop_Send, "m_iObserverMode", 0);

        // モデル削除
        
DeleteModel(client);
        
        
        
// 説明文
        
if( TF2_GetPlayerClassclient ) == TFClass_Spy)
        {
            
Format(g_PlayerHintText[client][0], HintTextMaxSize "%T""DESCRIPTION_0_SPYJUTSU"client);
            
Format(g_PlayerHintText[client][1], HintTextMaxSize "%T""DESCRIPTION_1_SPYJUTSU"client);
        }
        
    }
    

    
// プレイヤーダメージ
    
if(StrEqual(nameEVENT_PLAYER_DAMAGE))
    {
        
// パイロ
        
if( TF2_GetPlayerClassclient ) == TFClass_Spy )
        {
            
// 樽の中に入っている
            
if(g_IsDisguiseActive[client])
            {
                
// 食らったダメージ取得
                
new damage g_NowHealth[client] - GetEventInt(event"health");
                
                
// 50以上のダメージを受けたら解除
                
if( damage 50 )
                {
                    
// ボイスタイマー停止
                    
if(g_HideVoicehTimer[client] != INVALID_HANDLE)
                    {
                        
KillTimer(g_HideVoicehTimer[client]);
                        
g_HideVoicehTimer[client] = INVALID_HANDLE;
                    }

                    
// 見える
                    
SetPlayerRenderHide(clientfalse);

                    
// 視点を戻す
                    
SetEntProp(clientProp_Send"m_iObserverMode"0);

                    
// モデル削除
                    
DeleteModel(client);
                    
                    
// 速度戻す
                    
TF2_SetPlayerDefaultSpeed(client);
        
                    
// 次に使用可能になるまでの時間設定
                    
g_NextUseTime[client] = GetGameTime() + GetConVarFloat(g_ChargeTime);
                                
                    
// パワーチャージタイマー発動
                    
if(g_PowerChargeTimer[client] != INVALID_HANDLE)
                    {
                        
KillTimer(g_PowerChargeTimer[client]);
                        
g_PowerChargeTimer[client] = INVALID_HANDLE;
                    }
                    
g_PowerChargeTimer[client] = CreateTimer(GetConVarFloat(g_ChargeTime), Timer_PowerChargeTimerclient);
                                
                }
            }
        }
    }    
    return 
Plugin_Continue;
}



/////////////////////////////////////////////////////////////////////
//
// フレームアクション
//
/////////////////////////////////////////////////////////////////////
public FrameAction(any:client)
{
    
// ゲームに入っている
    
if( IsClientInGame(client) && IsPlayerAlive(client))
    {
        
// パイロのみ
        
if(TF2_GetPlayerClass(client) == TFClass_Spy && g_AbilityUnlock[client])
        {
            
// 発動中なら終了チェック
            
if( g_IsDisguiseActive[client] )
            {
                
//AdjustCameraPos(client);
                // 終了チェック
                
EndCheck(client);
            }
            
            
// キーチェック
            
if( CheckElapsedTime(client0.5) )
            {
                
// 攻撃ボタン
                
if ( GetClientButtons(client) & IN_ATTACK2 )
                {
                    
// キーを押した時間を保存
                    
SaveKeyTime(client);
                    
SPYJUTSU(client);
                }

            }
        }
    }
}
/////////////////////////////////////////////////////////////////////
//
// 樽出現
//
/////////////////////////////////////////////////////////////////////
stock SPYJUTSU(any:client)
{
    
// ゲームに入っている
    
if( IsClientInGame(client) && IsPlayerAlive(client))
    {
        
// 武器はバックバーナーのみ
        //new weaponIndex = GetPlayerWeaponSlot(client, 0);
        
if(TF2_GetItemDefIndexTF2_GetCurrentWeapon(client) ) == _:ITEM_WEAPON_PDA_DISGUISE )
        {
            
// 発動していなかったら発動
            
if( !g_IsDisguiseActive[client]  )
            {
                
// まだ使えないならメッセージ
                
if( g_NextUseTime[client] > GetGameTime() )
                {
                    
EmitSoundToClient(clientSOUND_NO_POWERclient___1.0);
                    
PrintToChat(client"\x05%T""CANT_USE_SPYJUTSU"clientg_NextUseTime[client] - GetGameTime());
                    return;
                }
                
                
// しゃがんだ状態・地上・移動していない
                
if( GetEntityFlags(client) & FL_DUCKING
                    
&& GetEntityFlags(client) & FL_ONGROUND
                    
&& !(GetEntityFlags(client) & FL_INWATER)
                    && 
TF2_GetPlayerSpeed(client) == 0.0
                
)
                {
                    
// 発動エフェクト
                    
new Float:pos[3];
                    new 
Float:ang[3];
                    
ang[0] = -90.0;
                    
pos[2] = -30.0;
                    
                    
AttachParticle(clientEFFECT_Disguise_SPAWN_FLASH1.0posang);
                    for(new 
010i++)
                    {
                        
pos[0] = GetRandomFloat(-5.05.0);
                        
pos[1] = GetRandomFloat(-5.05.0);
                        
AttachParticle(clientEFFECT_Disguise_SPAWN_SMOKE1.0posang);
                    }
                    
                    
// 画面を一瞬灰色に。
                    
ScreenFade(client505050255100IN);
                    
                    
// 発動サウンド
                    
EmitSoundToAll(SOUND_SPAWN_Disguiseclient__SND_CHANGEPITCH0.850);
                    
EmitSoundToAll(SOUND_START_VOICE[GetRandomInt(04)], client___1.0);
                    
                    
// 樽モデル作成
                    
g_DisguiseModel[client] = CreateEntityByName("prop_dynamic");
                    if (
IsValidEdict(g_DisguiseModel[client]))
                    {
                        new 
String:tName[32];
                        
GetEntPropString(clientProp_Data"m_iName"tNamesizeof(tName));
                        
DispatchKeyValue(g_DisguiseModel[client], "targetname""spy_Disguise");
                        
DispatchKeyValue(g_DisguiseModel[client], "parentname"tName);
                        
SetEntityModel(g_DisguiseModel[client], MDL_DISGUISE);
                        
DispatchSpawn(g_DisguiseModel[client]);
                        if(
GetClientTeam(client) == 2)
                        {
                            
SetVariantInt(1);
                            
AcceptEntityInput(g_DisguiseModel[client], "Skin");
                        }
                        
                        
SetVariantInt(99999);
                        
AcceptEntityInput(g_DisguiseModel[client], "SetHealth");    
                        
// モデルをプレイヤーの位置に移動
                        
new Float:Pos[3];
                        
GetClientAbsOrigin(clientPos);
                        
Pos[2] -=30;
                        
TeleportEntity(g_DisguiseModel[client], PosNULL_VECTORNULL_VECTOR);
                        
                    }    
                    
                    
// プレイヤーを見えなくする
                    
SetPlayerRenderHide(clienttrue);

                    
// 視点が変わらないよう前の死体を消す
                    
new body = -1;
                    while ((
body FindEntityByClassname(body"tf_ragdoll")) != -1)
                    {
                        
//PrintToChat(client, "%d %d",client, GetEntProp(body, Prop_Send, "m_iPlayerIndex"));
                        
new iOwner GetEntProp(bodyProp_Send"m_iPlayerIndex");
                        if(
iOwner == client)
                        {
                            
AcceptEntityInput(body"Kill");
                        }
                    }

                    
// 三人称視点
                    
SetEntPropEnt(clientProp_Data"m_hObserverTarget"client);
                    
SetEntProp(clientProp_Data"m_iObserverMode"1);
                
                    
// ボイスタイマー発動
                    
if(g_HideVoicehTimer[client] != INVALID_HANDLE)
                    {
                        
KillTimer(g_HideVoicehTimer[client]);
                        
g_HideVoicehTimer[client] = INVALID_HANDLE;
                    }
                    
g_HideVoicehTimer[client] = CreateTimer(3.5Timer_HideVoiceTimerclientTIMER_REPEAT);
                    
                    
// ボイスカウントリセット
                    
HideVoiceCount 0;

                    
// 現在のヘルスを保存
                    
g_NowHealth[client] = GetClientHealth(client);

                    
// 樽の中に入った
                    
g_IsDisguiseActive[client] = true;
                }
            }
        }
    }
}

/////////////////////////////////////////////////////////////////////
//
// 隠れさせる(見えなくする)
//
/////////////////////////////////////////////////////////////////////
stock SetPlayerRenderHide(any:clientbool:hide)
{
    
// 透明にする
    
if( hide )
    {
        
// プレイヤー
        
SetEntityRenderMode(clientRENDER_TRANSCOLOR);
        
SetEntityRenderColor(client2552552550);
        
        
// 武器
        
for(new 03i++)
        {
            new 
weaponIndex GetPlayerWeaponSlot(clienti);
            if( 
weaponIndex != -)
            {
                
SetEntityRenderMode(weaponIndexRENDER_TRANSCOLOR);
                
SetEntityRenderColor(weaponIndex2552552550);
            }
        }    
        
        
// 帽子
        
new hat = -1;
        while ((
hat FindEntityByClassname(hat"tf_wearable_item")) != -1)
        {
            new 
iOwner GetEntPropEnt(hatProp_Send"m_hOwnerEntity");
            if(
iOwner == client)
            {
                
SetEntityRenderMode(hatRENDER_TRANSCOLOR);
                
SetEntityRenderColor(hat2552552550);
            }
        }
    }
    else
    {
        
// プレイヤー
        
SetEntityRenderMode(clientRENDER_NORMAL);
        
SetEntityRenderColor(client255255255255);
        
        
// 武器
        
for(new 03i++)
        {
            new 
weaponIndex GetPlayerWeaponSlot(clienti);
            if( 
weaponIndex != -)
            {
                
SetEntityRenderMode(weaponIndexRENDER_TRANSCOLOR);
                
SetEntityRenderColor(weaponIndex255255255255);
            }
        }        
        
        
// 帽子
        
new hat = -1;
        while ((
hat FindEntityByClassname(hat"tf_wearable_item")) != -1)
        {
            new 
iOwner GetEntPropEnt(hatProp_Send"m_hOwnerEntity");
            if(
iOwner == client)
            {
                
SetEntityRenderMode(hatRENDER_TRANSCOLOR);
                
SetEntityRenderColor(hat255255255255);
            }
        }
    }
}

/////////////////////////////////////////////////////////////////////
//
// ボイスタイマー
//
/////////////////////////////////////////////////////////////////////
public Action:Timer_HideVoiceTimer(Handle:timerany:client)
{
    
// 発動中ならチェック
    
if(g_IsDisguiseActive[client])
    {
        if( 
IsClientInGame(client) && IsPlayerAlive(client) )
        {
            
EmitSoundToAll(SOUND_HIDE_VOICE[HideVoiceCount], client___1.0);
            
HideVoiceCount++;
            if(
HideVoiceCount 4)
            {
                
HideVoiceCount 0;
            }
            
        }
    }
    else
    {
        
// ボイスタイマー削除
        
if(g_HideVoicehTimer[client] != INVALID_HANDLE)
        {
            
KillTimer(g_HideVoicehTimer[client]);
            
g_HideVoicehTimer[client] = INVALID_HANDLE;
        }        
    }

}

/////////////////////////////////////////////////////////////////////
//
// 発動終了チェック
//
/////////////////////////////////////////////////////////////////////
stock EndCheck(any:client)
{
    
// 移動・攻撃または立つ・地上以外は解除
    
if( GetClientButtons(client) & IN_ATTACK 
        
|| GetEntityFlags(client) & FL_INWATER
    

    {
        
// ボイスタイマー停止
        
if(g_HideVoicehTimer[client] != INVALID_HANDLE)
        {
            
KillTimer(g_HideVoicehTimer[client]);
            
g_HideVoicehTimer[client] = INVALID_HANDLE;
        }

        
// プレイヤーが解除したならボイス出す
        
if( IsPlayerAlive(client) && GetEntityFlags(client) & FL_ONGROUND && !TF2_IsPlayerTaunt(client))
        {
            
EmitSoundToAll(SOUND_UNHIDE_VOICE[GetRandomInt(04)], client___1.0);
        }
        
        
// 見える
        
SetPlayerRenderHide(clientfalse);

        
// 視点を戻す
        
SetEntProp(clientProp_Send"m_iObserverMode"0);
        
        
// モデル削除
        
DeleteModel(client);
        
        
// 速度戻す
        
TF2_SetPlayerDefaultSpeed(client);
        
        
// 次に使用可能になるまでの時間設定
        
g_NextUseTime[client] = GetGameTime() + GetConVarFloat(g_ChargeTime);
                
        
// パワーチャージタイマー発動
        
if(g_PowerChargeTimer[client] != INVALID_HANDLE)
        {
            
KillTimer(g_PowerChargeTimer[client]);
            
g_PowerChargeTimer[client] = INVALID_HANDLE;
        }
        
g_PowerChargeTimer[client] = CreateTimer(GetConVarFloat(g_ChargeTime), Timer_PowerChargeTimerclient);
        
        
    }
    else
    {
        
// もしプレイヤーが移動したら樽も移動
        
if( g_DisguiseModel[client] != -&& g_DisguiseModel[client] != 0)
        {
            if( 
IsValidEntity(g_DisguiseModel[client]) )
            {
                new 
Float:Pos[3];
                
GetClientAbsOrigin(clientPos);
                
Pos[2] +=0.0;
                
TeleportEntity(g_DisguiseModel[client], PosNULL_VECTORNULL_VECTOR);
            }
        }
        
        
        
// 移動速度落とす
        //TF2_SetPlayerSpeed(client, 0.5);
        
    
}
    
}

/////////////////////////////////////////////////////////////////////
//
// パワーチャージ完了
//
/////////////////////////////////////////////////////////////////////
public Action:Timer_PowerChargeTimer(Handle:timerany:client)
{
    
g_PowerChargeTimer[client] = INVALID_HANDLE;
    
    
// ゲームに入っている
    
if( IsClientInGame(client) && IsPlayerAlive(client))
    {
        
PrintToChat(client"\x05%T""POWER_CHARGED_SPYJUTSU"client);
        
EmitSoundToClient(clientSOUND_CHARGE_POWERclient___1.0);
    }
}

/////////////////////////////////////////////////////////////////////
//
// 樽破壊
//
/////////////////////////////////////////////////////////////////////
stock BreakDisguise(any:client)
{
    
// 樽の破片
    
new gibModel CreateEntityByName("prop_physics_override");
    if (
IsValidEdict(gibModel))
    {
        
SetEntityModel(gibModelMDL_DISGUISE);
        
DispatchSpawn(gibModel);
        if(
GetClientTeam(client) == 2)
        {
            
SetVariantInt(1);
            
AcceptEntityInput(gibModel"Skin");
        }
        
        
// モデルをプレイヤーの位置に移動
        
new Float:pos[3];
        
GetEntPropVector(clientProp_Data"m_vecAbsOrigin"pos);
        
pos[2] += 30.0;
        new 
Float:ang[3];
        
GetClientEyeAngles(clientang);
        
ang[0] = 0.0;
        
ang[1] += 40.0;
        
ang[2] = 0.0;
        
TeleportEntity(gibModelposangNULL_VECTOR);
        
AcceptEntityInput(gibModel"Break");
        
RemoveEdict(gibModel);
    }    
}
/////////////////////////////////////////////////////////////////////
//
// ロッカータッチ
//
/////////////////////////////////////////////////////////////////////
//public EntityOutput_StartTouch( const String:output[], caller, activator, Float:delay )
//{
//    PrintToChat(activator, "Touch");
//    if(TF2_EdictNameEqual(activator, "player"))
//    {
//        // 次に使用可能になるまでの時間設定
//        g_NextUseTime[activator] = GetGameTime();
//    }
//}



/////////////////////////////////////////////////////////////////////
//
// モデル削除
//
/////////////////////////////////////////////////////////////////////
stock DeleteModel(any:client)
{
    
// モデルを削除
    
if( g_DisguiseModel[client] != -&& g_DisguiseModel[client] != 0)
    {
        if( 
IsValidEntity(g_DisguiseModel[client]) )
        {
            
// 樽破壊
            
BreakDisguise(client);
            
            
ActivateEntity(g_DisguiseModel[client]);
            
RemoveEdict(g_DisguiseModel[client]);
            
g_DisguiseModel[client] = -1;
        }    
    }
    
    
g_IsDisguiseActive[client] = false;
}

/////////////////////////////////////////////////////////////////////
//
// チャージ時間
//
/////////////////////////////////////////////////////////////////////
public ConVarChange_ChargeTime(Handle:convar, const String:oldValue[], const String:newValue[])
{
    
// 1.0~60.0まで
    
if (StringToFloat(newValue) < 1.0 || StringToFloat(newValue) > 60.0)
    {
        
SetConVarFloat(convarStringToFloat(oldValue), falsefalse);
        
PrintToServer("Warning: Value has to be between 1.0 and 60.0");
    }

DisguiseSpy (Dispenser)

PHP Code:
/////////////////////////////////////////////////////////////////////
// Changelog
/////////////////////////////////////////////////////////////////////
// 2009/09/05 - 0.0.1
// ・サーバーに入って最初の復活の際、画面が観戦モードのようになるのを修正

/////////////////////////////////////////////////////////////////////
//
// インクルード
//
/////////////////////////////////////////////////////////////////////
#include <sourcemod>
#include <sdktools>
#include <tf2>
#include <tf2_stocks>
#include "rmf/tf2_codes"
#include "rmf/tf2_events"

/////////////////////////////////////////////////////////////////////
//
// 定数
//
/////////////////////////////////////////////////////////////////////
#define PL_NAME "Spy Jutsu"
#define PL_DESC "Spy Jutsu"
#define PL_VERSION "0.0.1"
#define PL_TRANSLATION "spyjutsu.phrases"

#define MDL_DISGUISE "models/buildables/dispenser_lvl3.mdl"

#define SOUND_SPAWN_Disguise "player/pl_impact_stun.wav"
#define SOUND_CHARGE_POWER "ui/item_acquired.wav"
#define SOUND_NO_POWER "weapons/medigun_no_target.wav"

#define EFFECT_Disguise_SPAWN_SMOKE "Explosion_Smoke_1"
#define EFFECT_Disguise_SPAWN_FLASH "Explosion_Flash_1"

/////////////////////////////////////////////////////////////////////
//
// MOD情報
//
/////////////////////////////////////////////////////////////////////
public Plugin:myinfo 
{
    
name PL_NAME,
    
author "RIKUSYO",
    
description PL_DESC,
    
version PL_VERSION,
    
url "http://ameblo.jp/rikusyo/"
}


/////////////////////////////////////////////////////////////////////
//
// グローバル変数
//
/////////////////////////////////////////////////////////////////////
new Handle:g_ChargeTime INVALID_HANDLE;                        // ConVarチャージ時間

new g_DisguiseModel[MAXPLAYERS+1] = -1;            // モデル
new g_IsDisguiseActive[MAXPLAYERS+1] = -1;        // 樽の中?
new Handle:g_HideVoicehTimer[MAXPLAYERS+1] = INVALID_HANDLE;    // ボイスタイマー
new Handle:g_PowerChargeTimer[MAXPLAYERS+1] = INVALID_HANDLE;    // パワーチャージタイマー
new String:SOUND_START_VOICE[5][64];                            // 隠れ開始ボイス
new String:SOUND_HIDE_VOICE[5][64];                                // 隠れボイス
new String:SOUND_UNHIDE_VOICE[5][64];                            // 登場ボイス
new HideVoiceCount 0;                                            // ボイスカウント
new g_NowHealth[MAXPLAYERS+1] = 0;                                 // 現在のヘルス
new Float:g_NextUseTime[MAXPLAYERS+1] = 0.0;                     // 次に使えるようになるまでの時間

/////////////////////////////////////////////////////////////////////
//
// イベント発動
//
/////////////////////////////////////////////////////////////////////
stock Action:Event_FiredUser(Handle:event, const String:name[], any:client=0)
{
    
// プラグイン開始
    
if(StrEqual(nameEVENT_PLUGIN_START))
    {
        
// 言語ファイル読込
        
LoadTranslations(PL_TRANSLATION);

        
// コマンド作成
        
CreateConVar("sm_rmf_tf_spyjutsu"PL_VERSIONPL_NAMEFCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
        
g_IsPluginOn CreateConVar("sm_rmf_allow_spyjutsu","1","Enable/Disable (0 = disabled | 1 = enabled)");
        
        
// ConVarフック
        
HookConVarChange(g_IsPluginOnConVarChange_IsPluginOn);
        
        
g_ChargeTime CreateConVar("sm_rmf_spyjutsu_charge_time","0.0""Power charge time (1.0-60.0)");
        
HookConVarChange(g_ChargeTimeConVarChange_ChargeTime);
        
        
// 回復棚にタッチ
//        HookEntityOutput("func_regenerate",  "OnStartTouch",    EntityOutput_StartTouch);
    
        // アビリティクラス設定
        
CreateConVar("sm_rmf_spyjutsu_class""1""Ability class");
        
        
// 隠れボイス
        
SOUND_HIDE_VOICE[0] = "weapons/dispenser_idle.wav";
        
SOUND_HIDE_VOICE[1] = "weapons/dispenser_idle.wav";
        
SOUND_HIDE_VOICE[2] = "weapons/dispenser_idle.wav";
        
SOUND_HIDE_VOICE[3] = "weapons/dispenser_idle.wav";
        
SOUND_HIDE_VOICE[4] = "weapons/dispenser_idle.wav";
        
// 登場ボイス
        
SOUND_UNHIDE_VOICE[0] = "vo/spy_laughlong01.wav";
        
SOUND_UNHIDE_VOICE[1] = "vo/spy_laughhappy01.wav";
        
SOUND_UNHIDE_VOICE[2] = "vo/spy_laughhappy02.wav";
        
SOUND_UNHIDE_VOICE[3] = "vo/spy_laughhappy03.wav";
        
SOUND_UNHIDE_VOICE[4] = "vo/spy_laughevil01.wav";
        
// 隠れ開始ボイス
        
SOUND_START_VOICE[0] = "weapons/dispenser_generate_metal.wav";
        
SOUND_START_VOICE[1] = "weapons/dispenser_generate_metal.wav";
        
SOUND_START_VOICE[2] = "weapons/dispenser_generate_metal.wav";
        
SOUND_START_VOICE[3] = "weapons/dispenser_generate_metal.wav";
        
SOUND_START_VOICE[4] = "weapons/dispenser_generate_metal.wav";


    }
    
// プラグイン初期化
    
if(StrEqual(nameEVENT_PLUGIN_INIT))
    {
        
// 初期化が必要なもの
        
new maxclients GetMaxClients();
        for (new 
1<= maxclientsi++)
        {
            
// モデル削除
            
DeleteModel(client)
            
            
        }
    }
    
// プラグイン後始末
    
if(StrEqual(nameEVENT_PLUGIN_FINAL))
    {
        
// 初期化が必要なもの
        
new maxclients GetMaxClients();
        for (new 
1<= maxclientsi++)
        {
            
// モデル削除
            
DeleteModel(client)
        }
    }
    
    
// マップスタート
    
if(StrEqual(nameEVENT_MAP_START))
    {
        
// エフェクト先読み
        
PrePlayParticle(EFFECT_Disguise_SPAWN_SMOKE);
        
PrePlayParticle(EFFECT_Disguise_SPAWN_FLASH);

        
// モデル読み込み
        
PrecacheModel(MDL_DISGUISEtrue);
        
        
//サウンド読み込み
        
PrecacheSound(SOUND_SPAWN_Disguisetrue);
        
PrecacheSound(SOUND_CHARGE_POWERtrue);
        
PrecacheSound(SOUND_NO_POWERtrue);
        for( new 
05i++)
        {
            
PrecacheSound(SOUND_HIDE_VOICE[i], true);
            
PrecacheSound(SOUND_UNHIDE_VOICE[i], true);
            
PrecacheSound(SOUND_START_VOICE[i], true);
        }
        
        
// 初期化が必要なもの
        
new maxclients GetMaxClients();
        for (new 
1<= maxclientsi++)
        {
            
// モデル削除
            
DeleteModel(client)
        }
        
    }
    

    
// ゲームフレーム
    
if(StrEqual(nameEVENT_GAME_FRAME))
    {
        new 
maxclients GetMaxClients();
        for (new 
1<= maxclientsi++)
        {
            
FrameAction(i);
        }
    }

    
    
// プレイヤーリセット
    
if(StrEqual(nameEVENT_PLAYER_DATA_RESET))
    {
        
// 速度戻す
        
TF2_SetPlayerDefaultSpeed(client);

        
// 次に使えるまでの時間リセット
        
g_NextUseTime[client] = 0.0;
        
        
// ボイスタイマー停止
        
if(g_HideVoicehTimer[client] != INVALID_HANDLE)
        {
            
KillTimer(g_HideVoicehTimer[client]);
            
g_HideVoicehTimer[client] = INVALID_HANDLE;
        }
        
        
// パワーチャージタイマー停止
        
if(g_PowerChargeTimer[client] != INVALID_HANDLE)
        {
            
KillTimer(g_PowerChargeTimer[client]);
            
g_PowerChargeTimer[client] = INVALID_HANDLE;
        }
        
        
// ボイスカウントリセット
        
HideVoiceCount 0;
        
        
// 現在のヘルス保存
        
g_NowHealth[client] = GetClientHealth(client);
        
        
// 見える
        
SetPlayerRenderHide(clientfalse);

        
// 視点を戻す
        //SetClientViewEntity(client, client);
        //SetEntProp(client, Prop_Send, "m_iObserverMode", 0);

        // モデル削除
        
DeleteModel(client);
        
        
        
// 説明文
        
if( TF2_GetPlayerClassclient ) == TFClass_Spy)
        {
            
Format(g_PlayerHintText[client][0], HintTextMaxSize "%T""DESCRIPTION_0_SPYJUTSU"client);
            
Format(g_PlayerHintText[client][1], HintTextMaxSize "%T""DESCRIPTION_1_SPYJUTSU"client);
        }
        
    }
    

    
// プレイヤーダメージ
    
if(StrEqual(nameEVENT_PLAYER_DAMAGE))
    {
        
// パイロ
        
if( TF2_GetPlayerClassclient ) == TFClass_Spy )
        {
            
// 樽の中に入っている
            
if(g_IsDisguiseActive[client])
            {
                
// 食らったダメージ取得
                
new damage g_NowHealth[client] - GetEventInt(event"health");
                
                
// 50以上のダメージを受けたら解除
                
if( damage 50 )
                {
                    
// ボイスタイマー停止
                    
if(g_HideVoicehTimer[client] != INVALID_HANDLE)
                    {
                        
KillTimer(g_HideVoicehTimer[client]);
                        
g_HideVoicehTimer[client] = INVALID_HANDLE;
                    }

                    
// 見える
                    
SetPlayerRenderHide(clientfalse);

                    
// 視点を戻す
                    
SetEntProp(clientProp_Send"m_iObserverMode"0);

                    
// モデル削除
                    
DeleteModel(client);
                    
                    
// 速度戻す
                    
TF2_SetPlayerDefaultSpeed(client);
        
                    
// 次に使用可能になるまでの時間設定
                    
g_NextUseTime[client] = GetGameTime() + GetConVarFloat(g_ChargeTime);
                                
                    
// パワーチャージタイマー発動
                    
if(g_PowerChargeTimer[client] != INVALID_HANDLE)
                    {
                        
KillTimer(g_PowerChargeTimer[client]);
                        
g_PowerChargeTimer[client] = INVALID_HANDLE;
                    }
                    
g_PowerChargeTimer[client] = CreateTimer(GetConVarFloat(g_ChargeTime), Timer_PowerChargeTimerclient);
                                
                }
            }
        }
    }    
    return 
Plugin_Continue;
}



/////////////////////////////////////////////////////////////////////
//
// フレームアクション
//
/////////////////////////////////////////////////////////////////////
public FrameAction(any:client)
{
    
// ゲームに入っている
    
if( IsClientInGame(client) && IsPlayerAlive(client))
    {
        
// パイロのみ
        
if(TF2_GetPlayerClass(client) == TFClass_Spy && g_AbilityUnlock[client])
        {
            
// 発動中なら終了チェック
            
if( g_IsDisguiseActive[client] )
            {
                
//AdjustCameraPos(client);
                // 終了チェック
                
EndCheck(client);
            }
            
            
// キーチェック
            
if( CheckElapsedTime(client0.5) )
            {
                
// 攻撃ボタン
                
if ( GetClientButtons(client) & IN_ATTACK2 )
                {
                    
// キーを押した時間を保存
                    
SaveKeyTime(client);
                    
SPYJUTSU(client);
                }

            }
        }
    }
}
/////////////////////////////////////////////////////////////////////
//
// 樽出現
//
/////////////////////////////////////////////////////////////////////
stock SPYJUTSU(any:client)
{
    
// ゲームに入っている
    
if( IsClientInGame(client) && IsPlayerAlive(client))
    {
        
// 武器はバックバーナーのみ
        //new weaponIndex = GetPlayerWeaponSlot(client, 0);
        
if(TF2_GetItemDefIndexTF2_GetCurrentWeapon(client) ) == _:ITEM_WEAPON_PDA_DISGUISE )
        {
            
// 発動していなかったら発動
            
if( !g_IsDisguiseActive[client]  )
            {
                
// まだ使えないならメッセージ
                
if( g_NextUseTime[client] > GetGameTime() )
                {
                    
EmitSoundToClient(clientSOUND_NO_POWERclient___1.0);
                    
PrintToChat(client"\x05%T""CANT_USE_SPYJUTSU"clientg_NextUseTime[client] - GetGameTime());
                    return;
                }
                
                
// しゃがんだ状態・地上・移動していない
                
if( GetEntityFlags(client) & FL_DUCKING
                    
&& GetEntityFlags(client) & FL_ONGROUND
                    
&& !(GetEntityFlags(client) & FL_INWATER)
                    && 
TF2_GetPlayerSpeed(client) == 0.0
                
)
                {
                    
// 発動エフェクト
                    
new Float:pos[3];
                    new 
Float:ang[3];
                    
ang[0] = -90.0;
                    
pos[2] = -30.0;
                    
                    
AttachParticle(clientEFFECT_Disguise_SPAWN_FLASH1.0posang);
                    for(new 
010i++)
                    {
                        
pos[0] = GetRandomFloat(-5.05.0);
                        
pos[1] = GetRandomFloat(-5.05.0);
                        
AttachParticle(clientEFFECT_Disguise_SPAWN_SMOKE1.0posang);
                    }
                    
                    
// 画面を一瞬灰色に。
                    
ScreenFade(client505050255100IN);
                    
                    
// 発動サウンド
                    
EmitSoundToAll(SOUND_SPAWN_Disguiseclient__SND_CHANGEPITCH0.850);
                    
EmitSoundToAll(SOUND_START_VOICE[GetRandomInt(04)], client___1.0);
                    
                    
// 樽モデル作成
                    
g_DisguiseModel[client] = CreateEntityByName("prop_dynamic");
                    if (
IsValidEdict(g_DisguiseModel[client]))
                    {
                        new 
String:tName[32];
                        
GetEntPropString(clientProp_Data"m_iName"tNamesizeof(tName));
                        
DispatchKeyValue(g_DisguiseModel[client], "targetname""spy_Disguise");
                        
DispatchKeyValue(g_DisguiseModel[client], "parentname"tName);
                        
SetEntityModel(g_DisguiseModel[client], MDL_DISGUISE);
                        
DispatchSpawn(g_DisguiseModel[client]);
                        if(
GetClientTeam(client) == 2)
                        {
                            
SetVariantInt(1);
                            
AcceptEntityInput(g_DisguiseModel[client], "Skin");
                        }
                        
                        
SetVariantInt(99999);
                        
AcceptEntityInput(g_DisguiseModel[client], "SetHealth");    
                        
// モデルをプレイヤーの位置に移動
                        
new Float:Pos[3];
                        
GetClientAbsOrigin(clientPos);
                        
Pos[2] -=30;
                        
TeleportEntity(g_DisguiseModel[client], PosNULL_VECTORNULL_VECTOR);
                        
                    }    
                    
                    
// プレイヤーを見えなくする
                    
SetPlayerRenderHide(clienttrue);

                    
// 視点が変わらないよう前の死体を消す
                    
new body = -1;
                    while ((
body FindEntityByClassname(body"tf_ragdoll")) != -1)
                    {
                        
//PrintToChat(client, "%d %d",client, GetEntProp(body, Prop_Send, "m_iPlayerIndex"));
                        
new iOwner GetEntProp(bodyProp_Send"m_iPlayerIndex");
                        if(
iOwner == client)
                        {
                            
AcceptEntityInput(body"Kill");
                        }
                    }

                    
// 三人称視点
                    
SetEntPropEnt(clientProp_Data"m_hObserverTarget"client);
                    
SetEntProp(clientProp_Data"m_iObserverMode"1);
                
                    
// ボイスタイマー発動
                    
if(g_HideVoicehTimer[client] != INVALID_HANDLE)
                    {
                        
KillTimer(g_HideVoicehTimer[client]);
                        
g_HideVoicehTimer[client] = INVALID_HANDLE;
                    }
                    
g_HideVoicehTimer[client] = CreateTimer(3.5Timer_HideVoiceTimerclientTIMER_REPEAT);
                    
                    
// ボイスカウントリセット
                    
HideVoiceCount 0;

                    
// 現在のヘルスを保存
                    
g_NowHealth[client] = GetClientHealth(client);

                    
// 樽の中に入った
                    
g_IsDisguiseActive[client] = true;
                }
            }
        }
    }
}

/////////////////////////////////////////////////////////////////////
//
// 隠れさせる(見えなくする)
//
/////////////////////////////////////////////////////////////////////
stock SetPlayerRenderHide(any:clientbool:hide)
{
    
// 透明にする
    
if( hide )
    {
        
// プレイヤー
        
SetEntityRenderMode(clientRENDER_TRANSCOLOR);
        
SetEntityRenderColor(client2552552550);
        
        
// 武器
        
for(new 03i++)
        {
            new 
weaponIndex GetPlayerWeaponSlot(clienti);
            if( 
weaponIndex != -)
            {
                
SetEntityRenderMode(weaponIndexRENDER_TRANSCOLOR);
                
SetEntityRenderColor(weaponIndex2552552550);
            }
        }    
        
        
// 帽子
        
new hat = -1;
        while ((
hat FindEntityByClassname(hat"tf_wearable_item")) != -1)
        {
            new 
iOwner GetEntPropEnt(hatProp_Send"m_hOwnerEntity");
            if(
iOwner == client)
            {
                
SetEntityRenderMode(hatRENDER_TRANSCOLOR);
                
SetEntityRenderColor(hat2552552550);
            }
        }
    }
    else
    {
        
// プレイヤー
        
SetEntityRenderMode(clientRENDER_NORMAL);
        
SetEntityRenderColor(client255255255255);
        
        
// 武器
        
for(new 03i++)
        {
            new 
weaponIndex GetPlayerWeaponSlot(clienti);
            if( 
weaponIndex != -)
            {
                
SetEntityRenderMode(weaponIndexRENDER_TRANSCOLOR);
                
SetEntityRenderColor(weaponIndex255255255255);
            }
        }        
        
        
// 帽子
        
new hat = -1;
        while ((
hat FindEntityByClassname(hat"tf_wearable_item")) != -1)
        {
            new 
iOwner GetEntPropEnt(hatProp_Send"m_hOwnerEntity");
            if(
iOwner == client)
            {
                
SetEntityRenderMode(hatRENDER_TRANSCOLOR);
                
SetEntityRenderColor(hat255255255255);
            }
        }
    }
}

/////////////////////////////////////////////////////////////////////
//
// ボイスタイマー
//
/////////////////////////////////////////////////////////////////////
public Action:Timer_HideVoiceTimer(Handle:timerany:client)
{
    
// 発動中ならチェック
    
if(g_IsDisguiseActive[client])
    {
        if( 
IsClientInGame(client) && IsPlayerAlive(client) )
        {
            
EmitSoundToAll(SOUND_HIDE_VOICE[HideVoiceCount], client___1.0);
            
HideVoiceCount++;
            if(
HideVoiceCount 4)
            {
                
HideVoiceCount 0;
            }
            
        }
    }
    else
    {
        
// ボイスタイマー削除
        
if(g_HideVoicehTimer[client] != INVALID_HANDLE)
        {
            
KillTimer(g_HideVoicehTimer[client]);
            
g_HideVoicehTimer[client] = INVALID_HANDLE;
        }        
    }

}

/////////////////////////////////////////////////////////////////////
//
// 発動終了チェック
//
/////////////////////////////////////////////////////////////////////
stock EndCheck(any:client)
{
    
// 移動・攻撃または立つ・地上以外は解除
    
if( GetClientButtons(client) & IN_ATTACK 
        
|| GetEntityFlags(client) & FL_INWATER
    

    {
        
// ボイスタイマー停止
        
if(g_HideVoicehTimer[client] != INVALID_HANDLE)
        {
            
KillTimer(g_HideVoicehTimer[client]);
            
g_HideVoicehTimer[client] = INVALID_HANDLE;
        }

        
// プレイヤーが解除したならボイス出す
        
if( IsPlayerAlive(client) && GetEntityFlags(client) & FL_ONGROUND && !TF2_IsPlayerTaunt(client))
        {
            
EmitSoundToAll(SOUND_UNHIDE_VOICE[GetRandomInt(04)], client___1.0);
        }
        
        
// 見える
        
SetPlayerRenderHide(clientfalse);

        
// 視点を戻す
        
SetEntProp(clientProp_Send"m_iObserverMode"0);
        
        
// モデル削除
        
DeleteModel(client);
        
        
// 速度戻す
        
TF2_SetPlayerDefaultSpeed(client);
        
        
// 次に使用可能になるまでの時間設定
        
g_NextUseTime[client] = GetGameTime() + GetConVarFloat(g_ChargeTime);
                
        
// パワーチャージタイマー発動
        
if(g_PowerChargeTimer[client] != INVALID_HANDLE)
        {
            
KillTimer(g_PowerChargeTimer[client]);
            
g_PowerChargeTimer[client] = INVALID_HANDLE;
        }
        
g_PowerChargeTimer[client] = CreateTimer(GetConVarFloat(g_ChargeTime), Timer_PowerChargeTimerclient);
        
        
    }
    else
    {
        
// もしプレイヤーが移動したら樽も移動
        
if( g_DisguiseModel[client] != -&& g_DisguiseModel[client] != 0)
        {
            if( 
IsValidEntity(g_DisguiseModel[client]) )
            {
                new 
Float:Pos[3];
                
GetClientAbsOrigin(clientPos);
                
Pos[2] +=0.0;
                
TeleportEntity(g_DisguiseModel[client], PosNULL_VECTORNULL_VECTOR);
            }
        }
        
        
        
// 移動速度落とす
        //TF2_SetPlayerSpeed(client, 0.5);
        
    
}
    
}

/////////////////////////////////////////////////////////////////////
//
// パワーチャージ完了
//
/////////////////////////////////////////////////////////////////////
public Action:Timer_PowerChargeTimer(Handle:timerany:client)
{
    
g_PowerChargeTimer[client] = INVALID_HANDLE;
    
    
// ゲームに入っている
    
if( IsClientInGame(client) && IsPlayerAlive(client))
    {
        
PrintToChat(client"\x05%T""POWER_CHARGED_SPYJUTSU"client);
        
EmitSoundToClient(clientSOUND_CHARGE_POWERclient___1.0);
    }
}

/////////////////////////////////////////////////////////////////////
//
// 樽破壊
//
/////////////////////////////////////////////////////////////////////
stock BreakDisguise(any:client)
{
    
// 樽の破片
    
new gibModel CreateEntityByName("prop_physics_override");
    if (
IsValidEdict(gibModel))
    {
        
SetEntityModel(gibModelMDL_DISGUISE);
        
DispatchSpawn(gibModel);
        if(
GetClientTeam(client) == 2)
        {
            
SetVariantInt(1);
            
AcceptEntityInput(gibModel"Skin");
        }
        
        
// モデルをプレイヤーの位置に移動
        
new Float:pos[3];
        
GetEntPropVector(clientProp_Data"m_vecAbsOrigin"pos);
        
pos[2] += 30.0;
        new 
Float:ang[3];
        
GetClientEyeAngles(clientang);
        
ang[0] = 0.0;
        
ang[1] += 40.0;
        
ang[2] = 0.0;
        
TeleportEntity(gibModelposangNULL_VECTOR);
        
AcceptEntityInput(gibModel"Break");
        
RemoveEdict(gibModel);
    }    
}
/////////////////////////////////////////////////////////////////////
//
// ロッカータッチ
//
/////////////////////////////////////////////////////////////////////
//public EntityOutput_StartTouch( const String:output[], caller, activator, Float:delay )
//{
//    PrintToChat(activator, "Touch");
//    if(TF2_EdictNameEqual(activator, "player"))
//    {
//        // 次に使用可能になるまでの時間設定
//        g_NextUseTime[activator] = GetGameTime();
//    }
//}



/////////////////////////////////////////////////////////////////////
//
// モデル削除
//
/////////////////////////////////////////////////////////////////////
stock DeleteModel(any:client)
{
    
// モデルを削除
    
if( g_DisguiseModel[client] != -&& g_DisguiseModel[client] != 0)
    {
        if( 
IsValidEntity(g_DisguiseModel[client]) )
        {
            
// 樽破壊
            
BreakDisguise(client);
            
            
ActivateEntity(g_DisguiseModel[client]);
            
RemoveEdict(g_DisguiseModel[client]);
            
g_DisguiseModel[client] = -1;
        }    
    }
    
    
g_IsDisguiseActive[client] = false;
}

/////////////////////////////////////////////////////////////////////
//
// チャージ時間
//
/////////////////////////////////////////////////////////////////////
public ConVarChange_ChargeTime(Handle:convar, const String:oldValue[], const String:newValue[])
{
    
// 1.0~60.0まで
    
if (StringToFloat(newValue) < 1.0 || StringToFloat(newValue) > 60.0)
    {
        
SetConVarFloat(convarStringToFloat(oldValue), falsefalse);
        
PrintToServer("Warning: Value has to be between 1.0 and 60.0");
    }

Attached Files
File Type: smx DisguiseSpy_move_sentry_working.smx (17.7 KB, 123 views)
File Type: smx DisguiseSpy_dispenser_working.smx (17.7 KB, 128 views)
__________________

Last edited by TheSpyHunter; 09-29-2009 at 15:36.
TheSpyHunter is offline
(NW)Shane O' D
BANNED
Join Date: Aug 2009
Location: Ireland
Old 09-29-2009 , 16:00   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #19

Quote:
Originally Posted by TheSpyHunter View Post
ok try this, both tested and working.
Thanks .Will use when i get the chance.I have a couple of requests though please.
1.make it so that if i type /disguise_sg in chat or disguise_sg in console(if you are a spy) it disguises you as sentry(sg)

2.combine the sentry and the dispenser versions to make one plugin

3.add a disguise_disp(dispenser) command as well as the disguise_sg command

Last edited by (NW)Shane O' D; 09-29-2009 at 16:08. Reason: corrected a mistake :P
(NW)Shane O' D is offline
DarthNinja
SourceMod Plugin Approver
Join Date: Mar 2009
Location: PreThinkHook()
Old 09-30-2009 , 01:36   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #20

Cool, I'll test this on my server and post back tomorrow hopefully
DarthNinja is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 16:49.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode