DEADSOFTWARE

Update version script
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / objects / container / ContainerController.kt
1 package ru.deadsoftware.cavedroid.game.objects.container
3 import com.badlogic.gdx.Gdx
4 import ru.deadsoftware.cavedroid.game.GameItemsHolder
5 import ru.deadsoftware.cavedroid.game.GameScope
6 import ru.deadsoftware.cavedroid.game.model.block.Block
7 import ru.deadsoftware.cavedroid.game.model.item.InventoryItem.Companion.isNoneOrNull
8 import ru.deadsoftware.cavedroid.game.objects.drop.DropController
9 import ru.deadsoftware.cavedroid.misc.utils.px
10 import java.io.Serializable
11 import javax.inject.Inject
13 @GameScope
14 class ContainerController @Inject constructor(
15 _dropController: DropController,
16 _gameItemsHolder: GameItemsHolder
17 ) : Serializable {
19 @Suppress("UNNECESSARY_LATEINIT")
20 @Transient
21 private lateinit var dropController: DropController
23 @Suppress("UNNECESSARY_LATEINIT")
24 @Transient
25 private lateinit var gameItemsHolder: GameItemsHolder
27 private val containerMap = mutableMapOf<String, Container>()
29 val size get() = containerMap.size
31 init {
32 dropController = _dropController
33 gameItemsHolder = _gameItemsHolder
34 }
36 fun init(dropController: DropController, gameItemsHolder: GameItemsHolder) {
37 this.dropController = dropController
38 this.gameItemsHolder = gameItemsHolder
39 containerMap.forEach { (_, container) -> container.initItems(gameItemsHolder) }
40 }
42 fun getContainer(x: Int, y: Int, z: Int): Container? {
43 return containerMap["$x;$y;$z"]
44 }
46 fun addContainer(x: Int, y: Int, z: Int, clazz: Class<out Block.Container>) {
47 val container = when (clazz) {
48 Block.Furnace::class.java -> Furnace(gameItemsHolder)
49 Block.Chest::class.java -> Chest(gameItemsHolder)
50 else -> {
51 Gdx.app.error(TAG, "Unknown container class $clazz")
52 return
53 }
54 }
55 containerMap["$x;$y;$z"] = container
56 }
58 @JvmOverloads
59 fun destroyContainer(x: Int, y: Int, z: Int, dropItems: Boolean = true) {
60 val container = containerMap.remove("$x;$y;$z") ?: return
62 if (!dropItems) {
63 return
64 }
66 val xPx = (x + .5f).px
67 val yPx = (y + .5f).px
69 container.items.forEach { item ->
70 if (!item.isNoneOrNull()) {
71 dropController.addDrop(xPx, yPx, item)
72 }
73 }
74 }
76 fun update() {
77 containerMap.forEach { (_, container) ->
78 container.update(gameItemsHolder)
79 }
80 }
82 companion object {
83 private const val TAG = "ContainerController"
84 }
86 }