Compare commits

...

20 commits
0.1 ... master

Author SHA1 Message Date
f52b80a452
Bumped to v3.03; fixes rim design conversion + trunk 2025-01-01 21:37:44 +01:00
2bbb5a0fc3
Fixed stored vehicle conversion 2024-12-30 21:53:41 +01:00
7ffb83c805
Fixed rim design issue 2024-12-30 21:20:06 +01:00
07d27adce1
Bumped to v0.2.2 2024-12-21 19:50:04 +01:00
b35777739b
Fixed sound issue 2024-12-21 19:49:39 +01:00
14efcf08c1
Bumped to 0.2.1 2024-12-17 21:18:08 +01:00
d62347d31e
Merge remote-tracking branch 'origin/master' 2024-12-14 10:59:43 +01:00
8d88cfadf7
Resolved sound conversion issue 2024-12-14 10:59:22 +01:00
e34277070d Update README.md 2024-12-13 18:50:52 +00:00
e786511ae0 Update README.md 2024-12-13 18:50:22 +00:00
54d4882c7e
Bumped to v0.2 2024-12-13 19:10:45 +01:00
de8a3ef5f7
Resolved v3 API issue and added version check 2024-12-13 19:10:21 +01:00
11a8884afb
Bumped deps 2024-07-26 16:23:03 +02:00
Stijn Bannink
841f8c358f Bumped to latest snapshot build (does not work with PRE4!) 2024-01-23 22:18:20 +01:00
90c36c3bcc Merge pull request 'Configure Renovate' (#1) from renovate/configure into master
Reviewed-on: #1
2024-01-23 12:35:56 +00:00
4167cd79dc Add renovate.json 2024-01-19 13:54:13 +00:00
Stijn Bannink
8f8b3051e5 Bumped to v0.1.3: Fixed PRE3 support 2023-02-14 16:40:15 +01:00
Stijn Bannink
074064b551 Bumped to v0.1.2 2023-01-22 11:39:42 +01:00
Stijn Bannink
a5ae8c9620 Updated to v3 PRE1 alpha release 2023-01-22 11:38:08 +01:00
SBDeveloper
12d18d3d69 Fixed older version support, bumped to v0.1.1 2022-12-05 20:28:03 +01:00
10 changed files with 436 additions and 74 deletions

View file

@ -2,8 +2,11 @@
This plugin helps with the conversion of data from VehiclesPlus v2 to v3. This plugin helps with the conversion of data from VehiclesPlus v2 to v3.
## Usage ## Usage
1. Make sure you installed both VehiclesPlus v2 and VehiclesPlus v3. 0. Make sure VehiclesPlus v2 is still installed. Otherwise install it again, you can find the .jar in the version history.
2. Download the [latest release](https://github.com/SBDPlugins/VehiclesPlusConverter/releases) of the converter and install it into your `plugins` folder. 1. **Back up your v2 VehiclesPlusPro plugin data folder!**
3. Restart your server. 1. Download VehiclesPlus v3 and the [latest release](https://git.sbdevelopment.tech/SBDevelopment/VehiclesPlusConverter/releases) of the converter and install it into your `plugins` folder.
4. Use the `/vpconvert` command and follow the instructions. 1. (Re)start your server and check your console to make sure both v2 and v3 load correctly.
5. The server will restart. After the restart, the new vehicles will be loaded. 1. Execute `/vpconvert` and read the instructions.
1. The plugin will convert all the data to the v3 data folder and stop the server.
1. Make sure to remove the .jar files of both VehiclesPlus v2 and VehiclesPlusConverter!
1. Start your server again and enjoy v3! 😉

20
pom.xml
View file

@ -6,14 +6,13 @@
<groupId>tech.sbdevelopment</groupId> <groupId>tech.sbdevelopment</groupId>
<artifactId>VehiclesPlusConverter</artifactId> <artifactId>VehiclesPlusConverter</artifactId>
<version>1.0</version> <version>0.2.4</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>VehiclesPlusConverter</name> <name>VehiclesPlusConverter</name>
<description>Conversion plugin for v2 to v3.</description> <description>Conversion plugin for v2 to v3.</description>
<properties> <properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<url>sbdevelopment.tech</url> <url>sbdevelopment.tech</url>
@ -23,16 +22,15 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version> <version>3.13.0</version>
<configuration> <configuration>
<source>10</source> <release>11</release>
<target>10</target>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version> <version>3.6.0</version>
<executions> <executions>
<execution> <execution>
<phase>package</phase> <phase>package</phase>
@ -69,22 +67,22 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.19.2-R0.1-SNAPSHOT</version> <version>1.21.4-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>nl.sbdeveloper</groupId> <groupId>nl.sbdeveloper</groupId>
<artifactId>VehiclesPlus-v2</artifactId> <artifactId>VehiclesPlus-v2</artifactId>
<version>2.3.5</version> <version>2.4.7.2</version>
<scope>system</scope> <scope>system</scope>
<systemPath>${project.basedir}/src/libs/VehiclesPlus-2.3.5.jar</systemPath> <systemPath>${project.basedir}/src/libs/VehiclesPlus-2.4.7.2.jar</systemPath>
</dependency> </dependency>
<dependency> <dependency>
<groupId>nl.sbdeveloper</groupId> <groupId>nl.sbdeveloper</groupId>
<artifactId>VehiclesPlus-v3</artifactId> <artifactId>VehiclesPlus-v3</artifactId>
<version>3.0.0</version> <version>3.0.3</version>
<scope>system</scope> <scope>system</scope>
<systemPath>${project.basedir}/src/libs/VehiclesPlus-3.0.0.jar</systemPath> <systemPath>${project.basedir}/src/libs/VehiclesPlus-3.0.3.jar</systemPath>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

3
renovate.json Normal file
View file

@ -0,0 +1,3 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
}

View file

@ -3,6 +3,7 @@ package tech.sbdevelopment.vehiclesplusconverter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import tech.sbdevelopment.vehiclesplusconverter.cmd.ConverterCMD; import tech.sbdevelopment.vehiclesplusconverter.cmd.ConverterCMD;
import tech.sbdevelopment.vehiclesplusconverter.utils.Version;
public final class VehiclesPlusConverter extends JavaPlugin { public final class VehiclesPlusConverter extends JavaPlugin {
private static VehiclesPlusConverter instance; private static VehiclesPlusConverter instance;
@ -21,6 +22,20 @@ public final class VehiclesPlusConverter extends JavaPlugin {
return; return;
} }
Version versionOld = Version.of(Bukkit.getPluginManager().getPlugin("VehiclesPlusPro").getDescription().getVersion());
if (versionOld.isOlderThan(Version.of("2.4.7.1"))) {
Bukkit.getLogger().severe("Your VehiclesPlus v2 plugin is too old! Please update to at least v2.4.7.1!");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
Version versionNew = Version.of(Bukkit.getPluginManager().getPlugin("VehiclesPlus").getDescription().getVersion());
if (versionNew.isOlderThan(Version.of("3.0.3"))) {
Bukkit.getLogger().severe("Your VehiclesPlus v3 plugin is too old! Please update to at least v3.0.3!");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
getCommand("vpconvert").setExecutor(new ConverterCMD()); getCommand("vpconvert").setExecutor(new ConverterCMD());
} }

View file

@ -1,9 +1,14 @@
package tech.sbdevelopment.vehiclesplusconverter.api; package tech.sbdevelopment.vehiclesplusconverter.api;
import java.io.IOException; import java.io.IOException;
import java.util.Set;
public class ConversionException extends IOException { public class ConversionException extends IOException {
public ConversionException(String before, String filename) { public ConversionException(String explanation, String filename) {
super(before + " " + filename + ".yml"); super(explanation + " " + filename + ".yml!");
}
public ConversionException(String explanation, String filename, String expected, Set<String> available) {
super(explanation + " " + filename + ".yml! Expected " + expected + ", available: " + String.join(", ", available));
} }
} }

View file

@ -21,7 +21,7 @@ public class ConverterCMD implements CommandExecutor {
Converter.convert(sender); Converter.convert(sender);
} else { } else {
sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &fPlease use &b/vpconvert confirm &fto start the conversion!")); sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &fPlease use &b/vpconvert confirm &fto start the conversion!"));
sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &4&lPLEASE NOTE: &cExisting v3 vehicles may be overwritten! &c&lCreate a backup before confirming.")); sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &4&lPLEASE NOTE: &cExisting v3 vehicles may be overwritten! &c&lCreate a backup before confirming!!!"));
} }
} }
return true; return true;

