RafaelBarbosatec / bonfire

(RPG maker) Create RPG-style or similar games more simply with Flame.
https://bonfire-engine.github.io
MIT License
1.18k stars 177 forks source link

[Bug]: Crash when flying object projectile is hurled #520

Closed tkshnwesper closed 1 month ago

tkshnwesper commented 1 month ago

What happened?

Game crashes after player releases a ranged projectile.

Steps to reproduce?

It is easy to reproduce. I have done so in the Platform minigame example in my fork https://github.com/tkshnwesper/bonfire by adding a simpleAttackRange. Here is the commit https://github.com/tkshnwesper/bonfire/commit/de1956c71d6fa347096dd605dde7f206aff4b703 if you want to see the changes.

What did you expect to happen?

It should not have crashed.

Bonfire version

Both 3.9.2 and 3.9.0

Relevant log output

════════ Exception caught by scheduler library ═════════════════════════════════
The following StateError was thrown during a scheduler callback:
Bad state: No element

When the exception was thrown, this was the stack:
#0      Iterable.reduce (dart:core/iterable.dart:375:7)
#1      BlockMovementCollision._getCollisionShapeHitbox (package:bonfire/collision/block_movement_collision.dart:304:30)
#2      BlockMovementCollision.onCollision (package:bonfire/collision/block_movement_collision.dart:110:26)
#3      FlyingAttackGameObject.onCollision (package:bonfire/objects/flying_attack_game_object.dart:131:11)
#4      ShapeHitbox.onCollision (package:flame/src/collisions/hitboxes/shape_hitbox.dart:197:44)
#5      StandardCollisionDetection.handleCollision (package:flame/src/collisions/standard_collision_detection.dart:53:13)
#6      CollisionDetection.run (package:flame/src/collisions/collision_detection.dart:49:11)
#7      CustomQuadTreeCollisionDetection.run (package:bonfire/util/quadtree_collision/custom_quadtree_collision_detection.dart:84:11)
#8      CustomHasQuadTreeCollisionDetection.update (package:bonfire/util/quadtree_collision/custom_has_quadtree_collision_detection.dart:88:24)
#9      HasTimeScale.update (package:flame/src/components/mixins/has_time_scale.dart:30:11)
#10     BonfireGame.update (package:bonfire/base/bonfire_game.dart:195:11)
#11     GameRenderBox.gameLoopCallback (package:flame/src/game/game_render_box.dart:121:10)
#12     GameLoop._tick (package:flame/src/game/game_loop.dart:46:13)
#13     Ticker._tick (package:flutter/src/scheduler/ticker.dart:258:12)
#14     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1392:15)
#15     SchedulerBinding.handleBeginFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:1235:11)
#16     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:633:13)
#17     SchedulerBinding.handleBeginFrame (package:flutter/src/scheduler/binding.dart:1233:17)
#18     SchedulerBinding._handleBeginFrame (package:flutter/src/scheduler/binding.dart:1150:5)
#19     _invoke1 (dart:ui/hooks.dart:328:13)
#20     PlatformDispatcher._beginFrame (dart:ui/platform_dispatcher.dart:397:5)
#21     _beginFrame (dart:ui/hooks.dart:272:31)

This exception was thrown in the context of a scheduler callback. When the scheduler callback was _registered_ (as opposed to when the exception was thrown), this was the stack:
#2      SchedulerBinding.scheduleFrameCallback (package:flutter/src/scheduler/binding.dart:606:49)
#3      Ticker.scheduleTick (package:flutter/src/scheduler/ticker.dart:274:46)
#4      Ticker.start (package:flutter/src/scheduler/ticker.dart:180:7)
#5      GameLoop.start (package:flame/src/game/game_loop.dart:54:15)
#6      GameRenderBox._attachGame (package:flame/src/game/game_render_box.dart:97:16)
#7      GameRenderBox.attach (package:flame/src/game/game_render_box.dart:88:5)
#8      RenderObject.adoptChild (package:flutter/src/rendering/object.dart:1841:13)
#9      ContainerRenderObjectMixin.insert (package:flutter/src/rendering/object.dart:4255:5)
#10     MultiChildRenderObjectElement.insertRenderObjectChild (package:flutter/src/widgets/framework.dart:6843:18)
#11     RenderObjectElement.attachRenderObject (package:flutter/src/widgets/framework.dart:6602:35)
#12     RenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6467:5)
#13     Element.inflateWidget (package:flutter/src/widgets/framework.dart:4340:16)
#14     MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6904:36)
#15     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6916:32)
#16     Element.inflateWidget (package:flutter/src/widgets/framework.dart:4340:16)
#17     Element.updateChild (package:flutter/src/widgets/framework.dart:3843:20)
#18     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5512:16)
#19     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5650:11)
#20     Element.rebuild (package:flutter/src/widgets/framework.dart:5203:7)
#21     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2905:19)
#22     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:1136:21)
#23     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:443:5)
#24     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1392:15)
#25     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1313:9)
#26     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1171:5)
#27     _invoke (dart:ui/hooks.dart:312:13)
#28     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:419:5)
#29     _drawFrame (dart:ui/hooks.dart:283:31)
(elided 2 frames from class _FrameCallbackEntry)