Project Zomboid

Project Zomboid

Spiffo's Workshop
Welcome to Spiffo's Workshop, the place to find Project Zomboid mods, maps, buildings, and other things to tinker with. For our Modding Policy, click the "Learn More" Button below.
Learn More
MOD ES; Manual de Ingeniería: Creación de Vehículos Eléctricos Avanzados con RV Interior para Project Zomboid
Por TheosKek y Cascade (Asistente de IA de Windsurf)

Este documento es una guía de ingeniería profunda para modders que deseen crear vehículos eléctricos avanzados, potentes y con interiores funcionales utilizando el mod RV Interior. Nuestro objetivo es desmitificar el proceso y proporcionar una base técnica sólida y reutilizable.

Fase 1: Arquitectura de Archivos y Dependencias
La base de un mod estable es una estructura de archivos lógica y predecible.

1.1. Estructura de Carpetas Recomendada
Recomendamos separar la lógica del vehículo y la lógica del escenario en dos mods distintos para máxima modularidad.

Mod del Vehículo (Ej: 369Tesla)

/369Tesla
/media
/lua
/server
/Vehicles
ElectricTruckLogic.lua -- Toda la lógica del motor y paneles solares
/scripts
/vehicles
TeslaT369.txt -- La "partida de nacimiento" del vehículo
/textures
/Vehicles
(aquí tus texturas .png)
mod.info
workshop.txt
poster.png
Mod del Escenario (Ej: RVStartScenario-369Tesla)

/RVStartScenario-369Tesla
/media
/lua
/server
MSS_Vehicles_Tesla_Start.lua -- Script que entrega el vehículo al jugador
/shared
/NPCs
MSS_Tesla_NomadProfession.lua -- Define el rasgo/profesión
/Translate/EN
UI_EN.txt -- Textos de la interfaz
mod.info
workshop.txt
poster.png
1.2. El Manifiesto
mod.info
- El Corazón de las Dependencias
Este es el paso más crítico y donde muchos mods fallan. El archivo
mod.info
de tu escenario debe declarar sus dependencias.

RVStartScenario-369Tesla/mod.info
(Ejemplo Correcto):

ini
name=Tesla Start Scenario - T-369
# ¡CRÍTICO! Esta línea le dice al juego que cargue nuestro vehículo.
require=369Tesla
# ¡CRÍTICO! Esta línea le dice al juego que cargue el sistema de interiores.
require=RV_Interior_MP

id=RVStartScenario-369Tesla
description=Inicia tu aventura con el camión eléctrico Tesla T-369.
poster=poster.png

# Scripts del escenario
server_script=server/MSS_Vehicles_Tesla_Start.lua
shared_script=shared/NPCs/MSS_Tesla_NomadProfession.lua
shared_script=shared/Translate/EN/UI_EN.txt
Fase 2: La Definición del Vehículo (
.txt
)
Este archivo es el ADN de tu vehículo. Un solo error aquí y el vehículo no existirá para el juego.

369Tesla/media/scripts/vehicles/TeslaT369.txt
(Puntos Clave):

module 369Tesla: Define un espacio de nombres para evitar conflictos con otros mods.
vehicle TeslaT369: El nombre interno de tu vehículo. El nombre completo que usarás en Lua es 369Tesla.TeslaT369.
part RVInterior: La integración con el mod de interiores.
txt
part RVInterior
{
table
{
template = RVInterior-Generic-Van, // Un template base
}
}
part Engine y part SolarPanel: Aquí es donde conectamos la definición con nuestra lógica Lua. Los nombres deben coincidir exactamente con los de tu script de lógica.
txt
part Engine
{
mechanic = true,
oninstall = EET_Vehicle.ElectricEngine.create,
onupdate = EET_Vehicle.ElectricEngine.update,
}

