For CS:S
There is just small problem. This will print in server console:
Setting CBaseEntity to non-brush model models/props/cs_office/vending_machine.mdl
...when human player start planting. This message can be ignore.
If any bug happens, it would be: player can't run and player stay in crouch.
PHP Code:
#include <sdktools>
#define SF_TRIGGER_MOVE_AUTODISABLE 0x80
#define SF_TRIGGER_AUTO_DUCK 0x800
#define SF_TRIGGER_ALLOW_CLIENTS 0x01 // Players can fire this trigger
#define SF_TRIGGER_ALLOW_NPCS 0x02 // NPCS can fire this trigger
#define SF_TRIGGER_ALLOW_PUSHABLES 0x04 // Pushables can fire this trigger
#define SF_TRIGGER_ALLOW_PHYSICS 0x08 // Physics objects can fire this trigger
#define SF_TRIGGER_ONLY_PLAYER_ALLY_NPCS 0x10 // *if* NPCs can fire this trigger, this flag means only player allies do so
#define SF_TRIGGER_ONLY_CLIENTS_IN_VEHICLES 0x20 // *if* Players can fire this trigger, this flag means only players inside vehicles can
#define SF_TRIGGER_ALLOW_ALL 0x40 // Everything can fire this trigger EXCEPT DEBRIS!
#define SF_TRIGGER_ONLY_CLIENTS_OUT_OF_VEHICLES 0x200 // *if* Players can fire this trigger, this flag means only players outside vehicles can
#define SF_TRIG_PUSH_ONCE 0x80 // trigger_push removes itself after firing once
#define SF_TRIG_PUSH_AFFECT_PLAYER_ON_LADDER 0x100 // if pushed object is player on a ladder, then this disengages them from the ladder (HL2only)
#define SF_TRIG_TOUCH_DEBRIS 0x400 // Will touch physics debris objects
#define SF_TRIGGER_ONLY_NPCS_IN_VEHICLES 0x800 // *if* NPCs can fire this trigger, only NPCs in vehicles do so (respects player ally flag too)
#define SF_TRIGGER_DISALLOW_BOTS 0x1000 // Bots are not allowed to fire this trigger
//#define MODEL_PATH_DEFAULT "models/props/de_train/pallet_barrels.mdl" // cs:s
#define MODEL_PATH_DEFAULT "models/props/cs_office/vending_machine.mdl" // cs:s
enum struct TriggerPlayermovement
{
int ent;
int modelindex;
int userid;
bool IsRoundEnd;
}
TriggerPlayermovement trigger_playermovement;
public void OnPluginStart()
{
trigger_playermovement.ent = -1;
trigger_playermovement.IsRoundEnd = true; // if plugin is loaded manually, wait to next round_start
HookEventEx("bomb_beginplant", bomb);
HookEventEx("bomb_abortplant", bomb);
HookEventEx("bomb_planted", bomb);
HookEventEx("bomb_planted", bomb);
HookEventEx("round_end", rounds);
HookEventEx("round_freeze_end", rounds);
}
public void OnConfigsExecuted()
{
trigger_playermovement.modelindex = PrecacheModel(MODEL_PATH_DEFAULT);
}
public void rounds(Event event, const char[] name, bool dontBroadcast)
{
trigger_playermovement.IsRoundEnd = StrEqual(name, "round_end", true);
if(trigger_playermovement.IsRoundEnd &&
trigger_playermovement.ent != -1)
{
AcceptEntityInput(trigger_playermovement.ent, "FireUser1");
trigger_playermovement.ent = -1;
}
}
public void bomb(Event event, const char[] name, bool dontBroadcast)
{
trigger_playermovement.userid = 0;
if(!StrEqual(name, "bomb_beginplant", true) || trigger_playermovement.IsRoundEnd)
{
if(trigger_playermovement.ent != -1)
{
AcceptEntityInput(trigger_playermovement.ent, "FireUser1");
trigger_playermovement.ent = -1;
}
return;
}
int userid = event.GetInt("userid");
int client = GetClientOfUserId(userid);
if(!client || !IsClientInGame(client) || IsFakeClient(client))
return;
trigger_playermovement.ent = CreateEntityByName("trigger_playermovement");
if(trigger_playermovement.ent == -1)
return;
int enteffects = GetEntProp(trigger_playermovement.ent, Prop_Send, "m_fEffects");
enteffects |= 32;
SetEntProp(trigger_playermovement.ent, Prop_Send, "m_fEffects", enteffects);
int flags = SF_TRIGGER_ALLOW_CLIENTS|SF_TRIGGER_MOVE_AUTODISABLE|SF_TRIGGER_AUTO_DUCK;
char spawnflags[12];
Format(spawnflags, sizeof(spawnflags), "%i", flags);
DispatchKeyValue(trigger_playermovement.ent, "StartDisabled", "0");
DispatchKeyValue(trigger_playermovement.ent, "spawnflags", spawnflags);
DispatchKeyValue(trigger_playermovement.ent, "OnUser1", "!self,DisableAndEndTouch,,0.1,-1");
DispatchKeyValue(trigger_playermovement.ent, "OnUser1", "!self,Kill,,1.0,-1");
DispatchSpawn(trigger_playermovement.ent);
ActivateEntity(trigger_playermovement.ent);
if(trigger_playermovement.modelindex)
SetEntityModel(trigger_playermovement.ent, MODEL_PATH_DEFAULT);
float m_vecMins[] = {-20.0, -20.0, 0.0};
float m_vecMaxs[] = {20.0, 20.0, 72.0};
SetEntPropVector(trigger_playermovement.ent, Prop_Data, "m_vecMins", m_vecMins);
SetEntPropVector(trigger_playermovement.ent, Prop_Data, "m_vecMaxs", m_vecMaxs);
SetEntProp(trigger_playermovement.ent, Prop_Data, "m_nSolidType", 2);
trigger_playermovement.ent = EntIndexToEntRef(trigger_playermovement.ent);
trigger_playermovement.userid = userid;
CreateTimer(0.6, delay, trigger_playermovement.ent, TIMER_FLAG_NO_MAPCHANGE);
}
public Action delay(Handle timer, any EntRef)
{
if(EntRef != trigger_playermovement.ent)
return Plugin_Continue;
int client = GetClientOfUserId(trigger_playermovement.userid);
if(!client || !IsClientInGame(client) || !IsPlayerAlive(client) || trigger_playermovement.IsRoundEnd)
{
AcceptEntityInput(trigger_playermovement.ent, "FireUser1");
trigger_playermovement.ent = -1;
trigger_playermovement.userid = 0;
return Plugin_Continue;
}
float pos[3];
GetClientAbsOrigin(client, pos);
TeleportEntity(trigger_playermovement.ent, pos);
return Plugin_Continue;
}
*updated, added round_end check
__________________