package tech.sbdevelopment.vehiclesplusconverter.handlers; import me.legofreak107.vehiclesplus.VehiclesPlus; import me.legofreak107.vehiclesplus.vehicles.api.VehiclesPlusAPI; import me.legofreak107.vehiclesplus.vehicles.fuel.FuelType; import me.legofreak107.vehiclesplus.vehicles.rims.RimDesign; import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.BaseVehicle; import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.StorageVehicle; import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.Part; import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.Wheel; import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.seats.BikeSeat; import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.seats.Seat; import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.seats.TurretSeat; import me.legofreak107.vehiclesplus.vehicles.vehicles.objects.addons.skins.BikeSkin; 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.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.settings.UpgradableSetting; 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.command.CommandSender; import org.bukkit.scheduler.BukkitRunnable; import tech.sbdevelopment.vehiclesplusconverter.VehiclesPlusConverter; import tech.sbdevelopment.vehiclesplusconverter.api.ConversionException; import java.util.List; import java.util.Map; import java.util.UUID; import static tech.sbdevelopment.vehiclesplusconverter.utils.MainUtil.*; public class Converter { private Converter() { } private static final Sounds defaultSounds = Sounds.builder() .idle(new Sounds.Sound("car.idle", 6)) .start(new Sounds.Sound("car.start", 2)) .accelerate(new Sounds.Sound("car.accelerate", 2)) .driving(new Sounds.Sound("car.driving", 2)) .slowingDown(new Sounds.Sound("car.slowingdown", 2)) .build(); public static void convert(CommandSender sender) { sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &fStarting v2 to v3 conversion...")); sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &fConverting rim designs...")); convertRims(); sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &fConverting fuel types...")); convertFuels(); sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &fConverting vehicle models...")); convertVehicleModels(); sender.sendMessage(__("&7[&3&lVehiclesPlusConverter&7] &fConverting vehicles...")); convertVehicles(); Bukkit.getScheduler().runTaskLater(VehiclesPlusConverter.getInstance(), () -> Bukkit.getServer().shutdown(), 20L * 15); new BukkitRunnable() { int counter = 15; @Override public void run() { 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 e) { e.printStackTrace(); } } counter--; } }.runTaskTimer(VehiclesPlusConverter.getInstance(), 20L, 20L); } private static void convertRims() { for (Map.Entry entry : VehiclesPlus.getVehicleManager().getRimDesignHashMap().entrySet()) { nl.sbdeveloper.vehiclesplus.api.vehicles.rims.RimDesign rd = new nl.sbdeveloper.vehiclesplus.api.vehicles.rims.RimDesign( entry.getValue().getName(), entry.getValue().getSkin(), HolderItemPosition.HEAD, entry.getValue().getPrice() ); nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getRimDesigns().put(entry.getKey(), rd); VehiclesPlusConverter.getInstance().getLogger().info("Converted rim design: " + rd.getName()); } } private static void convertFuels() { for (Map.Entry entry : VehiclesPlus.getVehicleManager().getFuelTypeHashMap().entrySet()) { nl.sbdeveloper.vehiclesplus.api.vehicles.fuel.FuelType ft = new nl.sbdeveloper.vehiclesplus.api.vehicles.fuel.FuelType( entry.getValue().getName(), entry.getValue().getFuelItem(), entry.getValue().getPricePerLiter() ); nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getFuelTypes().put(entry.getKey(), ft); VehiclesPlusConverter.getInstance().getLogger().info("Converted fuel type: " + ft.getName()); } } 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()) { try { VehicleModel.Builder vehicleModelBuilder = VehicleModel.builder() .id(baseVehicle.getName()) .displayName(idToReadable(baseVehicle.getName())) .typeId(getTypeIdByClass(baseVehicle.getName(), getClassByFullName(baseVehicle.getVehicleType()))) .availableColors(new ColorList(baseVehicle.getBaseColorList())); for (Part part : baseVehicle.getPartList()) { if (part instanceof BikeSeat) { BikeSeat bikeSeat = (BikeSeat) part; vehicleModelBuilder = vehicleModelBuilder.part(new nl.sbdeveloper.vehiclesplus.api.vehicles.parts.impl.seat.BikeSeat( bikeSeat.getXOffset(), bikeSeat.getYOffset(), bikeSeat.getZOffset(), bikeSeat.getSteer() )); } else if (part instanceof TurretSeat) { TurretSeat turretSeat = (TurretSeat) part; vehicleModelBuilder = vehicleModelBuilder.part(new nl.sbdeveloper.vehiclesplus.api.vehicles.parts.impl.seat.TurretSeat( turretSeat.getXOffset(), turretSeat.getYOffset(), turretSeat.getZOffset(), 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) { Seat seat = (Seat) part; vehicleModelBuilder = vehicleModelBuilder.part(new nl.sbdeveloper.vehiclesplus.api.vehicles.parts.impl.seat.Seat( seat.getXOffset(), seat.getYOffset(), seat.getZOffset(), seat.getSteer() )); } else if (part instanceof BikeSkin) { BikeSkin bikeSkin = (BikeSkin) part; vehicleModelBuilder = vehicleModelBuilder.part(new nl.sbdeveloper.vehiclesplus.api.vehicles.parts.impl.skin.BikeSkin( bikeSkin.getXOffset(), bikeSkin.getYOffset(), bikeSkin.getZOffset(), bikeSkin.getSkinColored(), HolderItemPosition.HEAD )); } else if (part instanceof Rotor) { Rotor rotor = (Rotor) part; vehicleModelBuilder = vehicleModelBuilder.part(new nl.sbdeveloper.vehiclesplus.api.vehicles.parts.impl.skin.Rotor( rotor.getXOffset(), rotor.getYOffset(), rotor.getZOffset(), rotor.getSkinColored(), HolderItemPosition.HEAD )); } else if (part instanceof Turret) { Turret turret = (Turret) part; vehicleModelBuilder = vehicleModelBuilder.part(new nl.sbdeveloper.vehiclesplus.api.vehicles.parts.impl.skin.Turret( turret.getXOffset(), turret.getYOffset(), turret.getZOffset(), turret.getSkin(), HolderItemPosition.HEAD, turret.getExplosionSize(), turret.getAmmo() )); } else if (part instanceof Skin) { Skin skin = (Skin) part; vehicleModelBuilder = vehicleModelBuilder.part(new nl.sbdeveloper.vehiclesplus.api.vehicles.parts.impl.skin.Skin( skin.getXOffset(), skin.getYOffset(), skin.getZOffset(), skin.getSkinColored(), HolderItemPosition.HEAD )); } else if (part instanceof Wheel) { Wheel wheel = (Wheel) part; vehicleModelBuilder = vehicleModelBuilder.part(new nl.sbdeveloper.vehiclesplus.api.vehicles.parts.impl.Wheel( wheel.getXOffset(), wheel.getYOffset(), wheel.getZOffset(), nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getRimDesign(VehiclesPlus.getVehicleManager().getRimDesignHashMap().values().stream().findFirst().orElseThrow(() -> new ConversionException("No RimDesign found while loading Wheel in file", baseVehicle.getName())).getName()).orElseThrow(() -> new ConversionException("No matching RimDesign found while loading Wheel in file", baseVehicle.getName())), wheel.getColor(), wheel.getSteering(), wheel.getRotationOffset() )); } } VehicleModel model = vehicleModelBuilder .maxSpeed(new UpgradableSetting( baseVehicle.getSpeedSettings().getBase(), baseVehicle.getSpeedSettings().getMax(), baseVehicle.getSpeedSettings().getStep(), baseVehicle.getSpeedSettings().getUpgradeCost(), "km/h" )) .fuelTank(new UpgradableSetting( baseVehicle.getFuelTankSettings().getBase(), baseVehicle.getFuelTankSettings().getMax(), baseVehicle.getFuelTankSettings().getStep(), baseVehicle.getFuelTankSettings().getUpgradeCost(), "L" )) .turningRadius(new UpgradableSetting( baseVehicle.getTurningRadiusSettings().getBase(), baseVehicle.getTurningRadiusSettings().getMax(), baseVehicle.getTurningRadiusSettings().getStep(), baseVehicle.getTurningRadiusSettings().getUpgradeCost(), "" )) .acceleration(new UpgradableSetting( baseVehicle.getAccelerationSettings().getBase(), baseVehicle.getAccelerationSettings().getMax(), baseVehicle.getAccelerationSettings().getStep(), baseVehicle.getAccelerationSettings().getUpgradeCost(), "" )) .horn(new Horn( baseVehicle.getHornSettings().getEnabled(), new Sounds.Sound( baseVehicle.getHornSettings().getSound().parseSound().name(), 1 ) )) .drift(baseVehicle.getDrift()) .exhaust(new Exhaust( baseVehicle.getExhaustSettings().getEnabled(), baseVehicle.getExhaustSettings().getXOffset(), baseVehicle.getExhaustSettings().getYOffset(), baseVehicle.getExhaustSettings().getZOffset(), baseVehicle.getExhaustSettings().getParticleName().get() )) .exitWhileMoving(baseVehicle.getCanExitWhileMoving()) .price(baseVehicle.getPrice()) .fuel(new Fuel( baseVehicle.getFuelSettings().getType(), baseVehicle.getFuelSettings().getUsage() )) .health(baseVehicle.getHealth()) .trunkSize(baseVehicle.getTrunkSize()) .hitbox(new Hitbox( baseVehicle.getHitbox().getLength(), baseVehicle.getHitbox().getWidth(), baseVehicle.getHitbox().getHeight() )) .realisticSteering(baseVehicle.getSteeringType()) .permissions(baseVehicle.getPermissions() != null ? Permissions.builder() .buy(baseVehicle.getPermissions().getBuyPermission()) .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()) .spawn("vp.spawn." + baseVehicle.getName()) .build()) .sounds(defaultSounds) .gearbox(new Gearbox(true, 10)) .build(); VehiclesPlusConverter.getInstance().getLogger().info("Converted vehicle model: " + model.getId()); saveToVehiclesPlus(model, "vehicles/" + model.getTypeId(), model.getId()); } catch (Exception e) { e.printStackTrace(); } } } private static void convertVehicles() { for (Map.Entry> set : VehiclesPlusAPI.getVehicleManager().getPlayerVehicleHashMap().entrySet()) { UUID ownerUUID = set.getKey(); String ownerName = Bukkit.getOfflinePlayer(ownerUUID).getName(); if (ownerName == null) { VehiclesPlusConverter.getInstance().getLogger().severe("Could not convert vehicles for player with UUID " + ownerUUID + ", the player name is unknown!"); continue; } final Garage garage = nl.sbdeveloper.vehiclesplus.api.VehiclesPlusAPI.getGarage(ownerName).orElseGet(() -> new Garage(ownerName, ownerUUID)); VehiclesPlusConverter.getInstance().getLogger().info("Converting vehicles for player with UUID " + ownerUUID + " (" + ownerName + ")..."); for (StorageVehicle vehicle : set.getValue()) { 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())), false ); newVehicle.forceSave(); garage.addVehicle(newVehicle.getUuid()); } catch (Exception e) { e.printStackTrace(); Bukkit.getLogger().severe("Could not convert vehicles for player with UUID " + ownerUUID + ", could not save the vehicle!"); } VehiclesPlusConverter.getInstance().getLogger().info("Converted vehicle: " + vehicle.getUuid()); } try { garage.forceSave(); } catch (DataStorageException e) { e.printStackTrace(); Bukkit.getLogger().severe("Could not convert vehicles for player with UUID " + ownerUUID + ", could not save the garage!"); } } } }