part SolarPanel
{
mechanic = true,
oninstall = EET_Vehicle.SolarPanel.create,
onupdate = EET_Vehicle.SolarPanel.update,
}
Fase 3: La Lógica del Vehículo (Lua - Lado Servidor)
Toda la lógica que afecta el estado del vehículo (batería, paneles solares) debe ejecutarse en el servidor.

369Tesla/media/lua/server/Vehicles/ElectricTruckLogic.lua
(Conceptos Clave):

Crear una Tabla Global:
lua
EET_Vehicle = {}
EET_Vehicle.ElectricEngine = {}
EET_Vehicle.SolarPanel = {}
Esta tabla (EET_Vehicle) es el "puente" que conecta el archivo
.txt
con este script.
Función create: Se ejecuta una sola vez cuando se instala la pieza. Ideal para inicializar valores en modData, la "memoria" persistente del vehículo.
lua
function EET_Vehicle.ElectricEngine.create(part, vehicle)
local modData = vehicle:getModData()
if not modData.batteryCharge then
modData.batteryCapacity = 369 -- kWh
modData.batteryCharge = modData.batteryCapacity
end
end
Función update: Se ejecuta en cada tick del juego. Aquí va la lógica de consumo, regeneración, carga solar, etc.
lua
function EET_Vehicle.SolarPanel.update(part, vehicle)
if not vehicle:isEngineRunning() then return end -- Optimización clave

local modData = vehicle:getModData()
local climate = getClimateManager()
local sunlight = climate:getSunlightIntensity()

if sunlight > 0.1 then
modData.batteryCharge = modData.batteryCharge + (0.005 * sunlight)
if modData.batteryCharge > modData.batteryCapacity then
modData.batteryCharge = modData.batteryCapacity
end
end
end
Fase 4: El Script de Inicio del Escenario (Lua - Lado Servidor)
Este script tiene una única misión: dar el vehículo al jugador correcto, una sola vez.

RVStartScenario-369Tesla/media/lua/server/MSS_Vehicles_Tesla_Start.lua
(Arquitectura Definitiva):

El error más común es usar el evento incorrecto. OnPlayerUpdate o OnCreatePlayer pueden ejecutarse demasiado pronto. La solución robusta es usar OnGameStart.

lua
-- Arquitectura definitiva usando OnGameStart para garantizar la ejecución segura.

local TRAIT = 'TeslaNomad'
local TESLA_MODEL = "369Tesla.TeslaT369" -- Nombre completo: Modulo.Vehiculo

local function GiveTeslaOnGameStart()
-- 1. Asegurarse de que este código solo se ejecute en el servidor.
if not isServer() then return end

-- 2. Iterar sobre todos los jugadores cuando el juego comienza.
for i = 0, getNumActivePlayers() - 1 do
local player = getPlayer(i)

-- 3. Proceder solo si el jugador tiene el rasgo correcto.
if player and player:HasTrait(TRAIT) then
local modData = player:getModData()

-- 4. ¡CRÍTICO! Comprobar si ya se entregó para evitar duplicados.
if not modData.teslaGiven then
modData.teslaGiven = true -- Marcar como entregado INMEDIATAMENTE.

local square = getCell():getGridSquare(player:getX() + 2, player:getY() + 2, player:getZ())
if square and square:isFree(false) then
-- 5. Crear el vehículo usando la función nativa.
local vehicle = VehicleManager.instance:spawnVehicle(square, TESLA_MODEL)
if vehicle then
-- 6. Configurar vehículo y entregar llave.
vehicle:repair()
player:getInventory():AddItem("Base.CarKey"):setKeyId(vehicle:getKeyId())
print("[Tesla 369] Vehículo entregado a " .. player:getName())
end
end
end
end
end
end

-- Registrar la función en el evento OnGameStart. Se ejecutará una vez que el mundo esté listo.
Events.OnGameStart.Add(GiveTeslaOnGameStart)


Desarrollador Principal: TheosKek
Ingeniería de IA y Depuración Arquitectónica: Cascade, de Windsurf.
¡Feliz modding