WorldInstance.gd 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. class_name WorldInstance
  2. extends SubViewport
  3. #
  4. var id : int = 0
  5. var npcs : Array[AIAgent] = []
  6. var mobs : Array[AIAgent] = []
  7. var players : Array[BaseAgent] = []
  8. var drops : Dictionary[int, Drop] = {}
  9. var map : WorldMap = null
  10. var timers : Node = Node.new()
  11. #
  12. func _ready():
  13. timers.set_name("Timers")
  14. add_child.call_deferred(timers)
  15. var mapRID : RID = get_world_2d().get_navigation_map()
  16. if not NavigationServer2D.map_get_iteration_id(mapRID):
  17. NavigationServer2D.map_changed.connect(_map_loaded)
  18. else:
  19. _map_loaded(mapRID)
  20. func _map_loaded(mapRID : RID):
  21. if get_world_2d().get_navigation_map() == mapRID:
  22. NavigationServer2D.map_changed.disconnect(_map_loaded)
  23. for spawn in map.spawns:
  24. if spawn:
  25. for i in spawn.count:
  26. WorldAgent.CreateAgent(spawn, id, spawn.nick)
  27. #
  28. static func Create(_map : WorldMap, instanceID : int = 0) -> WorldInstance:
  29. assert(_map != null, "Could not create an instance on a non-valid map")
  30. if _map == null:
  31. return
  32. var inst : WorldInstance = WorldInstance.new()
  33. inst.id = instanceID
  34. inst.map = _map
  35. inst.name = _map.name + "_" + str(instanceID)
  36. inst.RefreshProcessMode()
  37. WorldNavigation.CreateInstance(_map, inst.get_world_2d().get_navigation_map())
  38. Launcher.Root.add_child.call_deferred(inst)
  39. return inst
  40. func Destroy():
  41. for player in players:
  42. WorldAgent.RemoveAgent(player)
  43. for mob in mobs:
  44. WorldAgent.RemoveAgent(mob)
  45. for npc in npcs:
  46. WorldAgent.RemoveAgent(npc)
  47. Launcher.Root.remove_child(self)
  48. #
  49. func QueryProcessMode(delaySec : float = ActorCommons.MapProcessingToggleDelay):
  50. Callback.SelfDestructTimer(Launcher, delaySec, RefreshProcessMode, [], "ProcessMode_" + name)
  51. func RefreshProcessMode():
  52. if players.size() == 0 and timers.get_child_count() > 0:
  53. QueryProcessMode(ActorCommons.MapProcessingToggleExtraDelay)
  54. else:
  55. var toggle : bool= players.size() == 0
  56. set_process_mode(ProcessMode.PROCESS_MODE_DISABLED if toggle else ProcessMode.PROCESS_MODE_INHERIT)
  57. for npc in npcs:
  58. if npc.aiTimer:
  59. npc.aiTimer.set_paused(toggle)
  60. if npc.actionTimer:
  61. npc.actionTimer.set_paused(toggle)
  62. for mob in mobs:
  63. if mob.aiTimer:
  64. mob.aiTimer.set_paused(toggle)
  65. if mob.actionTimer:
  66. mob.actionTimer.set_paused(toggle)