Modding:Commands: Difference between revisions
Mirotworez (talk | contribs) m (add tvar tag) |
m (Updated navbox to new code navbox.) |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> | <languages/> | ||
{{GameVersion|1. | {{GameVersion|1.19.3}} | ||
<translate> | <translate> | ||
<!--T:1--> | <!--T:1--> | ||
Line 8: | Line 8: | ||
<!--T:3--> | <!--T:3--> | ||
The idea is to add a command which makes it easier for your | The idea is to add a command which makes it easier for your friends to locate you. Therefore we will spawn some particles alongside a playing sound, so others can see and hear where you are at the moment. | ||
== Implementation == <!--T:7--> | |||
As always, we need to create a class extending <code>ModSystem</code>: | |||
== Implementation == | |||
<!--T:7--> | |||
As always we need to create a class extending | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public class CommandMod : ModSystem | public class CommandMod : ModSystem | ||
Line 28: | Line 19: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:9--> | <!--T:9--> | ||
We will be creating a server-side command, so our mod only needs to load on the server's side: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public override bool ShouldLoad(EnumAppSide side) | public override bool ShouldLoad(EnumAppSide side) | ||
Line 39: | Line 28: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:10--> | <!--T:10--> | ||
Now we need to | Now we need to create the command itself: | ||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public override void StartServerSide(ICoreServerAPI api) | public override void StartServerSide(ICoreServerAPI api) | ||
{ | { | ||
base.StartServerSide(api); | base.StartServerSide(api); | ||
api. | AssetLocation sound = new AssetLocation("here", "sounds/partyhorn"); | ||
api.ChatCommands.Create("here") | |||
.WithDescription("spawns particles around the player") | |||
.RequiresPrivilege(Privilege.chat) | |||
.RequiresPlayer(); | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:12--> | <!--T:12--> | ||
This command can be used by any player who is allowed to send a message (by default everyone). When a player types in | This command can be used by any player who is allowed to send a message (by default everyone). When a player types in <code>/here</code>, the command will be executed. Now we the only thing missing is the actual code to spawn particles and to play the sound. | ||
<!--T:13--> | <!--T:13--> | ||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public override void StartServerSide(ICoreServerAPI api) | public override void StartServerSide(ICoreServerAPI api) | ||
{ | { | ||
base.StartServerSide(api); | base.StartServerSide(api); | ||
AssetLocation sound = new AssetLocation("here", "sounds/partyhorn"); | AssetLocation sound = new AssetLocation("here", "sounds/partyhorn"); | ||
api. | api.ChatCommands.Create("here") | ||
.WithDescription("spawns particles around the player") | |||
.RequiresPrivilege(Privilege.chat) | |||
.RequiresPlayer() | |||
.HandleWith((args) => | |||
{ | |||
var byEntity = args.Caller.Entity; | |||
Vec3d pos = byEntity.Pos.XYZ.Add(0, byEntity. | byEntity.World.PlaySoundAt(sound, byEntity); | ||
Vec3d pos = byEntity.Pos.XYZ.Add(0, byEntity.LocalEyePos.Y, 0); | |||
Random rand = new Random(); | |||
for (int i = 0; i < 100; i++) | |||
{ | |||
Vec3d realPos = pos.AddCopy(-0.1 + rand.NextDouble() * 0.2, 0, -0.1 + rand.NextDouble() * 0.2); | |||
Vec3f velocity = new Vec3f(-0.2F + (float)rand.NextDouble() * 0.4F, 0.4F + (float)rand.NextDouble() * 2F, -0.2F + (float)rand.NextDouble() * 0.4F); | |||
byEntity.World.SpawnParticles(1, ColorUtil.ToRgba(255, rand.Next(0, 255), rand.Next(0, 255), rand.Next(0, 255)), | |||
realPos, realPos, | |||
velocity, velocity, (float)rand.NextDouble() * 1 + 1, 0.01F, | |||
1, EnumParticleModel.Cube); | |||
} | |||
return TextCommandResult.Success(); | |||
}); | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<!--T:15--> | <!--T:15--> | ||
Line 101: | Line 86: | ||
<!--T:18--> | <!--T:18--> | ||
<youtube>XjHMtl6rSF4</youtube> | <youtube>XjHMtl6rSF4</youtube> | ||
</translate> | </translate> | ||
{{Navbox/ | {{Navbox/codemodding}} |
Latest revision as of 17:04, 27 March 2024
This page was last verified for Vintage Story version 1.19.3.
Ever wanted to know how to add a command to the game? If yes, this is the right place to get an answer.
Preparations
The idea is to add a command which makes it easier for your friends to locate you. Therefore we will spawn some particles alongside a playing sound, so others can see and hear where you are at the moment.
Implementation
As always, we need to create a class extending ModSystem
:
public class CommandMod : ModSystem
{
}
We will be creating a server-side command, so our mod only needs to load on the server's side:
public override bool ShouldLoad(EnumAppSide side)
{
return side == EnumAppSide.Server;
}
Now we need to create the command itself:
public override void StartServerSide(ICoreServerAPI api)
{
base.StartServerSide(api);
AssetLocation sound = new AssetLocation("here", "sounds/partyhorn");
api.ChatCommands.Create("here")
.WithDescription("spawns particles around the player")
.RequiresPrivilege(Privilege.chat)
.RequiresPlayer();
}
This command can be used by any player who is allowed to send a message (by default everyone). When a player types in /here
, the command will be executed. Now we the only thing missing is the actual code to spawn particles and to play the sound.
public override void StartServerSide(ICoreServerAPI api)
{
base.StartServerSide(api);
AssetLocation sound = new AssetLocation("here", "sounds/partyhorn");
api.ChatCommands.Create("here")
.WithDescription("spawns particles around the player")
.RequiresPrivilege(Privilege.chat)
.RequiresPlayer()
.HandleWith((args) =>
{
var byEntity = args.Caller.Entity;
byEntity.World.PlaySoundAt(sound, byEntity);
Vec3d pos = byEntity.Pos.XYZ.Add(0, byEntity.LocalEyePos.Y, 0);
Random rand = new Random();
for (int i = 0; i < 100; i++)
{
Vec3d realPos = pos.AddCopy(-0.1 + rand.NextDouble() * 0.2, 0, -0.1 + rand.NextDouble() * 0.2);
Vec3f velocity = new Vec3f(-0.2F + (float)rand.NextDouble() * 0.4F, 0.4F + (float)rand.NextDouble() * 2F, -0.2F + (float)rand.NextDouble() * 0.4F);
byEntity.World.SpawnParticles(1, ColorUtil.ToRgba(255, rand.Next(0, 255), rand.Next(0, 255), rand.Next(0, 255)),
realPos, realPos,
velocity, velocity, (float)rand.NextDouble() * 1 + 1, 0.01F,
1, EnumParticleModel.Cube);
}
return TextCommandResult.Success();
});
}
If you want to learn more about how to use particles you can check out this tutorial.
Testing
Finally, we are ready to run our first test:
Code Modding | |||||||
---|---|---|---|---|---|---|---|
Basics | Code Mods • Preparing For Code Mods • Creating A Code Mod | ||||||
Tutorials |
|
||||||
Advanced | Server-Client Considerations • Setting up your Development Environment • Advanced Blocks • Advanced Items • Block and Item Interactions • Block Behavior • Block Entity • Particle Effects • World Access • Inventory Handling • Commands • GUIs • Network API • Monkey patching (Harmony) | ||||||
Data Management | VCDBS format • Savegame Moddata • ModConfig File • Chunk Moddata • Serialization Formats • TreeAttribute | ||||||
Worldgen | WorldGen API • NatFloat • EvolvingNatFloat | ||||||
Rendering | Shaders and Renderers |
Wondering where some links have gone?
The modding navbox is going through some changes! Check out Navigation Box Updates for more info and help finding specific pages.
Modding | |
---|---|
Modding Introduction | Getting Started • Theme Pack |
Content Modding | Content Mods • Developing a Content Mod • Basic Tutorials • Intermediate Tutorials • Advanced Tutorials • Content Mod Concepts |
Code Modding | Code Mods • Setting up your Development Environment |
Property Overview | Item • Entity • Entity Behaviors • Block • Block Behaviors • Block Classes • Block Entities • Block Entity Behaviors • Collectible Behaviors • World properties |
Workflows & Infrastructure | Modding Efficiency Tips • Mod-engine compatibility • Mod Extensibility • VS Engine |
Additional Resources | Community Resources • Modding API Updates • Programming Languages • List of server commands • List of client commands • Client startup parameters • Server startup parameters Example Mods • API Docs • GitHub Repository |