- Add building addon database schema - Add addon modifiers and requires schema - Change weapon-entity many-to-many tables unique keys (same weapon can be in different hardpoint or positions, so unique key is unit+weapon+hardpoint+pozition) - Add building rgd extract service - Add building addons rgd extract service - Add weapon min radius, damage radius, min-max throw force - Fix bug, when same weapon not show in different slots
77 lines
3.1 KiB
Kotlin
77 lines
3.1 KiB
Kotlin
package com.dowstats.service.datamaps
|
|
|
|
import com.dowstats.data.dto.controllers.RaceUnits
|
|
import com.dowstats.data.dto.controllers.UnitDto
|
|
import com.dowstats.data.entities.DowUnit
|
|
import com.dowstats.data.entities.Race
|
|
import com.dowstats.data.repositories.RaceRepository
|
|
import com.dowstats.data.repositories.UnitRepository
|
|
import org.springframework.beans.factory.annotation.Autowired
|
|
import org.springframework.stereotype.Service
|
|
|
|
@Service
|
|
class DowUnitMappingService @Autowired constructor(
|
|
val unitRepository: UnitRepository,
|
|
val raceRepository: RaceRepository
|
|
) {
|
|
|
|
fun findUnitsByMod(modId: Long): List<RaceUnits> {
|
|
val races = raceRepository.findRacesByMod(modId)
|
|
return getAllUnits(modId).groupBy { it.race }.map {raceUnits ->
|
|
toRaceUnitsDto(raceUnits.value, races.first { it.id == raceUnits.key?.id } )
|
|
}
|
|
}
|
|
|
|
fun findUnitsByModAndRace(modId: Long, race: String): RaceUnits {
|
|
val units = getAllUnits(modId, race)
|
|
val raceEntity = race.let{ raceRepository.findById(race) ?: throw Exception("Race $race not found") }
|
|
return toRaceUnitsDto(units, raceEntity)
|
|
}
|
|
|
|
private fun toRaceUnitsDto(units: List<DowUnit>, race: Race): RaceUnits {
|
|
val infantry = units
|
|
.filter { it.capInfantry?.let { it > 0 } ?: false || it.reinforceCostPopulation?.let { it > 0 } ?: false }
|
|
.toUnitDto()
|
|
|
|
val tech = units
|
|
.filter { it.capSupport?.let { it > 0 } ?: false }
|
|
.toUnitDto()
|
|
|
|
val support = units.filter {
|
|
it.capInfantry?.let { it == 0 } ?: false && it.reinforceCostPopulation?.let { it == 0 } ?: true &&
|
|
it.capSupport?.let { it == 0 } ?: false
|
|
}
|
|
.toUnitDto()
|
|
|
|
return RaceUnits(race, infantry, tech, support)
|
|
}
|
|
|
|
|
|
private fun List<DowUnit>.toUnitDto(): List<UnitDto> =
|
|
this.mapNotNull {
|
|
val name = it.name ?: it.filename
|
|
val icon = it.icon
|
|
if (name == null || icon == null) null else UnitDto(name, icon, it.id!!,
|
|
it.armorType?.name!!,
|
|
(it.detectRadius ?: 0) > 0)
|
|
}
|
|
|
|
|
|
private fun getAllUnits(modId: Long, race: String? = null): List<DowUnit> {
|
|
val raceEntity = race?.let{ raceRepository.findById(race) ?: throw Exception("Race $race not found") }
|
|
return filterCompanyUnits(unitRepository.findByModIdAndRace(modId, raceEntity))
|
|
}
|
|
|
|
private fun filterCompanyUnits(units: List<DowUnit>): List<DowUnit> =
|
|
units.filter {
|
|
it.filename?.contains("_sp.") != true
|
|
&& it.filename?.contains("_sp_") != true
|
|
&& it.filename?.contains("sp_eldar_") != true
|
|
&& it.filename?.contains("_dxp3.") != true
|
|
&& it.filename?.contains("_dxp3_") != true
|
|
&& it.filename?.contains("_nis.") != true
|
|
&& it.filename?.contains("_exarch_council.") != true
|
|
&& it.filename?.contains("_dark_reapers_base.") != true
|
|
&& it.filename?.contains("tau_squad_slave_murdered") != true
|
|
}
|
|
} |