Anibus 3666b92626 - Add building database schema
- 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
2025-04-10 03:48:24 +03:00

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