Modding:Bloque Básico

From Vintage Story Wiki
Revision as of 07:00, 6 December 2023 by FuzzyBot (talk | contribs) (Updating to match new version of source page)
Other languages:

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: Gold block.png.
(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 dominio mibloquedeoro. 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.

MyGoldBlockMod.zip

2017-01-10 12-33-45.png.

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 Gold block.png Mygoldtexture1.png Mygoldtexture2.png Mygoldtexture3.png. 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:

2017-01-10 12-33-45.png.

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: Myirontexture.png Myirontexture1.png Myirontexture2.png y Myirontexture3.png

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"
	}
}

2017-01-10 14-36-58.png

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:

2017-01-10 15-02-38.png

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:

2017-01-12 14-06-27.png

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",
		},
	},

2017-01-12 14-51-45.png

Descarga de mods

Puedes encontrar el mod completo aquí como referencia:

MiBloqueBrillante

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

Icon Sign.png

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 ItemEntityEntity BehaviorsBlockBlock BehaviorsBlock ClassesBlock EntitiesBlock Entity BehaviorsCollectible BehaviorsWorld properties
Workflows & Infrastructure Modding Efficiency TipsMod-engine compatibilityMod ExtensibilityVS Engine
Additional Resources Community Resources Modding API Updates Programming Languages List of server commandsList of client commandsClient startup parametersServer startup parameters
Example ModsAPI DocsGitHub Repository