S&box Wiki

Revision Difference

Linking_Entities_to_Hammer#544156

<cat>Code.Game</cat> <title>Linking Entities to Hammer</title> Entities defined in your addon will automatically generate an [FGD](https://developer.valvesoftware.com/wiki/FGD) and put it into your addons `config` folder. ## Creating an entity Create a partial class and make it inherit from <page text="Entity">Sandbox.Entity</page> - <page text="ModelEntity">Sandbox.ModelEntity</page>, <page text="AnimEntity">Sandbox.AnimEntity</page>, etc.. derive from this too. To link this entity to Hammer you need to add a <page text="[Library] Attribute">Sandbox.LibraryAttribute</page> to your class, this will define the entity name and description. A basic example: ```csharp [Library("info_player_spawn", Description = "It indicates the position and facing direction at which the player will spawn.")] public partial class SpawnPoint : Entity { } ``` ## Optional class attributes All of these are optional attributes that can be added to your class to change the behaviour in Hammer. ### [Hammer.Solid] <page text="[Hammer.Solid]">Hammer.SolidAttribute</page> tells Hammer this entity is brush based. ```csharp [Hammer.Solid] ``` ### [Hammer.EditorModel] <page text="[Hammer.EditorModel]">Hammer.EditorModelAttribute</page> tells Hammer what model to use for the entity and is added to the class. ```csharp [Hammer.EditorModel( "models/editor/playerstart.vmdl" )] ``` ### [Hammer.EditorSprite] <page text="[Hammer.EditorSprite]">Hammer.EditorSpriteAttribute</page> tells Hammer what model to use for the entity and is added to the class. ```csharp [Hammer.EditorSprite( "editor/info_target.vmat" )] ``` ### [Hammer.EntityTool] <page text="[Hammer.EntityTool]">Hammer.EntityToolAttribute</page> appends this Entity to Hammer's Entity tool list like so: <upload src="a5727/8d92f33819330cb.png" size="4947" name="image.png" /> ```csharp [Hammer.EntityTool( "Player Spawnpoint", "Player", "Defines a point where the player can (re)spawn" )] ``` ### [Hammer.Model] <page text="[Hammer.Model]">Hammer.ModelAttribute</page> makes it so the model, skin and bodygroups can be set and changed in Hammer. ```csharp [Hammer.Model] ``` ### [Hammer.Skip] <page text="[Hammer.Skip]">Hammer.SkipAttribute</page> can be used if you do not want your entity exposed in Hammer. ```csharp [Hammer.Skip] ``` ## Exposing properties to Hammer Any property in your class can be exposed to Hammer using the <page text="[Property] attribute">Sandbox.PropertyAttribute</page>. An example of a property being defined: ```csharp public partial class MyEntity : Entity { [Property( Name = "variable_name", Title = "Variable Title", Help = "Help text for variable" )] [Sandbox.Internal.DefaultValue( "Default Value" )]⤶ public string MyVariable { get; set; } = "Default Value"; } ``` ⤶ <note>Sandbox.Internal.DefaultValue is in the internal namespace so behavior could change.</note>⤶ Your entity properties will then show up in Hammer: <upload src="a5727/8d92f36d98ce869.png" size="11599" name="image.png" /> Supported property types: * int * float * bool * Vector3 * string * Rotation * Angles * SoundEvent * Material ## Inputs Any method in your entity class can be exposed to Hammer as an input using the <page text="[Input] attribute">Sandbox.InputAttribute</page> - parameters you define are automatically handled. An example of an input being defined: ```csharp public partial class MyEntity : Entity { [Input] public void DoSomethingElse(string str) { } [Input( Name = "DoSomething", Help = "Help text for input" )] public void SomeInput() { } } ``` ## Outputs Any <page text="Output">Sandbox.Output</page> in your entity class is automatically exposed to Hammer as an output. An example of an output being defined: ```csharp public partial class MyEntity : Entity { [Sandbox.Internal.Description( "Fires when something happens" )] public Output OnSomethingHappened; } ``` ### Firing Outputs You can fire your output using `Entity.FireOutput(name, sender)` like this: ```csharp public static void MakeItDoSomething(SomeEntity ent) { ent.FireOutput("OnSomethingHappened", null); } ``` <validate>Are additional FireOutput codegenned from the Output properties?</validate>