Modding:Взаимодействие Блоков и Предметов
Эта страница проверялась в последний раз для версии Vintage Story 1.19.3.
Этот урок познакомит вас с основами пользовательских взаимодействий. Мы создадим волшебную палочку, которая будет создавать частицы при нажатии правой кнопки мыши.
Подготовка
Я настоятельно рекомендую сначала прочитать о Классах Предмета. Кроме того, вы можете скачать ассеты здесь.
Все это уже должно быть вам знакомо: создание и регистрация класса предмета ...
public class Magic : ModSystem
{
public override void Start(ICoreAPI api)
{
base.Start(api);
api.RegisterItemClass("ItemMagicWand", typeof(ItemMagicWand));
}
}
public class ItemMagicWand : Item
{
}
Добавление частиц
Теперь нам нужно реализовать функцию взаимодействия. Прежде всего нам нужно указать, что игрок может "использовать" этот инструмент, поэтому нам нужно установить handling в handled
...
public override void OnHeldInteractStart(ItemSlot slot, EntityAgent byEntity, BlockSelection blockSel, EntitySelection entitySel, bool firstEvent, ref EnumHandHandling handling)
{
handling = EnumHandHandling.Handled;
}
Метод OnHeldInteractStep
позволяет нам создавать частицы за тик, до тех пор, пока игрок использует предмет, но лучше перед этим реализовать анимацию. Частицы должны появляться после завершения анимации ...
public override bool OnHeldInteractStep(float secondsUsed, ItemSlot slot, EntityAgent byEntity, BlockSelection blockSel, EntitySelection entitySel)
{
if (byEntity.World is IClientWorldAccessor)
{
ModelTransform tf = new ModelTransform();
tf.EnsureDefaultValues();
tf.Origin.Set(0, -1, 0);
tf.Rotation.Z = Math.Min(30, secondsUsed * 40);
byEntity.Controls.UsingHeldItemTransformAfter = tf;
}
return true;
}
Удерживая правую кнопку мыши ...
Итак, давайте начнем работу с частицами, нам нужен статический тип частиц...
public static SimpleParticleProperties particles = new SimpleParticleProperties(
1, 1,
ColorUtil.ColorFromRgba(220, 220, 220, 50),
new Vec3d(),
new Vec3d(),
new Vec3f(-0.25f, 0.1f, -0.25f),
new Vec3f(0.25f, 0.1f, 0.25f),
1.5f,
-0.075f,
0.25f,
0.25f,
EnumParticleModel.Quad
);
Частицы должны появиться после завершения анимации. Это произойдет через 0.6
секунд ...
if (secondsUsed > 0.6)
{
//Spawn particles
}
Рекомендую сначала прочитать руководство по Простым Частицам. Этот код будет создавать частицы перед игроком с рандомизированным цветом и синусоидально изменяющегося размера ...
Vec3d pos =
byEntity.Pos.XYZ.Add(0, byEntity.LocalEyePos.Y, 0)
.Ahead(1f, byEntity.Pos.Pitch, byEntity.Pos.Yaw)
;
Vec3f speedVec = new Vec3d(0, 0, 0).Ahead(5, byEntity.Pos.Pitch, byEntity.Pos.Yaw).ToVec3f();
particles.MinVelocity = speedVec;
Random rand = new Random();
particles.Color = ColorUtil.ColorFromRgba(rand.Next(0, 255), rand.Next(0, 255), rand.Next(0, 255), 255);
particles.MinPos = pos.AddCopy(-0.05, -0.05, -0.05);
particles.AddPos.Set(0.1, 0.1, 0.1);
particles.MinSize = 0.1F;
particles.SizeEvolve = EvolvingNatFloat.create(EnumTransformFunction.SINUS, 10);
byEntity.World.SpawnParticles(particles);
If we put everything together the OnHeldInteractStep
method will look like this ...
public override bool OnHeldInteractStep(float secondsUsed, ItemSlot slot, EntityAgent byEntity, BlockSelection blockSel, EntitySelection entitySel)
{
if (byEntity.World is IClientWorldAccessor)
{
ModelTransform tf = new ModelTransform();
tf.EnsureDefaultValues();
tf.Origin.Set(0, -1, 0);
tf.Rotation.Z = Math.Min(30, secondsUsed * 40);
byEntity.Controls.UsingHeldItemTransformAfter = tf;
if (secondsUsed > 0.6)
{
Vec3d pos =
byEntity.Pos.XYZ.Add(0, byEntity.LocalEyePos.Y, 0)
.Ahead(1f, byEntity.Pos.Pitch, byEntity.Pos.Yaw)
;
Vec3f speedVec = new Vec3d(0, 0, 0).Ahead(5, byEntity.Pos.Pitch, byEntity.Pos.Yaw).ToVec3f();
particles.MinVelocity = speedVec;
Random rand = new Random();
particles.Color = ColorUtil.ColorFromRgba(rand.Next(0, 255), rand.Next(0, 255), rand.Next(0, 255), 255);
particles.MinPos = pos.AddCopy(-0.05, -0.05, -0.05);
particles.AddPos.Set(0.1, 0.1, 0.1);
particles.MinSize = 0.1F;
particles.SizeEvolve = EvolvingNatFloat.create(EnumTransformFunction.SINUS, 10);
byEntity.World.SpawnParticles(particles);
}
}
return true;
}
Testing
Now we can run our first test, doesn't it look beautiful?
Mod Download
Feel free to try it out yourself:
Here is my version:
- for VS v1.9: Magicwand_vs1.9_v1.0.0.zip
- for VS v1.8: MagicWand.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 • Block • Block Behaviors • Block Classes • Block Entities • Block Entity 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 |