Modding:Bloque Básico
This page was last verified for Vintage Story version 1.15.
Por favor, lee primero el tutorial Primeros pasos, si no lo has hecho ya. Este tutorial debería introducirte en lo básico de añadir un bloque al juego usando archivos JSON. Si quieres añadir un bloque con funcionalidad deberías consultar el tutorial de Bloques Avanzados. Hay una lista completa de todas las propiedades que se pueden definir dentro del archivo json aquí.
Un Bloque Simple
Para empezar vamos a crear algo sencillo. En nuestro ejemplo añadiremos un bloque de oro normal y corriente al juego (será sólo para uso decorativo). Llamemos a este mod MiBloqueDeOro.
Espacio de trabajo
En primer lugar es útil crear una nueva carpeta para mantener todo limpio. Dentro de este espacio de trabajo crearemos el mod en sí, y más tarde lo pondremos en un archivo zip, para poder probarlo y distribuirlo a otras personas.
La Textura
Utilizaremos esta textura para nuestro bloque: .
(Para crear tus propias texturas, puedes utilizar programas como PaintDotNet(gratuito), Piskel(gratuito), or Aseprite (código abierto gratuito o precompilado de pago))
Ahora tenemos que colocar la textura en el lugar adecuado para poder utilizarla más adelante. Por lo tanto tienes que renombrar la textura a mitexturadeoro.png
y ponerla dentro de assets/mibloquedeoro/textures/block/
en tu espacio de trabajo (tienes que crear esas carpetas primero). mygoldblock
será nuestro dominio.
El Archivo del Bloque
Lo siguiente que vamos a necesitar es un archivo json que determinará las propiedades del bloque. Por ahora lo mantendremos sencillo y trabajaremos sólo con propiedades simples. Si quieres hacer cosas más avanzadas, puedes echar un vistazo a Vista general de las propiedades de los bloques.
Ahora necesitas crear un nuevo archivo json en tu editor (recomendamos usar un editor con resaltado de sintaxis, como Notepad++ o Sublime Text. Si vas a tener muchos archivos json o algo de C#, entonces Visual Studio Code es también una buena elección).
{
"code": "mibloquedeoro",
"creativeinventory": { "general": ["*"] },
"blockmaterial": "Stone",
"drawtype": "Cube",
"textures": {
"all": { "base": "block/mygoldtexture" }
},
"resistance": 3.5,
"sounds": {
"place": "game:block/anvil",
"walk": "game:walk/stone"
}
}
Short explanation of each line:
- code: Un identificador único para su bloque.
- creativeinventory: Las pestañas del inventario creativo en las que debe mostrarse el bloque (actualmente sólo hay 1 pestaña disponible).
- shape: Qué modelo debe utilizar el bloque
- drawtype: Determina el sistema de dibujo, por ejemplo, utilice 'cube' para cubos completos normales o 'json' para formas creadas a medida.
- textures: Qué texturas aplicar. En el caso de bloques sencillos, puede definir una única textura para "todas" las caras o definir una para cada cara ('north', 'east', 'west', 'south', 'up', 'down')
- resistance: Cuántos segundos de tiempo real se tarda en romper el bloque sin herramientas
- sounds: Los sonidos que se reproducirán al colocar/romper o caminar sobre el bloque. Hay que añadir el prefijo
game
, ya que nuestro bloque tiene el dominiomibloquedeoro
. De lo contrario, intentaría encontrar esos sonidos dentro de nuestro dominio.
Ahora guarda el archivo en tu espacio de trabajo dentro de assets/mibloquedeoro/blocktypes/
y nómbralo mibloquedeoro.json
.
Poner nombre al bloque
Para dar un nombre apropiado al bloque, necesitamos crear otro archivo json y guardarlo con la siguiente ruta: assets/mibloquedeoro/lang/en.json
{
"block-mibloquedeoro": "Bloque de oro"
}
Pruebas/ Distribución
Lo último que tenemos que hacer es crear un archivo zip de la carpeta assets dentro de nuestro espacio de trabajo. O bien utilizas un programa externo (como WinRAR o 7Zip) o haces clic con el botón derecho del ratón en la carpeta assets
y pulsas Enviar a -> Carpeta comprimida (zip). Eventualmente puedes renombrar el archivo zip a MiBloqueDeOro.zip
. El archivo zip puede ser utilizado para propósitos de prueba o puede enviarlo a otras personas para que puedan utilizarlo también.
Además necesitas añadir un archivo modinfo.json
, echa un vistazo a este tutorial.
Para instalar el mod, navega hasta la carpeta Carpeta Vintagestory y colócala dentro de la carpeta de mods.
Sugerencia: Utiliza el comando cliente .tfedit
si quieres ajustar la posición, rotación y escala del bloque en Manos, en GUI, al dejarlo caer al suelo o en modo tercera persona.
Propiedades avanzadas
Ahora haremos cosas más avanzadas con nuestro precioso bloque dorado. Añadiremos texturas aleatorias, distintas variantes y formas personalizadas. Así que empecemos.
Texturas Random
Así que en primer lugar necesitamos algunas texturas más. He creado algunas variantes del bloque de oro .
Para mantener el nombre de las texturas simple he añadido un número a cada nombre de textura (mitexturadeoro.png
,mitexturadeoro1.png
,mitexturadeoro2.png
y mitexturadeoro3.png
)
Ahora tenemos que añadir esas nuevas texturas al archivo json.
"textures": {
"all": {
"base": "block/mitexturadeoro",
"alternates": [{"base": "block/mitexturadeoro1" }, {"base": "block/mitexturadeoro2" }, {"base": "block/mitexturadeoro3" }],
},
},
Finalmente guárdelo y ejecute Vintagestory de nuevo. Ahora debería ver un resultado como este:
Por supuesto, puede añadir más textura si lo desea.
Variantes
El oro es lo mejor, pero el hierro también es genial... así que, ¿qué hacemos? Añadamos otra variante de este bloque, porque a todos nos encanta el hierro.
Podría duplicar el archivo blocktype y cambiar el nombre de plata a oro en todos los lugares, o simplemente puede añadir otra variante al blocktype existente.
Variantgroup: Type
Así que en primer lugar necesitamos algunas nuevas texturas de nuevo: y
Ahora tenemos que cambiar algunas cosas en nuestro archivo json. Podemos añadir todo tipo de grupos diferentes, pero por ahora lo mantendremos simple. Vamos a añadir un grupo llamado type
, con los estados oro
y hierro
. Puedes usar el código de grupo que quieras.
"variantgroups": [
{ "code": "type", "states": ["oro", "hierro"] }
],
Lo siguiente que tenemos que hacer es establecer las texturas por tipo. Así que eliminamos nuestra propiedad texture
y la sustituimos por una nueva propiedad texturesbytype
, que nos permitirá establecer diferentes texturas para cada tipo.
texturesbytype: {
"*-oro": {
"all": {
"base": "block/mitexturadeoro",
alternates: [{"base": "block/mitexturadeoro1" }, {"base": "block/mitexturadeoro2" }, {"base": "block/mitexturadeoro3" }],
},
},
"*-iron": {
"all": {
"base": "block/mitexturadehierro",
alternates: [{"base": "block/mitexturadehierro1" }, {"base": "block/mitexturadehierro2" }, {"base": "block/mitexturadehierro3" }],
},
}
},
Cada grupo se añadirá uno detrás de otro al código de bloques myblockname-mygroup-mysecondgroup
. En nuestro ejemplo podemos ahorrarnos escribir unas cuantas letras de más utilizando el comodín *
.
También se puede utilizar una definición más compacta. Debido a la forma en que nombramos nuestras texturas podemos usar el marcador de posición {type} para determinar el nombre de la textura, así que en lugar de manejar cada caso individualmente podemos escribirlo así:
textures: {
"all": {
"base": "block/mitexturade{type}",
"alternates": [{base: "block/mitexturade{type}1" }, {"base": "block/mitexturade{type}2" }, {"base": "block/mitexturade{type}3" }],
},
},
La definición completa del tipo de bloque podría ser la siguiente:
{
"code": "mibloquebrillante",
"creativeinventory": { "general": ["*"] },
"variantgroups": [
{ "code": "type", "states": ["oro", "hierro"] }
],
"blockmaterial": "Stone",
"drawtype": "cube",
"textures": {
"all": {
"base": "block/mitexturade{type}",
"alternates": [{"base": "block/mitexturade{type}1" }, {"base": "block/mitexturade{type}2" }, {"base": "block/mitexturade{type}3" }],
},
},
"resistance": 3.5,
"sounds": {
"place": "game:block/anvil",
"walk": "game:walk/stone"
}
}
Variantgroup: Condition
Vamos a añadir otro grupo a nuestro bloque, que determinará el estado de este bloque. Habrá dos estados bien
y usado
. Podemos añadir este grupo añadiendo otra propiedad dentro de variantgroups[]
.
variantgroups: [
{ code: "type", states: ["oro", "hierro"] },
{ code: "condition", states: ["bien", "usado"]}
],
Para terminar de implementar este segundo grupo tenemos que ocuparnos de todos los casos. Queremos que los bloques buenos
sólo usen la textura base y que los bloques usados
también usen sus texturas aleatorias:
texturesbytype: {
"*-bueno": {
all: {
base: "block/mitexturade{type}",
},
},
"*-usado": {
all: {
base: "block/mitexturade{type}",
alternates: [{base: "block/mitexturade{type}1" }, {base: "block/mitexturade{type}2" }, {base: "mitexturade{type}3" }],
},
},
},
Los bloques en buen estado están a la izquierda, mientras que los usados están a la derecha:
Formas Personalizadas
Para poder utilizar una forma personalizada, primero tenemos que crearla. El motor sólo soporta el formato modelo/forma creado por el Creador de modelos VS.
Una vez que hayas creado tu propia forma necesitas exportarla como un archivo json, crea una nueva carpeta assets/mibloquebrillante/shapes/block/
y guarda el archivo ahí. En nuestro ejemplo usaremos este modelo Mimodelobrillante.json y lo moveremos a assets/mibloquebrillante/shapes/block/mimodelobrillante.json
. Ahora tenemos que especificar el modelo dentro de nuestro tipo de bloque archivo json.
Por lo tanto cambiaremos el drawtype de cube
a json
:
drawtype: "json",
y la forma a mimodelobrillante
shape: { base: "block/mimodelobrillante" },
Aunque en teoría esto sería suficiente, también deberíamos determinar que este bloque no es sólido, para evitar fallos gráficos.
sidesolid: {
all: "false"
},
sideopaque: {
all: "false"
},
Así que vamos a ejecutar el juego. Así es como debería verse:
Variantes de formas personalizadas
He creado otro modelo para los bloques en buen estado (mimodelobrillante1.json), porque deben parecer más impresionante, que los que están en condiciones usadas. Por lo tanto tenemos que copiar el archivo json a assets/mibloquebrillante/shapes/block/
también.
Para especificar la forma por tipo tenemos que eliminar la propiedad shape
y sustituirla por shapebytype
:
shapebytype: {
"*-bien": {
base: "block/mimodelobrillante1",
},
"*-usado": {
base: "block/mimodelobrillante",
},
},
Descarga de mods
Puedes encontrar el mod completo aquí como referencia:
Seguir avanzando
El ejemplo que se muestra aquí, aunque aparentemente complejo, sólo araña la superficie de lo que los tipos de bloque son capaces de hacer en Vintage Story. Se recomienda encarecidamente que experimentes o al menos te familiarices con todas las propiedades de bloque conocidas antes de pasar a los mods de código. La mejor forma de hacerlo es echar un vistazo a la página Propiedades de los Bloques, que contiene una lista actualizada de todas las propiedades JSON de los bloques incorporadas actualmente al juego. La mayoría de las propiedades de la lista también tienen archivos de referencia que puedes buscar en la carpeta Vintage Story Assets. Si no sabes dónde está, puedes encontrar tutoriales para cada sistema operativo en la página Sistema de Recursos.
Si aún no lo has hecho, te sugerimos que también eches un vistazo a las páginas Items Básicos y Entidades Básicas para aprender cómo se añaden al juego objetos y entidades JSON simples.
Sin embargo, si te apetece dar el salto a los mods de código, entonces querrás empezar por configurar tu Entorno de desarrollo.
Vídeo tutorial: Cómo hacer mods sin programar (en ruso)
Gracias a ZigTheHedge por un vídeo tan detallado
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 |