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>