View file

@ -15,19 +15,27 @@ import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.skins.BikeS
import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.skins.Rotor; import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.skins.Rotor;
import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.skins.Skin; import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.skins.Skin;
import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.skins.Turret; import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.skins.Turret;
import nl.sbdeveloper.vehiclesplus.api.garages.Garage;
import nl.sbdeveloper.vehiclesplus.api.vehicles.HolderItemPosition;
import nl.sbdeveloper.vehiclesplus.api.vehicles.VehicleModel; import nl.sbdeveloper.vehiclesplus.api.vehicles.VehicleModel;
import nl.sbdeveloper.vehiclesplus.api.vehicles.settings.UpgradableSetting; import nl.sbdeveloper.vehiclesplus.api.vehicles.settings.UpgradableSetting;
import nl.sbdeveloper.vehiclesplus.api.vehicles.settings.impl.*; import nl.sbdeveloper.vehiclesplus.api.vehicles.settings.impl.*;
import nl.sbdeveloper.vehiclesplus.storage.db.exceptions.DataStorageException;
import nl.sbdeveloper.vehiclesplus.utils.jackson.ColorList;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Particle; import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import tech.sbdevelopment.vehiclesplusconverter.VehiclesPlusConverter; import tech.sbdevelopment.vehiclesplusconverter.VehiclesPlusConverter;
import tech.sbdevelopment.vehiclesplusconverter.api.ConversionException; import tech.sbdevelopment.vehiclesplusconverter.api.ConversionException;
import java.util.List; import java.io.File;
import java.util.Arrays;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level;
import static tech.sbdevelopment.vehiclesplusconverter.utils.MainUtil.*; import static tech.sbdevelopment.vehiclesplusconverter.utils.MainUtil.*;
@ -65,6 +73,14 @@ public class Converter {
@Override @Override
public void run() { public void run() {
sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &f" + (counter == 15 ? "Conversion finished! " : "") + "&bRebooting in &3" + counter + " &bseconds...")); sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &f" + (counter == 15 ? "Conversion finished! " : "") + "&bRebooting in &3" + counter + " &bseconds..."));
if (counter == 1) {
sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &4&lPLEASE NOTE: &cVehiclesPlus v2 and the converter are disabled from now on!"));
try {
disablePlugin(VehiclesPlus.getInstance());
disablePlugin(VehiclesPlusConverter.getInstance());
} catch (Exception ignored) {
}
}
counter--; counter--;
} }
}.runTaskTimer(VehiclesPlusConverter.getInstance(), 20L, 20L); }.runTaskTimer(VehiclesPlusConverter.getInstance(), 20L, 20L);
@ -72,36 +88,50 @@ public class Converter {
private static void convertRims() { private static void convertRims() {
for (Map.Entry<String, RimDesign> entry : VehiclesPlus.getVehicleManager().getRimDesignHashMap().entrySet()) { for (Map.Entry<String, RimDesign> entry : VehiclesPlus.getVehicleManager().getRimDesignHashMap().entrySet()) {
nl.sbdeveloper.vehiclesplus.api.vehicles.rims.RimDesign rd = nl.sbdeveloper.vehiclesplus.api.vehicles.rims.RimDesign.builder() nl.sbdeveloper.vehiclesplus.api.vehicles.rims.RimDesign rd = new nl.sbdeveloper.vehiclesplus.api.vehicles.rims.RimDesign(
.name(entry.getValue().getName()) entry.getValue().getName().toLowerCase(),
.price(entry.getValue().getPrice()) entry.getValue().getSkin(),
.skin(entry.getValue().getSkin()) HolderItemPosition.HEAD,
.build(); entry.getValue().getPrice()
);
nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getRimDesigns().put(entry.getKey(), rd); nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getRimDesigns().put(entry.getKey(), rd);
rd.save();
VehiclesPlusConverter.getInstance().getLogger().info("Converted rim design: " + rd.getName());
} }
} }
private static void convertFuels() { private static void convertFuels() {
for (Map.Entry<String, FuelType> entry : VehiclesPlus.getVehicleManager().getFuelTypeHashMap().entrySet()) { for (Map.Entry<String, FuelType> entry : VehiclesPlus.getVehicleManager().getFuelTypeHashMap().entrySet()) {
nl.sbdeveloper.vehiclesplus.api.vehicles.fuel.FuelType ft = nl.sbdeveloper.vehiclesplus.api.vehicles.fuel.FuelType.builder() nl.sbdeveloper.vehiclesplus.api.vehicles.fuel.FuelType ft = new nl.sbdeveloper.vehiclesplus.api.vehicles.fuel.FuelType(
.name(entry.getValue().getName()) entry.getValue().getName(),
.item(entry.getValue().getFuelItem()) entry.getValue().getFuelItem(),
.pricePerLiter(entry.getValue().getPricePerLiter()) entry.getValue().getPricePerLiter()
.build(); );
nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getFuelTypes().put(entry.getKey(), ft); nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getFuelTypes().put(entry.getKey(), ft);
ft.save();
VehiclesPlusConverter.getInstance().getLogger().info("Converted fuel type: " + ft.getName());
} }
} }
private static void convertVehicleModels() { private static void convertVehicleModels() {
VehiclesPlusConverter.getInstance().getLogger().info("Converting vehicle models: " + VehiclesPlusAPI.getVehicleManager().getBaseVehicleMap().values().stream().map(BaseVehicle::getName).reduce((s1, s2) -> s1 + ", " + s2).orElse(""));
for (BaseVehicle baseVehicle : VehiclesPlusAPI.getVehicleManager().getBaseVehicleMap().values()) { for (BaseVehicle baseVehicle : VehiclesPlusAPI.getVehicleManager().getBaseVehicleMap().values()) {
if (baseVehicle.getName().startsWith("Example")) {
VehiclesPlusConverter.getInstance().getLogger().info("Skipping example vehicle model: " + baseVehicle.getName());
continue;
}
try { try {
VehicleModel.VehicleModelBuilder vehicleModelBuilder = VehicleModel.builder() VehicleModel.Builder vehicleModelBuilder = VehicleModel.builder()
.id(baseVehicle.getName()) .id(baseVehicle.getName())
.displayName(baseVehicle.getName()) .displayName(idToReadable(baseVehicle.getName()))
.typeId(getTypeIdByClass(baseVehicle.getName(), getClassByFullName(baseVehicle.getVehicleType()))) .typeId(getTypeIdByClass(baseVehicle.getName(), getClassByFullName(baseVehicle.getVehicleType())))
.availableColors(baseVehicle.getBaseColorList()); .availableColors(new ColorList(baseVehicle.getBaseColorList()));
for (Part part : baseVehicle.getPartList()) { for (Part part : baseVehicle.getPartList()) {
if (part instanceof BikeSeat) { if (part instanceof BikeSeat) {
@ -118,7 +148,12 @@ public class Converter {
turretSeat.getXOffset(), turretSeat.getXOffset(),
turretSeat.getYOffset(), turretSeat.getYOffset(),
turretSeat.getZOffset(), turretSeat.getZOffset(),
baseVehicle.getPartList().stream().filter(Turret.class::isInstance).findFirst().orElseThrow(() -> new ConversionException("No Turret found while loading TurretSeat in file", baseVehicle.getName())).getUID() baseVehicle.getPartList()
.stream()
.filter(Turret.class::isInstance)
.findFirst()
.orElseThrow(() -> new ConversionException("No Turret found while loading TurretSeat in file", baseVehicle.getName()))
.getUID()
)); ));
} else if (part instanceof Seat) { } else if (part instanceof Seat) {
Seat seat = (Seat) part; Seat seat = (Seat) part;
@ -134,7 +169,8 @@ public class Converter {
bikeSkin.getXOffset(), bikeSkin.getXOffset(),
bikeSkin.getYOffset(), bikeSkin.getYOffset(),
bikeSkin.getZOffset(), bikeSkin.getZOffset(),
bikeSkin.getSkinColored() bikeSkin.getSkinColored(),
HolderItemPosition.HEAD
)); ));
} else if (part instanceof Rotor) { } else if (part instanceof Rotor) {
Rotor rotor = (Rotor) part; Rotor rotor = (Rotor) part;
@ -142,7 +178,8 @@ public class Converter {
rotor.getXOffset(), rotor.getXOffset(),
rotor.getYOffset(), rotor.getYOffset(),
rotor.getZOffset(), rotor.getZOffset(),
rotor.getSkinColored() rotor.getSkinColored(),
HolderItemPosition.HEAD
)); ));
} else if (part instanceof Turret) { } else if (part instanceof Turret) {
Turret turret = (Turret) part; Turret turret = (Turret) part;
@ -151,6 +188,7 @@ public class Converter {
turret.getYOffset(), turret.getYOffset(),
turret.getZOffset(), turret.getZOffset(),
turret.getSkin(), turret.getSkin(),
HolderItemPosition.HEAD,
turret.getExplosionSize(), turret.getExplosionSize(),
turret.getAmmo() turret.getAmmo()
)); ));
@ -160,19 +198,57 @@ public class Converter {
skin.getXOffset(), skin.getXOffset(),
skin.getYOffset(), skin.getYOffset(),
skin.getZOffset(), skin.getZOffset(),
skin.getSkinColored() skin.getSkinColored(),
HolderItemPosition.HEAD
)); ));
} else if (part instanceof Wheel) { } else if (part instanceof Wheel) {
Wheel wheel = (Wheel) part; Wheel wheel = (Wheel) part;
vehicleModelBuilder = vehicleModelBuilder.part(new nl.sbdeveloper.vehiclesplus.api.vehicles.parts.impl.Wheel( ItemStack wheelSkin = wheel.getSkinColored();
// Try to find an existing rim design with this skin
Optional<nl.sbdeveloper.vehiclesplus.api.vehicles.rims.RimDesign> matchingRimDesign = nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getRimDesigns()
.values()
.stream()
.filter(rd -> compareItems(rd.getSkin(), wheelSkin))
.findFirst();
if (matchingRimDesign.isEmpty()) {
// Create a new rim design since no matching one exists
String newRimDesignName = generateRimName();
nl.sbdeveloper.vehiclesplus.api.vehicles.rims.RimDesign newRimDesign = new nl.sbdeveloper.vehiclesplus.api.vehicles.rims.RimDesign(
newRimDesignName,
wheelSkin,
HolderItemPosition.HEAD,
1000
);
// Add the new rim design to the rim designs map
nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getRimDesigns().put(newRimDesignName, newRimDesign);
newRimDesign.save();
VehiclesPlusConverter.getInstance().getLogger().info("Created new rim design '" + newRimDesignName + "' for wheel skin!");
// Create the wheel part with the new rim design
vehicleModelBuilder = vehicleModelBuilder.part(new nl.sbdeveloper.vehiclesplus.api.vehicles.parts.impl.Wheel(
wheel.getXOffset(), wheel.getXOffset(),
wheel.getYOffset(), wheel.getYOffset(),
wheel.getZOffset(), wheel.getZOffset(),
VehiclesPlus.getVehicleManager().getRimDesignHashMap().values().stream().findFirst().orElseThrow(() -> new ConversionException("No RimDesign found while loading Wheel in file", baseVehicle.getName())).getName(), newRimDesign,
wheel.getColor(), wheel.getColor(),
wheel.getSteering(), wheel.getSteering(),
wheel.getRotationOffset() wheel.getRotationOffset()
)); ));
} else {
// Use the existing rim design that matches the skin
vehicleModelBuilder = vehicleModelBuilder.part(new nl.sbdeveloper.vehiclesplus.api.vehicles.parts.impl.Wheel(
wheel.getXOffset(),
wheel.getYOffset(),
wheel.getZOffset(),
matchingRimDesign.get(),
wheel.getColor(),
wheel.getSteering(),
wheel.getRotationOffset()
));
}
} }
} }
@ -181,29 +257,32 @@ public class Converter {
baseVehicle.getSpeedSettings().getBase(), baseVehicle.getSpeedSettings().getBase(),
baseVehicle.getSpeedSettings().getMax(), baseVehicle.getSpeedSettings().getMax(),
baseVehicle.getSpeedSettings().getStep(), baseVehicle.getSpeedSettings().getStep(),
baseVehicle.getSpeedSettings().getUpgradeCost() baseVehicle.getSpeedSettings().getUpgradeCost(), "km/h"
)) ))
.fuelTank(new UpgradableSetting( .fuelTank(new UpgradableSetting(
baseVehicle.getFuelTankSettings().getBase(), baseVehicle.getFuelTankSettings().getBase(),
baseVehicle.getFuelTankSettings().getMax(), baseVehicle.getFuelTankSettings().getMax(),
baseVehicle.getFuelTankSettings().getStep(), baseVehicle.getFuelTankSettings().getStep(),
baseVehicle.getFuelTankSettings().getUpgradeCost() baseVehicle.getFuelTankSettings().getUpgradeCost(), "L"
)) ))
.turningRadius(new UpgradableSetting( .turningRadius(new UpgradableSetting(
baseVehicle.getTurningRadiusSettings().getBase(), baseVehicle.getTurningRadiusSettings().getBase(),
baseVehicle.getTurningRadiusSettings().getMax(), baseVehicle.getTurningRadiusSettings().getMax(),
baseVehicle.getTurningRadiusSettings().getStep(), baseVehicle.getTurningRadiusSettings().getStep(),
baseVehicle.getTurningRadiusSettings().getUpgradeCost() baseVehicle.getTurningRadiusSettings().getUpgradeCost(), ""
)) ))
.acceleration(new UpgradableSetting( .acceleration(new UpgradableSetting(
baseVehicle.getAccelerationSettings().getBase(), baseVehicle.getAccelerationSettings().getBase(),
baseVehicle.getAccelerationSettings().getMax(), baseVehicle.getAccelerationSettings().getMax(),
baseVehicle.getAccelerationSettings().getStep(), baseVehicle.getAccelerationSettings().getStep(),
baseVehicle.getAccelerationSettings().getUpgradeCost() baseVehicle.getAccelerationSettings().getUpgradeCost(), ""
)) ))
.horn(new Horn( .horn(new Horn(
baseVehicle.getHornSettings().getEnabled(), baseVehicle.getHornSettings().getEnabled(),
baseVehicle.getHornSettings().getSound().name() new Sounds.Sound(
baseVehicle.getHornSettings().getSound().name(),
1
)
)) ))
.drift(baseVehicle.getDrift()) .drift(baseVehicle.getDrift())
.exhaust(new Exhaust( .exhaust(new Exhaust(
@ -211,7 +290,7 @@ public class Converter {
baseVehicle.getExhaustSettings().getXOffset(), baseVehicle.getExhaustSettings().getXOffset(),
baseVehicle.getExhaustSettings().getYOffset(), baseVehicle.getExhaustSettings().getYOffset(),
baseVehicle.getExhaustSettings().getZOffset(), baseVehicle.getExhaustSettings().getZOffset(),
Particle.valueOf(baseVehicle.getExhaustSettings().getParticleName()) baseVehicle.getExhaustSettings().getParticleName().get()
)) ))
.exitWhileMoving(baseVehicle.getCanExitWhileMoving()) .exitWhileMoving(baseVehicle.getCanExitWhileMoving())
.price(baseVehicle.getPrice()) .price(baseVehicle.getPrice())
@ -227,37 +306,107 @@ public class Converter {
baseVehicle.getHitbox().getHeight() baseVehicle.getHitbox().getHeight()
)) ))
.realisticSteering(baseVehicle.getSteeringType()) .realisticSteering(baseVehicle.getSteeringType())
.permissions(Permissions.builder() .permissions(baseVehicle.getPermissions() != null ?
.buy(baseVehicle.getPermissions().getBuyPermission()) Permissions.builder()
.ride(baseVehicle.getPermissions().getRidePermission()) .buy(baseVehicle.getPermissions().getBuyPermission())
.sitWithoutRidePermission(baseVehicle.getPermissions().getEnterWithoutRidePermission()) .ride(baseVehicle.getPermissions().getRidePermission())
.sitWithoutRidePermission(baseVehicle.getPermissions().getEnterWithoutRidePermission())
.adjust("vp.adjust." + baseVehicle.getName())
.spawn("vp.spawn." + baseVehicle.getName())
.build()
: Permissions.builder()
.buy("vp.buy." + baseVehicle.getName())
.ride("vp.ride." + baseVehicle.getName())
.sitWithoutRidePermission(true)
.adjust("vp.adjust." + baseVehicle.getName()) .adjust("vp.adjust." + baseVehicle.getName())
.spawn("vp.spawn." + baseVehicle.getName()) .spawn("vp.spawn." + baseVehicle.getName())
.build()) .build())
.sounds(defaultSounds) .sounds(defaultSounds)
.gearbox(new Gearbox(true, 10))
.build(); .build();
VehiclesPlusConverter.getInstance().getLogger().info("Converted vehicle model: " + model.getId());
saveToVehiclesPlus(model, "vehicles/" + model.getTypeId(), model.getId()); saveToVehiclesPlus(model, "vehicles/" + model.getTypeId(), model.getId());
nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getVehicleModels().put(model.getId(), model);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); VehiclesPlusConverter.getInstance().getLogger().log(java.util.logging.Level.SEVERE, "Could not convert vehicle model: " + baseVehicle.getName(), e);
} }
} }
} }
private static void convertVehicles() { private static void convertVehicles() {
for (Map.Entry<UUID, List<StorageVehicle>> set : VehiclesPlusAPI.getVehicleManager().getPlayerVehicleHashMap().entrySet()) { File baseDir = new File("plugins/VehiclesPlusPro/data");
UUID ownerUUID = set.getKey(); if (!baseDir.exists()) {
for (StorageVehicle vehicle : set.getValue()) { VehiclesPlusConverter.getInstance().getLogger().severe("Could not find the VehiclesPlusPro data folder!");
try { return;
nl.sbdeveloper.vehiclesplus.api.vehicles.impl.StorageVehicle newVehicle = new nl.sbdeveloper.vehiclesplus.api.vehicles.impl.StorageVehicle( }
nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getVehicleModels().values().stream().filter(v -> v.getId().equalsIgnoreCase(vehicle.getBaseVehicle())).findFirst().orElseThrow(() -> new ConversionException("No VehicleModel found for", vehicle.getUuid())),
ownerUUID
);
newVehicle.save(); for (File playerDir : baseDir.listFiles()) {
} catch (Exception e) { if (playerDir.isDirectory()) {
e.printStackTrace(); String ownerUUID = playerDir.getName();
OfflinePlayer player = Bukkit.getOfflinePlayer(UUID.fromString(ownerUUID));
if (player.getName() == null) {
VehiclesPlusConverter.getInstance().getLogger().severe("Could not find player with UUID: " + ownerUUID + ", skipping...");
continue;
} }
VehiclesPlusConverter.getInstance().getLogger().info("Converting vehicles for player with UUID " + ownerUUID + "...");
final Garage garage = nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getPersonalGarage(player);
int i = 0;
for (File vehicleFile : playerDir.listFiles()) {
if (vehicleFile.getName().contains(".yml")) {
StorageVehicle vehicle;
try {
vehicle = StorageVehicle.loadFromStorage(vehicleFile.getAbsolutePath());
} catch (Exception e) {
Bukkit.getLogger().log(Level.SEVERE, "Could not convert vehicles for player with UUID " + ownerUUID + ", could not load the vehicle!", e);
continue;
}
if (vehicle == null) {
Bukkit.getLogger().warning("Failed to load vehicle for player with UUID " + ownerUUID + " from file: " + vehicleFile.getName() + ", skipping...");
continue;
}
try {
nl.sbdeveloper.vehiclesplus.api.vehicles.impl.StorageVehicle newVehicle = new nl.sbdeveloper.vehiclesplus.api.vehicles.impl.StorageVehicle(
UUID.randomUUID(),
nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getVehicleModels().values().stream().filter(v -> v.getId().equalsIgnoreCase(vehicle.getBaseVehicle())).findFirst().orElseThrow(() -> new ConversionException("No VehicleModel found for", vehicle.getUuid(), vehicle.getBaseVehicle(), nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getVehicleModels().keySet())),
false
);
// Set the vehicle's stats
newVehicle.getStatics().forceSetMaxSpeed(vehicle.getVehicleStats().getSpeed());
newVehicle.getStatics().forceSetTurningRadius(vehicle.getVehicleStats().getSteering());
newVehicle.getStatics().forceSetFuelTank(vehicle.getVehicleStats().getFuelTank());
newVehicle.getStatics().setCurrentFuel(vehicle.getVehicleStats().getCurrentFuel());
newVehicle.getStatics().forceSetAcceleration(vehicle.getVehicleStats().getAcceleration());
newVehicle.getStatics().setBroken(vehicle.getVehicleStats().getBroken());
newVehicle.getStatics().setCurrentHealth(vehicle.getVehicleStats().getHealth());
// Set the trunk
newVehicle.getTrunkItems().addAll(Arrays.asList(vehicle.getVehicleTrunk().getContents()));
newVehicle.forceSave();
garage.addVehicle(newVehicle.getUuid());
} catch (Exception e) {
Bukkit.getLogger().log(Level.SEVERE, "Could not convert vehicles for player with UUID " + ownerUUID + ", could not save the vehicle!", e);
}
VehiclesPlusConverter.getInstance().getLogger().info("Converted vehicle: " + vehicle.getUuid());
i++;
}
}
try {
garage.forceSave();
} catch (DataStorageException e) {
Bukkit.getLogger().log(Level.SEVERE, "Could not convert vehicles for player with UUID " + ownerUUID + ", could not save the garage!", e);
}
VehiclesPlusConverter.getInstance().getLogger().info("Converted " + i + " vehicles for player with UUID " + ownerUUID);
} }
} }
} }

