Modding:Advanced Items/ru: Difference between revisions
(Created page with "Это руководство по ''code mod'' требует наличия среды разработки. Если у вас её нет, перейдите на страницу Setting up your Development Environment и следуйте инструкции. Также настоятельно рекомендуется прочитать и закончить руководство по Basic Item.") Tags: Mobile edit Mobile web edit |
(Created page with " __FORCETOC__ {{GameVersion|1.19.3}}") |
||
Line 1: | Line 1: | ||
<languages/> | <languages/> | ||
__FORCETOC__ | __FORCETOC__ | ||
{{GameVersion|1.19.3}} | {{GameVersion|1.19.3}} | ||
Это руководство по ''code mod'' требует наличия среды разработки. Если у вас её нет, перейдите на страницу [[Setting up your Development Environment]] и следуйте инструкции. Также настоятельно рекомендуется прочитать и закончить руководство по [[Basic Item]]. | Это руководство по ''code mod'' требует наличия среды разработки. Если у вас её нет, перейдите на страницу [[Setting up your Development Environment]] и следуйте инструкции. Также настоятельно рекомендуется прочитать и закончить руководство по [[Basic Item]]. |
Revision as of 14:45, 24 March 2024
Эта страница проверялась в последний раз для версии Vintage Story 1.19.3.
Это руководство по code mod требует наличия среды разработки. Если у вас её нет, перейдите на страницу Setting up your Development Environment и следуйте инструкции. Также настоятельно рекомендуется прочитать и закончить руководство по Basic Item.
Creating a Tunnel Pickaxe
In this tutorial will we create a item with more advanced functionality: A pickaxe which allows you to dig a 3x3 tunnel by mining just one block.
Item Assets
Similar to the Basic Item, we need to create our item's assets, including an itemtype, texture and a lang file. Those assets are pretty straight forward and you can download them here. Extract the file to your mods folder, and you are ready to start programming.
There is only one new property in your itemtype json, class
. This property tells our new item to be controlled by a certain C# class.
class: "tunnler",
We will create this class to give the item the desired functionality.
The Item Class
Creating our item requires a couple new *.cs
files in our project.
If you have read the Advanced Blocks Tutorial already, this should be familar to you.
The Mod System
In order to register your item class, we need to create a mod, which is a class extending ModSystem:
public class TunnlerMod : ModSystem
{
}
By overriding the Start(ICoreAPI)
method, we can register our class. The RegisterItemClass
function has two parameters: the first is our item class ID, noteably this is how we link to this class in our itemtype json files. Ensure that this is identical to the class we specified in our earlier asset file. The second parameter is the type of our item class.
public class TunnlerMod : ModSystem
{
public override void Start(ICoreAPI api)
{
base.Start(api);
api.RegisterItemClass("tunnler", typeof(TunnlerItem));
}
}
This should be marked as a syntax error because there is no TunnlerItem
class yet.
The Item Class
When naming item scripts, it is recommended to name them in the format "{Name}Item". In the case of the tunnler pickaxe, we shall name our script TunnlerItem.cs
. Any itemclass has to extend Item, giving it the functionality we need to access:
public class TunnlerItem : Item
{
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
}
This should solve all syntax errors.
So what should our tool do? Once the player mines a block with this tool every block around it should be mined as well.
As always, we can refer to the item api docs to find a function we can use. Although the item class itself does not contain an appropriate function, we can also check the CollectibleObject api docs, which the item class extends from.
In our specific case, we can override the method bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel, float dropQuantityMultiplier = 1)
.
We need to be aware of the facing (which side the player is focusing) and if the player is in creative or survival mode (whether items should be dropped or not). Before we are going to override OnBlockBrokenWith
we should create a method which destroys all blocks between two block positions (min & max). It should also only drop items if the player is in survival mode:
public void DestroyBlocks(IWorldAccessor world, BlockPos min, BlockPos max, IPlayer player)
{
BlockPos tempPos = new BlockPos();
for (int x = min.X; x <= max.X; x++)
{
for (int y = min.Y; y <= max.Y; y++)
{
for (int z = min.Z; z <= max.Z; z++)
{
tempPos.Set(x, y, z);
if (player.WorldData.CurrentGameMode == EnumGameMode.Creative)
world.BlockAccessor.SetBlock(0, tempPos);
else
world.BlockAccessor.BreakBlock(tempPos, player);
}
}
}
}
Now we can implement OnBlockBroken
rather easily, by taken care of every possible axis the player could face:
public override bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel, float dropQuantityMultiplier = 1)
{
if (base.OnBlockBrokenWith(world, byEntity, itemslot, blockSel))
{
if (byEntity is EntityPlayer)
{
IPlayer player = world.PlayerByUid((byEntity as EntityPlayer).PlayerUID);
switch (blockSel.Face.Axis)
{
case EnumAxis.X:
destroyBlocks(world, blockSel.Position.AddCopy(0, -1, -1), blockSel.Position.AddCopy(0, 1, 1), player);
break;
case EnumAxis.Y:
destroyBlocks(world, blockSel.Position.AddCopy(-1, 0, -1), blockSel.Position.AddCopy(1, 0, 1), player);
break;
case EnumAxis.Z:
destroyBlocks(world, blockSel.Position.AddCopy(-1, -1, 0), blockSel.Position.AddCopy(1, 1, 0), player);
break;
}
}
return true;
}
return false;
}
If you have done everything right, your file should look similar to this:
using Vintagestory.API.Common;
using Vintagestory.API.Common.Entities;
using Vintagestory.API.MathTools;
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
namespace ExampleMods
{
public class TunnlerMod : ModSystem
{
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
public override void Start(ICoreAPI api)
{
base.Start(api);
api.RegisterItemClass("tunnler", typeof(TunnlerItem));
}
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
}
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
public class TunnlerItem : Item
{
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
public void DestroyBlocks(IWorldAccessor world, BlockPos min, BlockPos max, IPlayer player)
{
BlockPos tempPos = new BlockPos();
for (int x = min.X; x <= max.X; x++)
{
for (int y = min.Y; y <= max.Y; y++)
{
for (int z = min.Z; z <= max.Z; z++)
{
tempPos.Set(x, y, z);
if (player.WorldData.CurrentGameMode == EnumGameMode.Creative)
world.BlockAccessor.SetBlock(0, tempPos);
else
world.BlockAccessor.BreakBlock(tempPos, player);
}
}
}
}
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
public override bool OnBlockBrokenWith(IWorldAccessor world, Entity byEntity, ItemSlot itemslot, BlockSelection blockSel, float dropQuantityMultiplier = 1)
{
if (base.OnBlockBrokenWith(world, byEntity, itemslot, blockSel))
{
if (byEntity is EntityPlayer)
{
IPlayer player = world.PlayerByUid((byEntity as EntityPlayer).PlayerUID);
switch (blockSel.Face.Axis)
{
case EnumAxis.X:
destroyBlocks(world, blockSel.Position.AddCopy(0, -1, -1), blockSel.Position.AddCopy(0, 1, 1), player);
break;
case EnumAxis.Y:
destroyBlocks(world, blockSel.Position.AddCopy(-1, 0, -1), blockSel.Position.AddCopy(1, 0, 1), player);
break;
case EnumAxis.Z:
destroyBlocks(world, blockSel.Position.AddCopy(-1, -1, 0), blockSel.Position.AddCopy(1, 1, 0), player);
break;
}
}
return true;
}
return false;
}
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
}
}
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
You can also download the file directly: Tunnler.cs.
Testing
This is how it looks ingame:
Distribution
Using the new Mod Template
If using the mod template setup, follow the instructions on Setting up your Development Environment to pack and distribute your mod.
Using the (old) Modtools
If using the modtools program, open the modtools and type in pack <your mod id>
. Now you can take the zip file and share it with other people. It will work in the same way as ordinary mods, you can install it by copying it into the mods
folder.
Mod Download
Here is my version:
- for VS v1.9: Tunnler_vs1.9_v1.0.0.zip
- for VS v1.8: Tunnler.zip
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 • Пакет тем |
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 |