Modding:Adding Block Behavior/es: Difference between revisions
(Created page with "<syntaxhighlight lang="c#"> distance = properties["distance"].AsInt(1); pull = properties["pull"].AsBool(false); </syntaxhighlight>") |
(Created page with "Lo siguiente que tenemos que cambiar es el propio método interact, para que se encargue de las propiedades de distancia y accionar... <syntaxhighlight lang="c#"> public override bool OnPlayerInteract(IWorldAccessor world, IPlayer byPlayer, BlockSelection blockSel, ref EnumHandling handling) { BlockPos pos = blockSel.Position.AddCopy(pull && byPlayer.WorldData.EntityControls.Sneak ? blockSel.Face : blockSel.Face.GetOpposite(), distance);...") |
||
Line 143: | Line 143: | ||
---- | ---- | ||
Lo siguiente que tenemos que cambiar es el propio método interact, para que se encargue de las propiedades de distancia y accionar... | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public override bool OnPlayerInteract(IWorldAccessor world, IPlayer byPlayer, BlockSelection blockSel, ref EnumHandling handling) | public override bool OnPlayerInteract(IWorldAccessor world, IPlayer byPlayer, BlockSelection blockSel, ref EnumHandling handling) |
Revision as of 14:57, 15 June 2023
This page was last verified for Vintage Story version 1.9.
Introducción
Los comportamientos de bloque son útiles cuando se desea que diferentes bloques actúen de la misma manera, ya que se pueden adjuntar uno o más comportamientos de bloque a un número arbitrario de bloques. Puede que le interese echar un vistazo a las comportamientos de bloque existentes antes de implementar las suyas propias.
En este tutorial crearemos un nuevo comportamiento que podremos adjuntar a los bloques para hacerlos móviles haciendo clic con el botón derecho del ratón.
Configuración
Se requiere un espacio de trabajo de desarrollo. Además, necesitarás los recursos (tipo de bloque, textura y archivo lang). Se puede crear una propia o utilizar los que ya están hechos: Moving - No CS File.zip
Creación del comportamiento
Así que en primer lugar tenemos que crear el comportamiento en sí, que es una clase que extiende BlockBehavior
class Moving : BlockBehavior
{
public Moving(Block block) : base(block)
{
}
}
Esta clase proporciona varios métodos que podemos anular. Si utilizas Visual Studio puedes encontrar una lista completa de métodos pasando el ratón por encima de "BlockBehavior" y pulsando "F12".
El método bool OnPlayerInteract(IWorldAccessor world, IPlayer byPlayer, BlockSelection blockSel, ref EnumHandling handling)
parece ideal para nuestro propósito.
¿Qué debe hacer?
- Calcula la nueva posición del bloque en función de la cara que mire el jugador
- Comprueba si el bloque se puede colocar en esta posición
- Retira el bloque original
- Coloca el nuevo bloque utilizando la posición calculada anteriormente
public override bool OnPlayerInteract(IWorldAccessor world, IPlayer byPlayer, BlockSelection blockSel, ref EnumHandling handling)
{
// Encontrar la posición objetivo
BlockPos pos = blockSel.Position.AddCopy(blockSel.Face.GetOpposite());
// ¿Podemos colocar el bloque ahí?
if (world.BlockAccessor.GetBlock(pos).IsReplacableBy(block))
{
// Elimina el bloque de la posición actual y lo coloca en la posición de destino
world.BlockAccessor.SetBlock(0, blockSel.Position);
world.BlockAccessor.SetBlock(block.BlockId, pos);
}
// Notificar al motor del juego otros comportamientos de bloque que manejamos la interacción de los jugadores con el bloque.
// Si no fijáramos el campo de manipulación, el jugador seguiría pudiendo colocar bloques si los tiene en las manos.
handling = EnumHandling.PreventDefault;
return true;
}
Registro
Para registrar el BlockBehavior tenemos que crear una clase mod, anular Start(ICoreAPI)
y registrarlo con el nombre dado:
public class MovingBlocks : ModSystem
{
public override void Start(ICoreAPI api)
{
base.Start(api);
api.RegisterBlockBehaviorClass("Moving", typeof(Moving));
}
}
Distribución
Para terminar todo, abre el modtools y teclea pack <tú mod id>
. Ahora puedes coger el archivo zip y compartirlo con otras personas.
- para VS 1.9: Moving_v1.0.0.zip
- para VS 1.6: Moving.zip
Testeo
Comportamiento avanzado
Nuestro comportamiento sigue siendo bastante simple, pero hay muchas más posibilidades. Un comportamiento puede tener propiedades especiales, que pueden ser definidas por el propio tipo de bloque.
Ejemplo
El comportamiento líquido admite algunas propiedades especiales, como se muestra en este ejemplo del tipo de bloque agua:
behaviors: [
{
name: "FiniteSpreadingLiquid",
properties:
{
spreadDelay: 150,
liquidCollisionSound: "hotmetal",
sourceReplacementCode: "obsidian",
flowingReplacementCode: "basalt"
}
}
],
Propiedades de análisis
Para ocuparse de las propiedades especiales existe un método llamado Initialize(JsonObject)
. Cada tipo de bloque crea una nueva instancia del comportamiento, por lo que el método se puede utilizar para analizar las propiedades.
¿Qué tipo de propiedades podríamos añadir?
- distancia de empuje
- Bloqueo si el jugador se agacha
En primer lugar, tenemos que anular el método en nuestra clase de comportamiento de bloque ...
public override void Initialize(JsonObject properties)
{
base.Initialize(properties);
}
Además necesitamos añadir dos campos, uno para la distancia y otro si el jugador acciona el bloqueo mientras se escabulle
public int distance = 1;
public bool pull = false;
Ahora podemos analizar las dos propiedades de la siguiente manera:
distance = properties["distance"].AsInt(1);
pull = properties["pull"].AsBool(false);
Lo siguiente que tenemos que cambiar es el propio método interact, para que se encargue de las propiedades de distancia y accionar...
public override bool OnPlayerInteract(IWorldAccessor world, IPlayer byPlayer, BlockSelection blockSel, ref EnumHandling handling)
{
BlockPos pos = blockSel.Position.AddCopy(pull && byPlayer.WorldData.EntityControls.Sneak ? blockSel.Face : blockSel.Face.GetOpposite(), distance);
if (world.BlockAccessor.GetBlock(pos).IsReplacableBy(block))
{
world.BlockAccessor.SetBlock(0, blockSel.Position);
world.BlockAccessor.SetBlock(block.BlockId, pos);
}
handling = EnumHandling.PreventDefault;
return true;
}
Adding another block
Let's create another block using this behavior, but this time we will configure some additional properties ...
behaviors: [
{
name: "Moving",
properties: {
"distance": 2,
"pull": true
}
}
],
The block will be pushed two blocks instead of one and the player can pull it by sneaking while right clicking.
Descarga de Mod
- para VS 1.9: AdvancedMoving_v1.0.0.zip
- para VS 1.6: AdvancedMoving.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 • Pack Temático |
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 |