Entity.gd 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. extends Actor
  2. class_name Entity
  3. #
  4. @onready var interactive : EntityInteractive = $Interactive
  5. @onready var visual : EntityVisual = $Visual
  6. var target : Entity = null
  7. var gender : ActorCommons.Gender = ActorCommons.Gender.MALE
  8. var entityVelocity : Vector2 = Vector2.ZERO
  9. var entityPosOffset : Vector2 = Vector2.ZERO
  10. var entityOrientation : Vector2 = Vector2(0, 1)
  11. var agentID : int = -1
  12. signal entity_died
  13. # Init
  14. func SetData():
  15. var altData : EntityData = null
  16. var isMorph : bool = stat.IsMorph()
  17. if isMorph:
  18. altData = DB.EntitiesDB.get(stat.currentShape, null)
  19. SetVisual(altData if altData else data)
  20. interactive.Init(altData if altData else data)
  21. func SetVisual(altData : EntityData, morphed : bool = false):
  22. if morphed:
  23. interactive.DisplayMorph(visual.Init, [altData])
  24. else:
  25. visual.Init(altData)
  26. #
  27. func Update(nextVelocity : Vector2, gardbandPosition : Vector2, nextOrientation : Vector2, nextState : ActorCommons.State, nextskillCastID : int, forceValue : bool = false):
  28. entityPosOffset = gardbandPosition - position
  29. entityVelocity = nextVelocity
  30. var previousState = state
  31. state = nextState
  32. if nextOrientation != Vector2.ZERO:
  33. entityOrientation = nextOrientation
  34. var dist = Vector2(entityPosOffset).length_squared()
  35. if dist > NetworkCommons.MaxGuardbandDistSquared or forceValue:
  36. position = gardbandPosition
  37. entityPosOffset = Vector2.ZERO
  38. if Launcher.Player == self:
  39. Launcher.Map.PlayerMoved.emit()
  40. if visual and visual.skillCastID != nextskillCastID:
  41. visual.skillCastID = nextskillCastID
  42. interactive.DisplayCast(self, nextskillCastID)
  43. if previousState != nextState and nextState == ActorCommons.State.DEATH:
  44. entity_died.emit()
  45. # Local player specific functions
  46. func SetLocalPlayer():
  47. collision_layer |= 2
  48. if Launcher.Camera and Launcher.Camera.mainCamera:
  49. var remotePos : RemoteTransform2D = RemoteTransform2D.new()
  50. add_child.call_deferred(remotePos)
  51. remotePos.set_remote_node(Launcher.Camera.mainCamera.get_path())
  52. Launcher.Camera.mainCamera.make_current()
  53. entity_died.connect(Launcher.GUI.respawnWindow.EnableControl.bind(true))
  54. Network.RetrieveCharacterInformation()
  55. FSM.EnterState(FSM.States.IN_GAME)
  56. func ClearTarget():
  57. if target != null:
  58. if target.interactive:
  59. target.interactive.DisplayTarget(ActorCommons.Target.NONE)
  60. if target.is_inside_tree():
  61. Callback.SelfDestructTimer(target.interactive.healthBar, ActorCommons.DisplayHPDelay, target.interactive.HideHP, [], "HideHP")
  62. else:
  63. target.interactive.HideHP()
  64. target = null
  65. func Target(source : Vector2, interactable : bool = true, nextTarget : bool = false):
  66. var newTarget = Entities.GetNextTarget(source, target if nextTarget and target != null else null, interactable)
  67. if newTarget != target:
  68. ClearTarget()
  69. target = newTarget
  70. if target:
  71. if interactable and target.type == ActorCommons.Type.NPC:
  72. target.interactive.DisplayTarget(ActorCommons.Target.ALLY)
  73. elif target.type == ActorCommons.Type.MONSTER:
  74. target.interactive.DisplayTarget(ActorCommons.Target.ENEMY)
  75. target.interactive.DisplayHP()
  76. Network.TriggerSelect(target.agentID)
  77. func JustInteract():
  78. if not ActorCommons.IsAlive(target) or (not Launcher.GUI.IsDialogueContextOpened() and Util.IsReachableSquared(position, target.position, ActorCommons.TargetMaxSquaredDistance)):
  79. Target(position, true)
  80. if target:
  81. Interact()
  82. elif stat.IsSailing():
  83. interactive.DisplaySailContext()
  84. func Interact():
  85. if target != null:
  86. if target.type == ActorCommons.Type.NPC:
  87. Network.TriggerInteract(target.agentID)
  88. elif target.type == ActorCommons.Type.MONSTER:
  89. Cast(DB.GetCellHash(SkillCommons.SkillMeleeName))
  90. func Cast(skillID : int):
  91. if Launcher.GUI.IsDialogueContextOpened():
  92. return
  93. assert(skillID in DB.SkillsDB, "Skill ID %x not found within our skill db" % skillID)
  94. if not skillID in DB.SkillsDB:
  95. return
  96. var skill : SkillCell = DB.SkillsDB[skillID]
  97. assert(skill != null, "Skill ID is not found, can't cast it")
  98. if skill == null:
  99. return
  100. var entityID : int = 0
  101. if skill.mode == Skill.TargetMode.SINGLE:
  102. if not target or target.state == ActorCommons.State.DEATH or target.type != ActorCommons.Type.MONSTER:
  103. Target(position, false)
  104. if target and target.type == ActorCommons.Type.MONSTER:
  105. entityID = target.agentID
  106. Network.TriggerCast(entityID, skillID)
  107. func LevelUp():
  108. if Launcher.Player == self:
  109. Network.Client.PushNotification("Level %d reached.\nFeel the mana power growing inside you!" % (stat.level))
  110. stat.RefreshAttributes()
  111. if interactive:
  112. interactive.DisplayLevelUp.call_deferred()
  113. #
  114. func _physics_process(delta : float):
  115. var totalVelocity : Vector2 = entityVelocity + entityPosOffset / delta
  116. velocity = totalVelocity.limit_length(stat.current.walkSpeed)
  117. if velocity != Vector2.ZERO:
  118. var extraVelocity : Vector2 = velocity - entityVelocity
  119. entityPosOffset -= extraVelocity * delta
  120. move_and_slide()
  121. if Launcher.Player == self:
  122. Launcher.Map.PlayerMoved.emit()
  123. func _ready():
  124. if Launcher.Player == self:
  125. Launcher.Map.MapUnloaded.connect(ClearTarget)
  126. elif type == ActorCommons.Type.MONSTER:
  127. stat.vital_stats_updated.connect(interactive.RefreshHP)
  128. entity_died.connect(interactive.HideHP)
  129. entity_died.connect(interactive.DisplayTarget.bind(ActorCommons.Target.NONE))