Revision Difference
Linking_Entities_to_Hammer#546872
<cat>Code.Game</cat>
<title>Linking Entities to Hammer</title>
Entities defined in your addon are imported through the Entity Tool. Entities are now loaded directly from the game assembly making [FGDs](https://developer.valvesoftware.com/wiki/FGD) obsolete.
# Creating an entity
To link your entity to Hammer you need to add a [Library] attribute to your class, this will define the entity class name. The description is automatically set from the summary code comment.
To link your entity to Hammer you need to add a [Library] attribute to your class, this will define the entity class name. The description is automatically set from the summary code comment. You'll also need to use `[HammerEntity]` to register it in the Hammer Entity Tool.
A basic example:
```csharp
/// <summary>
/// This entity defines the spawn point of the player in first person shooter gamemodes.
/// </summary>
[HammerEntity]⤶
[Library( "info_player_start" )]
[Display( Name = "Player Spawnpoint" ), Category( "Player" ), Icon( "place" )]
public class SpawnPoint : Entity
{
}
```
⤶
<warning>⤶
As of [Pain Day III](https://github.com/Facepunch/sbox-issues/discussions/1846), Hammer entities became opt-in instead of automatically being added to the entity tool. Make sure to use the correct attribute:⤶
⤶
```csharp⤶
[HammerEntity]⤶
```⤶
⤶
</warning>⤶
# Hammer Attributes
All of these are optional attributes that can be added to your class to change the behaviour in Hammer.
## [Hammer.Solid]
Tells Hammer this entity is brush based.
```csharp
[Hammer.Solid]
```
## [Hammer.SupportsSolid]
Tells Hammer this point entity can also be a brush entity, such as `ent_door` entity.
```csharp
[Hammer.SupportsSolid]
```
## [Hammer.EditorModel]
Tells Hammer what model to use for the entity and is added to the class.
```csharp
[Hammer.EditorModel( "models/editor/playerstart.vmdl" )]
```
## [Hammer.EditorSprite]
Tells Hammer what sprite to use for the entity and is added to the class.
```csharp
[Hammer.EditorSprite( "editor/info_target.vmat" )]
```
## [Hammer.EntityTool]
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]
Makes it so the model, skin and bodygroups can be set and changed in Hammer.
```csharp
[Hammer.Model]
```
## [Hammer.Skip]
Can be used if you do not want your entity exposed in Hammer.
```csharp
[Hammer.Skip]
```
## [Hammer.AutoApplyMaterial]
Automatically applies the supplied material to the tied brush.
```csharp
[Hammer.AutoApplyMaterial( "materials/tools/toolstrigger.vmat" )]
```
# Hammer Properties
Any property in your class can be exposed to Hammer using the [Property] attribute</page>.
An example of a property being defined:
```csharp
public partial class MyEntity : Entity
{
/// <summary>
/// Help text in hammer
/// </summary>
[Property( Title = "Start Disabled" ) ]
public bool StartDisabled { get; set; } = false;
}
```
Your entity properties will then show up in Hammer:
<upload src="a5727/8d92f36d98ce869.png" size="11599" name="image.png" />
# Inputs
Any method in your entity class can be exposed to Hammer as an input using the [Input] attribute - parameters you define are automatically handled.
An example of an input being defined:
```csharp
public partial class MyEntity : Entity
{
/// <summary>
/// Description of my input to be displayed in Hammer and in Visual Studio
/// </summary>
[Input]
public void DoSomethingElse(string str)
{
}
[Input( Name = "DoSomething" )]
public void SomeInput()
{
}
}
```
# Outputs
Any output 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
{
/// <summary>
/// Description of my output to be displayed in Hammer and in Visual Studio
/// </summary>
public Output OnSomethingHappened;
}
```
# Firing Outputs
You can fire your output using `Entity.FireOutput(name, sender)` like this:
```csharp
protected Output OnEndTouch { get; set; }
public virtual void OnTouchEnd( Entity toucher )
{
OnEndTouch.Fire( toucher );
}
```