Modding:Commands: Difference between revisions

From Vintage Story Wiki
m
Updated to 1.19.3. Now using new, non-obselete command API.
(Undo revision 55421 by Mirotworez (talk))
Tag: Undo
m (Updated to 1.19.3. Now using new, non-obselete command API.)
Line 1: Line 1:
<languages/>
<languages/>
{{GameVersion|1.15}}
{{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 mates 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.
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.


<!--T:4-->
== Implementation == <!--T:7-->
You can download the required assets [https://wiki.vintagestory.at/images/1/16/Here_Assets.zip here]. Just extract them in your mods directory and you are good to go.
As always, we need to create a class extending <code>ModSystem</code>:
 
== Implementation == <!--T:5-->
 
<!--T:6-->
First of all you need to add another mod to your workspace. I will use the modid <code>here</code>, so I will type in <code>add here</code> in modtools to create a new mod. Additionally I will create <code>Command.cs</code> in the <code>src</code> directory.
 
<!--T:7-->
As always we need to create a class extending <code>ModSystem</code>:
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
public class CommandMod : ModSystem
public class CommandMod : ModSystem
Line 29: Line 21:


<!--T:9-->
<!--T:9-->
Commands are processed by the server, so our mod only needs to load on the server's side:
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 38: Line 30:


<!--T:10-->
<!--T:10-->
Now we need to register the command itself:
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.RegisterCommand("here", "spawns particles around the player", "",
            AssetLocation sound = new AssetLocation("here", "sounds/partyhorn");
                (IServerPlayer player, int groupId, CmdArgs args) =>
             api.ChatCommands.Create("here")
                    {
            .WithDescription("spawns particles around the player")
 
            .RequiresPrivilege(Privilege.chat)
                    <!--T:11-->
            .RequiresPlayer();
}, Privilege.chat);
         }
         }
</syntaxhighlight>
</syntaxhighlight>
Line 60: Line 51:
         {
         {
             base.StartServerSide(api);
             base.StartServerSide(api);
             AssetLocation sound = new AssetLocation("here", "sounds/partyhorn"); // Create sound location
             AssetLocation sound = new AssetLocation("here", "sounds/partyhorn");
             api.RegisterCommand("here", "spawns particles around the player", "",
             api.ChatCommands.Create("here")
                (IServerPlayer player, int groupId, CmdArgs args) =>
            .WithDescription("spawns particles around the player")
                    {
            .RequiresPrivilege(Privilege.chat)
                        EntityPlayer byEntity = player.Entity;
            .RequiresPlayer()
                        byEntity.World.PlaySoundAt(sound, byEntity); // Play sound
            .HandleWith((args) =>
 
            {
                        <!--T:14-->
                var byEntity = args.Caller.Entity;
Vec3d pos = byEntity.Pos.XYZ.Add(0, byEntity.EyeHeight, 0); // Setting up position to spawn particles
                byEntity.World.PlaySoundAt(sound, byEntity);
                        Random rand = new Random();
                Vec3d pos = byEntity.Pos.XYZ.Add(0, byEntity.LocalEyePos.Y, 0);
                        for (int i = 0; i < 100; i++) // Spawn 100 particles
                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);
                    Vec3d realPos = pos.AddCopy(-0.1 + rand.NextDouble() * 0.2, 0, -0.1 + rand.NextDouble() * 0.2);
                            byEntity.World.SpawnParticles(1, ColorUtil.ColorFromRgba(255, rand.Next(0, 255), rand.Next(0, 255), rand.Next(0, 255)),
                    Vec3f velocity = new Vec3f(-0.2F + (float)rand.NextDouble() * 0.4F, 0.4F + (float)rand.NextDouble() * 2F, -0.2F + (float)rand.NextDouble() * 0.4F);
                                realPos, realPos,
                    byEntity.World.SpawnParticles(1, ColorUtil.ToRgba(255, rand.Next(0, 255), rand.Next(0, 255), rand.Next(0, 255)),
                                velocity, velocity, (float) rand.NextDouble()*1 + 1, 0.01F,
                        realPos, realPos,
                                1, EnumParticleModel.Cube);
                        velocity, velocity, (float)rand.NextDouble() * 1 + 1, 0.01F,
                        }
                        1, EnumParticleModel.Cube);
                    }, Privilege.chat);
                }
                return TextCommandResult.Success();
            });
         }
         }
</syntaxhighlight>
</syntaxhighlight>
Line 93: Line 86:
<!--T:18-->
<!--T:18-->
<youtube>XjHMtl6rSF4</youtube>
<youtube>XjHMtl6rSF4</youtube>
== Download == <!--T:19-->
<!--T:20-->
Feel free to try it out yourself:
<!--T:21-->
[https://wiki.vintagestory.at/images/5/5f/Here_v1.1.zip Here_v1.1.zip]
</translate>
</translate>
{{Navbox/modding|Vintage Story}}
{{Navbox/modding|Vintage Story}}
Confirmedusers
553

edits