diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index f1e285986..4e9742ba6 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt
index b8dc12b72..6d8852c5b 100644
--- a/src/net/torvald/terrarum/IngameInstance.kt
+++ b/src/net/torvald/terrarum/IngameInstance.kt
@@ -1,6 +1,5 @@
package net.torvald.terrarum
-import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.utils.Disposable
import com.badlogic.gdx.utils.GdxRuntimeException
import net.torvald.terrarum.App.printdbg
@@ -126,8 +125,8 @@ open class IngameInstance(val batch: FlippingSpriteBatch, val isMultiplayer: Boo
val actorContainerActive = SortedArrayList(ACTORCONTAINER_INITIAL_SIZE)
val actorContainerInactive = SortedArrayList(ACTORCONTAINER_INITIAL_SIZE)
- val actorAdditionQueue = ArrayList()
- val actorRemovalQueue = ArrayList()
+ val actorAdditionQueue = ArrayList>()
+ val actorRemovalQueue = ArrayList>()
/**
* ## BIG NOTE: Calculated actor distance is the **Euclidean distance SQUARED**
@@ -316,10 +315,10 @@ open class IngameInstance(val batch: FlippingSpriteBatch, val isMultiplayer: Boo
*/
open fun queueActorRemoval(actor: Actor?) {
if (actor == null) return
- actorRemovalQueue.add(actor)
+ actorRemovalQueue.add(actor to StackTraceRecorder())
}
- protected open fun forceRemoveActor(actor: Actor) {
+ protected open fun forceRemoveActor(actor: Actor, caller: Throwable = StackTraceRecorder()) {
arrayOf(actorContainerActive, actorContainerInactive).forEach { actorContainer ->
val indexToDelete = actorContainer.searchFor(actor.referenceID) { it.referenceID }
if (indexToDelete != null) {
@@ -329,14 +328,14 @@ open class IngameInstance(val batch: FlippingSpriteBatch, val isMultiplayer: Boo
}
}
- protected open fun forceAddActor(actor: Actor?) {
+ protected open fun forceAddActor(actor: Actor?, caller: Throwable = StackTraceRecorder()) {
if (actor == null) return
if (theGameHasActor(actor.referenceID)) {
- throw ReferencedActorAlreadyExistsException(actor)
+ throw ReferencedActorAlreadyExistsException(actor, caller)
}
else {
- actorAdditionQueue.add(actor)
+ actorAdditionQueue.add(actor to StackTraceRecorder())
}
}
@@ -345,7 +344,7 @@ open class IngameInstance(val batch: FlippingSpriteBatch, val isMultiplayer: Boo
*/
open fun queueActorAddition(actor: Actor?) {
if (actor == null) return
- actorAdditionQueue.add(actor)
+ actorAdditionQueue.add(actor to StackTraceRecorder())
}
fun isActive(ID: Int): Boolean =
@@ -498,10 +497,11 @@ inline fun Lock.lock(body: () -> Unit) {
}
}
+class StackTraceRecorder() : Exception("(I'm here to just record the stack trace, move along)")
class NoSuchActorWithIDException(id: ActorID) : Exception("Actor with ID $id does not exist.")
class NoSuchActorWithRefException(actor: Actor) : Exception("No such actor in the game: $actor")
-class ReferencedActorAlreadyExistsException(actor: Actor) : Exception("The actor $actor already exists in the game")
-class ProtectedActorRemovalException(whatisit: String) : Exception("Attempted to removed protected actor '$whatisit'")
+class ReferencedActorAlreadyExistsException(actor: Actor, caller: Throwable) : Exception("The actor $actor already exists in the game", caller)
+class ProtectedActorRemovalException(whatisit: String, caller: Throwable) : Exception("Attempted to removed protected actor '$whatisit'", caller)
val INGAME: IngameInstance
get() = Terrarum.ingame!!
diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt
index 8b654b0d4..8ca90b7ec 100644
--- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt
+++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt
@@ -775,7 +775,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
repossessActor()
// process actor addition requests
- actorAdditionQueue.forEach { forceAddActor(it) }
+ actorAdditionQueue.forEach { forceAddActor(it.first, it.second) }
actorAdditionQueue.clear()
// determine whether the inactive actor should be activated
wakeDormantActors()
@@ -784,7 +784,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
// determine whether the actor should keep being activated or be dormant
killOrKnockdownActors()
// process actor removal requests
- actorRemovalQueue.forEach { forceRemoveActor(it) }
+ actorRemovalQueue.forEach { forceRemoveActor(it.first, it.second) }
actorRemovalQueue.clear()
// update particles
particlesContainer.forEach { if (!it.flagDespawn) particlesActive++; it.update(delta) }
@@ -1141,7 +1141,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
}
- override fun forceRemoveActor(actor: Actor) {
+ override fun forceRemoveActor(actor: Actor, caller: Throwable) {
arrayOf(actorContainerActive, actorContainerInactive).forEach { actorContainer ->
val indexToDelete = actorContainer.searchForIndex(actor.referenceID) { it.referenceID }
if (indexToDelete != null) {
@@ -1185,11 +1185,11 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
/**
* Check for duplicates, append actor and sort the list
*/
- override fun forceAddActor(actor: Actor?) {
+ override fun forceAddActor(actor: Actor?, caller: Throwable) {
if (actor == null) return
if (theGameHasActor(actor.referenceID)) {
- throw ReferencedActorAlreadyExistsException(actor)
+ throw ReferencedActorAlreadyExistsException(actor, caller)
}
else {
actorContainerActive.add(actor)
diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt
index 9b31a7acf..bd6cf00c8 100644
--- a/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt
+++ b/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt
@@ -26,6 +26,8 @@ open class DroppedItem : ActorWithBody {
var itemID: ItemID = ""; private set
+ @Transient private var visualItemID = ""
+
@Transient private var textureRegion: TextureRegion? = null // deserialiser won't call setter of the fields
var itemCount = 1L
@@ -76,8 +78,11 @@ open class DroppedItem : ActorWithBody {
override fun drawBody(batch: SpriteBatch) {
// deserialiser won't call setter of the fields
+ if (visualItemID == "") {
+ visualItemID = BlockCodex.getOrNull(itemID)?.world ?: itemID
+ }
if (textureRegion == null) {
- textureRegion = ItemCodex.getItemImage(itemID)!!
+ textureRegion = ItemCodex.getItemImage(visualItemID)!!
}
// copy-pasted from ActorWithBody.drawSpriteInGoodPosition()
diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt
index a9e15801b..8e1be7596 100644
--- a/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt
+++ b/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt
@@ -87,7 +87,7 @@ open class FixtureItemBase(originalID: ItemID, val fixtureClassName: String) : G
}
override fun startPrimaryUse(actor: ActorWithBody, delta: Float) = mouseInInteractableRange(actor) {
- val item = ghostItem.get()//makeFixture()
+ val item = ghostItem.getAndSet(makeFixture()) // renew the "ghost" otherwise you'll be spawning exactly the same fixture again; old ghost will be returned
item.spawn(Terrarum.mouseTileX, Terrarum.mouseTileY - item.blockBox.height + 1)
// return true when placed, false when cannot be placed