View file

@ -1,13 +1,18 @@
package tech.sbdevelopment.vehiclesplusconverter.utils; package tech.sbdevelopment.vehiclesplusconverter.utils;
import com.google.common.io.Files;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import nl.sbdeveloper.vehiclesplus.storage.file.JSONFile; import nl.sbdeveloper.vehiclesplus.storage.file.HJSONFile;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import tech.sbdevelopment.vehiclesplusconverter.VehiclesPlusConverter; import tech.sbdevelopment.vehiclesplusconverter.VehiclesPlusConverter;
import tech.sbdevelopment.vehiclesplusconverter.api.ConversionException; import tech.sbdevelopment.vehiclesplusconverter.api.ConversionException;
import tech.sbdevelopment.vehiclesplusconverter.api.InvalidConversionException; import tech.sbdevelopment.vehiclesplusconverter.api.InvalidConversionException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.logging.Level; import java.util.logging.Level;
public class MainUtil { public class MainUtil {
@ -24,20 +29,45 @@ public class MainUtil {
return split[split.length - 1]; //Last position return split[split.length - 1]; //Last position
} }
public static String idToReadable(String id) {
if (id.contains("_")) {
// Split on _ and capitalize each part
String[] split = id.split("_");
StringBuilder builder = new StringBuilder();
for (String s : split) {
builder.append(s.substring(0, 1).toUpperCase()).append(s.substring(1));
builder.append(" ");
}
return builder.toString().trim();
} else {
// Capitalize the first letter
return id.substring(0, 1).toUpperCase() + id.substring(1);
}
}
public static void disablePlugin(JavaPlugin plugin) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, IOException {
// Call protected .getFile() method, then rename that file to .jar.old and save
Method getFile = JavaPlugin.class.getDeclaredMethod("getFile");
getFile.setAccessible(true);
File file = (File) getFile.invoke(plugin);
File renamedFile = new File(file.getParent(), file.getName() + ".disabled");
Files.move(file, renamedFile);
}
public static String getTypeIdByClass(String baseVehicle, String type) throws ConversionException { public static String getTypeIdByClass(String baseVehicle, String type) throws ConversionException {
switch (type) { switch (type) {
case "BikeType": case "BikeType":
return "bike"; return "bikes";
case "BoatType": case "BoatType":
return "boat"; return "boats";
case "CarType": case "CarType":
return "car"; return "cars";
case "HelicopterType": case "HelicopterType":
return "helicopter"; return "helicopters";
case "HovercraftType": case "HovercraftType":
return "hovercraft"; return "hovercrafts";
case "PlaneType": case "PlaneType":
return "plane"; return "planes";
default: default:
throw new InvalidConversionException("vehicleType", baseVehicle); throw new InvalidConversionException("vehicleType", baseVehicle);
} }
@ -45,13 +75,74 @@ public class MainUtil {
public static void saveToVehiclesPlus(Object data, String subFolder, String fileName) { public static void saveToVehiclesPlus(Object data, String subFolder, String fileName) {
File parentFolders = new File(nl.sbdeveloper.vehiclesplus.VehiclesPlus.getInstance().getDataFolder(), subFolder); File parentFolders = new File(nl.sbdeveloper.vehiclesplus.VehiclesPlus.getInstance().getDataFolder(), subFolder);
if (!parentFolders.exists() && !parentFolders.mkdirs()) return; if (!parentFolders.exists() && !parentFolders.mkdirs()) {
VehiclesPlusConverter.getInstance().getLogger().log(Level.SEVERE, "Couldn't create the folder " + subFolder);
return;
}
JSONFile jsonFile = new JSONFile(nl.sbdeveloper.vehiclesplus.VehiclesPlus.getInstance(), subFolder + "/" + fileName); HJSONFile jsonFile = new HJSONFile(nl.sbdeveloper.vehiclesplus.VehiclesPlus.getInstance(), subFolder + "/" + fileName);
try { try {
jsonFile.write(data); jsonFile.write(data);
} catch (IOException e) { } catch (IOException e) {
VehiclesPlusConverter.getInstance().getLogger().log(Level.SEVERE, "Couldn't save to the file " + fileName, e); VehiclesPlusConverter.getInstance().getLogger().log(Level.SEVERE, "Couldn't save to the file " + fileName, e);
} }
} }
/**
* Compare two ItemStacks for equality based on material type and metadata
*
* @param item1 First ItemStack
* @param item2 Second ItemStack
* @return true if the items are considered equal
*/
public static boolean compareItems(ItemStack item1, ItemStack item2) {
if (item1 == null || item2 == null) return false;
if (!item1.getType().equals(item2.getType())) return false;
org.bukkit.inventory.meta.ItemMeta meta1 = item1.getItemMeta();
org.bukkit.inventory.meta.ItemMeta meta2 = item2.getItemMeta();
if (meta1 == null || meta2 == null) return meta1 == meta2;
// Check CustomModelData if available (1.14+)
try {
return meta1.hasCustomModelData() && meta2.hasCustomModelData()
&& meta1.getCustomModelData() == meta2.getCustomModelData();
} catch (NoSuchMethodError ignored) {
// Pre 1.14, check Durability/Damage value instead
return item1.getDurability() == item2.getDurability();
}
}
private static final String[] RIM_PREFIXES = {
"sport", "racing", "luxury", "classic", "vintage", "modern", "elite", "premium", "pro", "ultra"
};
private static final String[] RIM_TYPES = {
"star", "spoke", "mesh", "alloy", "chrome", "forged", "cast", "split", "blade", "wave"
};
private static final String[] RIM_SUFFIXES = {
"design", "series", "line", "edition", "collection", "style", "plus", "max", "elite", "pro"
};
/**
* Generate a realistic rim design name
*
* @return A random rim design name
*/
public static String generateRimName() {
String prefix = RIM_PREFIXES[(int) (Math.random() * RIM_PREFIXES.length)];
String type = RIM_TYPES[(int) (Math.random() * RIM_TYPES.length)];
String suffix = RIM_SUFFIXES[(int) (Math.random() * RIM_SUFFIXES.length)];
// Add a random number between 100 and 999
int number = 100 + (int) (Math.random() * 900);
// Convert to PascalCase
return prefix.substring(0, 1).toUpperCase() + prefix.substring(1) +
type.substring(0, 1).toUpperCase() + type.substring(1) +
suffix.substring(0, 1).toUpperCase() + suffix.substring(1) +
number;
}
} }

View file

@ -0,0 +1,98 @@
package tech.sbdevelopment.vehiclesplusconverter.utils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Version implements Comparable<Version> {
private static final Pattern VERSION_PATTERN = Pattern.compile(
"([0-9*]+)\\.([0-9*]+)(?:\\.([0-9*]+))?(?:\\.([0-9*]+))?(?:-SNAPSHOT)?"
);
private final Integer major;
private final Integer minor;
private final Integer patch;
private final Integer build;
public static Version of(String version) {
return new Version(version);
}
Version(String version) {
Matcher matcher = VERSION_PATTERN.matcher(version);
if (matcher.matches()) {
this.major = parsePart(matcher.group(1));
this.minor = parsePart(matcher.group(2));
this.patch = matcher.group(3) != null ? parsePart(matcher.group(3)) : null;
this.build = matcher.group(4) != null ? parsePart(matcher.group(4)) : null;
} else {
throw new IllegalArgumentException("Invalid version format: " + version);
}
}
private Integer parsePart(String part) {
if ("*".equals(part)) {
return null; // wildcard
} else {
return Integer.parseInt(part);
}
}
public boolean isNewerThan(Version other) {
return compareTo(other) > 0;
}
public boolean isOlderThan(Version other) {
return compareTo(other) < 0;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Version version = (Version) obj;
return this.compareTo(version) == 0;
}
@Override
public int compareTo(Version other) {
int result = comparePart(this.major, other.major);
if (result != 0) return result;
result = comparePart(this.minor, other.minor);
if (result != 0) return result;
result = comparePart(this.patch, other.patch);
if (result != 0) return result;
return comparePart(this.build, other.build);
}
private int comparePart(Integer part1, Integer part2) {
if (part1 == null && part2 == null) return 0;
if (part1 == null) return -1; // wildcard is less than any number
if (part2 == null) return 1; // any number is greater than wildcard
return Integer.compare(part1, part2);
}
@Override
public int hashCode() {
int result = (major != null ? major.hashCode() : 0);
result = 31 * result + (minor != null ? minor.hashCode() : 0);
result = 31 * result + (patch != null ? patch.hashCode() : 0);
result = 31 * result + (build != null ? build.hashCode() : 0);
return result;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(major != null ? major : "*").append('.')
.append(minor != null ? minor : "*");
if (patch != null || build != null) sb.append('.').append(patch != null ? patch : "*");
if (build != null) sb.append('.').append(build);
return sb.toString();
}
}

View file

@ -1,7 +1,7 @@
name: VehiclesPlusConverter name: VehiclesPlusConverter
version: '${project.version}' version: '${project.version}'
main: tech.sbdevelopment.vehiclesplusconverter.VehiclesPlusConverter main: tech.sbdevelopment.vehiclesplusconverter.VehiclesPlusConverter
api-version: 1.19 api-version: 1.13
authors: [ SBDeveloper ] authors: [ SBDeveloper ]
description: Conversion plugin for v2 to v3. description: Conversion plugin for v2 to v3.
website: sbdevelopment.tech website: sbdevelopment.tech