Learn to read, idiots.
There's code from @AddonExtensions
Example
Code:
public override void OnServerFrame()
{
// This is required for timers to work.
Timing.ProcessFrame(GetClients());
}
private int _stealthBombFx;
public override void OnPrecache()
{
// Load the stealth_bomb_mp FX, it is important to preload ALL fx in the OnPrecache override.
_stealthBombFx = Extensions.LoadFX("explosions/stealth_bomb_mp");
}
public override void OnPlayerConnect(ServerClient client)
{
// Display a message in the console when someone is hurt and how much health they lost.
// Note how .As<T> was used. Supported types are: int, float, bool, Vector, Entity, ServerClient
// The 'client' is also optional, but it allows you to filter the message for that player/entity only.
// In GSC, this is the equivalent of:
// self waittill("damage", amount);
Timing.OnNotify("damage", client, (amount, attacker) =>
{
ServerPrint(client.Name + " was damaged and lost " + amount.As<int>() + " HP.");
if (attacker.IsPlayer)
ServerPrint(client.Name + "'s attacker was: " + attacker.As<ServerClient>().Name);
});
// Display a message to the client every 5 seconds.
// Note how ServerClient can be passed as a second argument (optional), but this allows
// the timer to remove/stop the timer automatically in-case the client disconnects.
Timing.OnInterval(5000, client, () =>
{
iPrintLnBold("Testing!", client);
// Let the timer know to keep going. Return false to remove/stop the timer.
return true;
});
// Override class selection.
Timing.OnNotify("menuresponse", client, menu =>
{
// Check that the menu name is "team_marinesopfor" (this is the value of game["menu_team"])
if(menu.As<string>() == "team_marinesopfor")
{
// Tell the code in _menu.gsc that we want to change to class0.
// Note how I put the delay, if that's not there, it screws up the menu.
Timing.AfterDelay(100, () => Timing.Notify(client, "menuresponse", "changeclass", "class0"));
}
});
}
public override void OnPlayerSpawned(ServerClient client)
{
// Spawn a care package with a collision, making it solid.
var origin = new Vector(client.OriginX, client.OriginY, client.OriginZ);
Entity ent = SpawnModel("script_model", "com_plasticcase_green_big_us_dirt", origin);
Extensions.CloneBrushModelToScriptModel(ent, Extensions.FindAirdropCrateCollisionId());
// Display the care package's angles, should display (0, 0, 0)
// You can remove this code, it's only to demonstrate what Extensions.GetAngles can do.
Vector angles = Extensions.GetAngles(ent);
TellClient(client.ClientNum, string.Format("The care package's angles are: ({0}, {1}, {2})", angles.X, angles.Y, angles.Z), true);
// Rotate the care package 90 degrees.
Extensions.SetAngles(ent, new Vector(0, 90, 0));
// After 2 seconds, play an explosion FX on top of the care package.
Timing.AfterDelay(2000, () =>
{
origin.Z += 30;
Extensions.PlayFX(_stealthBombFx, origin);
});
}