From bdd00676e66e3f4e14bf55a0f6dffb144ada1c55 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 9 Mar 2025 12:56:26 +0900 Subject: [PATCH] no-auto-pickup variant of droppeditem --- .../terrarum/modulebasegame/TerrarumIngame.kt | 38 ++++++++++++++++++- .../terrarum/modulebasegame/WorldSimulator.kt | 2 +- .../gameactors/ActorInventory.kt | 2 +- .../modulebasegame/gameactors/DroppedItem.kt | 9 +++-- .../gameitems/FixtureItemBase.kt | 4 +- .../gameworld/GameConveyorLinkages.kt | 22 +++++++++++ .../gameworld/GamePostalService.kt | 1 + 7 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 src/net/torvald/terrarum/modulebasegame/gameworld/GameConveyorLinkages.kt diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index d166e2092..218ff2b51 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -793,7 +793,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { // #2. If #1 failed, try to pick up the fixture else { mouseInInteractableRange(actor) { mwx, mwy, mtx, mty -> - pickupFixture(actor, delta, mwx, mwy, mtx, mty) + pickupFixtureOrDroppedItem(actor, delta, mwx, mwy, mtx, mty) 0L } } @@ -1702,13 +1702,16 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { return actorsUnderMouse } - fun pickupFixture(actor: ActorWithBody, delta: Float, mwx: Double, mwy: Double, mtx: Int, mty: Int, assignToQuickslot: Boolean = true) { + fun pickupFixtureOrDroppedItem(actor: ActorWithBody, delta: Float, mwx: Double, mwy: Double, mtx: Int, mty: Int, assignToQuickslot: Boolean = true) { val actorsUnderMouse = getActorsUnderMouse(mwx, mwy) val fixture = actorsUnderMouse.firstOrNull { it is FixtureBase && it.canBeDespawned && System.nanoTime() - it.spawnRequestedTime > 500000000 // don't pick up the fixture if it was recently placed (0.5 seconds) } as? FixtureBase + val droppedItemNoAutoPickup = actorsUnderMouse.firstOrNull { + it is DroppedItem && it.noAutoPickup + } as? DroppedItem val mob = actorsUnderMouse.firstOrNull { it !is FixtureBase && it.physProp.usePhysics && !it.physProp.immobileBody } as? ActorWithBody @@ -1743,6 +1746,37 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { } } } + // pickup a dropped item (no auto-pickup variants only) + else if (droppedItemNoAutoPickup != null) { + val droppedItemID = droppedItemNoAutoPickup.itemID + val droppedItemCount = droppedItemNoAutoPickup.itemCount + // 0. hide tooltips + TooltipManager.tooltipShowing.clear() + setTooltipMessage(null) + if (!droppedItemNoAutoPickup.flagDespawn) { + // 1. put the fixture to the inventory + droppedItemNoAutoPickup.flagDespawn() + // 2. register this item(fixture) to the quickslot so that the player sprite would be actually lifting the fixture + // BUUUUUUUT, only when the slot is already empty this time + if (actor is Pocketed) { + actor.inventory.add(droppedItemID, droppedItemCount) + + if (assignToQuickslot && actor.inventory.getQuickslotItem(actor.actorValue.getAsInt(AVKey.__PLAYER_QUICKSLOTSEL)) == null) { + actor.equipItem(droppedItemID) + actor.inventory.setQuickslotItemAtSelected(droppedItemID) + // 2-1. unregister if other slot has the same item + for (k in 0..9) { + if (actor.inventory.getQuickslotItem(k)?.itm == droppedItemID && k != actor.actorValue.getAsInt( + AVKey.__PLAYER_QUICKSLOTSEL + ) + ) { + actor.inventory.setQuickslotItem(k, null) + } + } + } + } + } + } else if (mob != null) { // TODO pickup a mob } diff --git a/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt b/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt index 7b9f1460e..bbb981a5a 100644 --- a/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt +++ b/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt @@ -195,7 +195,7 @@ object WorldSimulator { fun collideDroppedItems() { ingame.actorContainerActive.filter { it is DroppedItem }.forEach { droppedItem0 -> val droppedItem = droppedItem0 as DroppedItem - if (droppedItem.canBePickedUp()) { + if (droppedItem.canBePickedUpAutomatically()) { val actors = ingame.findKNearestActors(droppedItem0 as ActorWithBody, 64) { it is Controllable && it is Pocketed } for (result in actors) { val actor = result.get() diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorInventory.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorInventory.kt index c7650dc43..4fa45f4b3 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorInventory.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorInventory.kt @@ -96,7 +96,7 @@ class ActorInventory() : FixtureInventory() { } } - fun getQuickslotItem(slot: Int): InventoryPair? = searchByID(quickSlot[slot]) + fun getQuickslotItem(slot: Int?): InventoryPair? = if (slot == null) null else searchByID(quickSlot[slot]) fun consumeItem(item: GameItem, amount: Long = 1L) { val actor = this.actor as Actor diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt index f2d67a28f..00cc8a178 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt @@ -5,7 +5,6 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion import com.jme3.math.FastMath import net.torvald.gdx.graphics.Cvec import net.torvald.terrarum.* -import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.gameactors.* @@ -39,7 +38,9 @@ class DroppedItem : ActorWithBody { private var timeSinceSpawned = 0f - fun canBePickedUp() = timeSinceSpawned > NO_PICKUP_TIME && !flagDespawn + var noAutoPickup = false + + fun canBePickedUpAutomatically() = !noAutoPickup && timeSinceSpawned > NO_PICKUP_TIME && !flagDespawn private val randKey1 = (Math.random() * 256).toInt() private val randKey2 = (Math.random() * 256).toInt() @@ -53,7 +54,7 @@ class DroppedItem : ActorWithBody { * @param topLeftX world-wise coord * @param topLeftY world-wise coord */ - constructor(itemID: ItemID, centreX: Double, bottomY: Double, spawnVelo: Vector2? = null) : super(RenderOrder.OVERLAY, PhysProperties.PHYSICS_OBJECT()) { + constructor(itemID: ItemID, centreX: Double, bottomY: Double, spawnVelo: Vector2? = null, noAutoPickup: Boolean = false) : super(RenderOrder.OVERLAY, PhysProperties.PHYSICS_OBJECT()) { this.itemID = itemID if (itemID.isActor()) @@ -94,6 +95,8 @@ class DroppedItem : ActorWithBody { // printdbg(this, "DroppedItem with itemID '${itemID}'") physProp.ignorePlatform = false + + this.noAutoPickup = noAutoPickup } diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt index f35b1f903..8581ab930 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt @@ -3,12 +3,10 @@ package net.torvald.terrarum.modulebasegame.gameitems import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.* -import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameitems.mouseInInteractableRange -import net.torvald.terrarum.itemproperties.Material import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.FixtureBase import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer @@ -107,7 +105,7 @@ open class FixtureItemBase(originalID: ItemID, val fixtureClassName: String) : G } override fun startSecondaryUse(actor: ActorWithBody, delta: Float) = mouseInInteractableRange(actor) { mwx, mwy, mtx, mty -> - (INGAME as TerrarumIngame).pickupFixture(actor, delta, mwx, mwy, mtx, mty, false) + (INGAME as TerrarumIngame).pickupFixtureOrDroppedItem(actor, delta, mwx, mwy, mtx, mty, false) -1 } diff --git a/src/net/torvald/terrarum/modulebasegame/gameworld/GameConveyorLinkages.kt b/src/net/torvald/terrarum/modulebasegame/gameworld/GameConveyorLinkages.kt new file mode 100644 index 000000000..e5ac031c0 --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/gameworld/GameConveyorLinkages.kt @@ -0,0 +1,22 @@ +package net.torvald.terrarum.modulebasegame.gameworld + +import net.torvald.terrarum.Point2i +import net.torvald.terrarum.gameworld.TerrarumSavegameExtrafieldSerialisable +import java.util.* +import kotlin.collections.ArrayList + +/** + * Created by minjaesong on 2025-03-09. + */ +class GameConveyorLinkages : TerrarumSavegameExtrafieldSerialisable { + + internal val ledger = ArrayList() + +} + +data class ConveyorBeltInstallation( + val type: Int, + val p: Point2i, + val q: Point2i, + val installer: UUID? +) \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameworld/GamePostalService.kt b/src/net/torvald/terrarum/modulebasegame/gameworld/GamePostalService.kt index e8b1974d9..0646f21ec 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameworld/GamePostalService.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameworld/GamePostalService.kt @@ -12,6 +12,7 @@ import kotlin.math.ceil */ class GamePostalService : TerrarumSavegameExtrafieldSerialisable { + internal val centralPostbox = ArrayList() companion object { private val reXmlTag = Regex("""<[^>]+>""")