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

Spy Disguise: Sentry *Beta*


Post New Thread Reply   
 
Thread Tools Display Modes
(NW)Shane O' D
BANNED
Join Date: Aug 2009
Location: Ireland
Old 09-30-2009 , 11:11   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #21

Quote:
Originally Posted by TheSpyHunter View Post
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");
    }

Please post the source(.sp) files as internet explorer and firefox make チャージ時間 into ??????
(NW)Shane O' D is offline
TheSpyHunter
Senior Member
Join Date: Jul 2009
Old 09-30-2009 , 11:17   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #22

see attached
Attached Files
File Type: sp Get Plugin or Get Source (DisguiseSpy_move_sentry_working.sp - 150 views - 20.7 KB)
File Type: sp Get Plugin or Get Source (DisguiseSpy_dispenser_working.sp - 158 views - 20.8 KB)
__________________
TheSpyHunter is offline
(NW)Shane O' D
BANNED
Join Date: Aug 2009
Location: Ireland
Old 09-30-2009 , 12:44   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #23

Quote:
Originally Posted by TheSpyHunter View Post
see attached
thanks
(NW)Shane O' D is offline
TheSpyHunter
Senior Member
Join Date: Jul 2009
Old 09-30-2009 , 13:06   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #24

Is it working for you?
__________________
TheSpyHunter is offline
(NW)Shane O' D
BANNED
Join Date: Aug 2009
Location: Ireland
Old 09-30-2009 , 13:41   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #25

Quote:
Originally Posted by TheSpyHunter View Post
Is it working for you?
I don't think so...unless i am ment to say /disguise or soomething?
(NW)Shane O' D is offline
TheSpyHunter
Senior Member
Join Date: Jul 2009
Old 09-30-2009 , 14:15   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #26

No, I havent implented that yet.

You know you can only have 1 of the plugins actiavted otherwise they cancel each other out.

To activate: Spy Disguise Kit, Crouch + Alt Fire
__________________
TheSpyHunter is offline
(NW)Shane O' D
BANNED
Join Date: Aug 2009
Location: Ireland
Old 09-30-2009 , 15:51   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #27

Quote:
Originally Posted by TheSpyHunter View Post
No, I havent implented that yet.

You know you can only have 1 of the plugins actiavted otherwise they cancel each other out.

To activate: Spy Disguise Kit, Crouch + Alt Fire
I will test again on Friday...But,can't you make two different plugins(dispenser and sentry),remove the Spy Disguise Kit, Crouch + Alt Fire activation for both of them and make the sentry disguise commands disguise_sg(in console) and /disguise_sg(in chat) and the dispenser commands disguise_disp(in console) and /disguise_disp(in chat)?

They are two different commands.So,couldn't you make it so if i am disguised as a sentry,i can't disguise as a dispenser and when the plugins block it, make a message say "You are already disguised! Please undisguise first" or just make it so if i type disguise_sg and then type disguise_disp i undisguise as sentry and disguise as a dispenser?
(NW)Shane O' D is offline
(NW)Shane O' D
BANNED
Join Date: Aug 2009
Location: Ireland
Old 09-30-2009 , 16:19   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #28

Quote:
Originally Posted by TheSpyHunter View Post
Is it working for you?
No :O
When i try and compile it i get 3 "Warning 217" messages and when i try and use it in tf2, the messages appear and when i check sm plugins list it says its working.This was the error i thought i fixed earlier

Last edited by (NW)Shane O' D; 09-30-2009 at 16:27.
(NW)Shane O' D is offline
TheSpyHunter
Senior Member
Join Date: Jul 2009
Old 09-30-2009 , 16:58   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #29

What compiler are you using? Do you have the resources required?

I can compile in both 1.23 and 1.3 with no problems.

Plus it works in game.
__________________
TheSpyHunter is offline
(NW)Shane O' D
BANNED
Join Date: Aug 2009
Location: Ireland
Old 09-30-2009 , 17:46   Re: Spy Disguise: Sentry *Beta*
Reply With Quote #30

Quote:
Originally Posted by TheSpyHunter View Post
What compiler are you using? Do you have the resources required?

I can compile in both 1.23 and 1.3 with no problems.

Plus it works in game.
I will check on friday...banned using pc during week because i use it too much D:
Most of my messages are sent from my DSi(which i'm allowed use because there are no good games for it)
Does 1.3 support TF2?
Whats the difference between 1.2.3 and 1.3?
(NW)Shane O' D 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 02:23.


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