extends "res://scripts/placeable.gd" var portal_charge = 15 var other var index var enemy_colors = [ Color("#d14013"), Color("#ecb521"), ] var friend_colors = [ Color("#1209c4"), Color("#2066e7"), ] func _ready(): for player in get_node("/root/Level/Players").get_children(): player.connect("body_entered", self, "player_collided", [player]) func init(maker): var maker_portals = maker.placement.placed index = maker_portals.size() # No -1, because we haven't actually been added to the array yet # If index is odd, we're the second (1, 3...), if even, first (0, 4...) var second = index % 2 != 0 var is_friend = util.is_friendly(maker) var color_set = friend_colors if is_friend else enemy_colors var color = color_set[int(second)] var mat = SpatialMaterial.new() color.a = 0.5 mat.flags_transparent = true mat.albedo_color = color get_node("MeshInstance").set_surface_material(0, mat) .init(maker) func player_collided(with, player): if with == self: portal(player) func find_other(): var maker_portals = maker_node.placement.placed var count = maker_portals.size() # If index is odd, we're the second (1, 3...), if even, first (0, 4...) var second = index % 2 != 0 var delta = -1 if second else 1 if index + delta < count: other = maker_portals[index + delta] # Second-to-last: we're already included return other else: return null func portal(player): if player.player_info.is_right_team == maker_node.player_info.is_right_team: if find_other(): var spawn_distance = 2 # Find a sane place to spawn # -Z is in the direction of the portal # X is enough away from the portal to avoid infinite loop # With both axes, gravity could never bring us to hit the portal var to = other.to_global(Vector3(spawn_distance,0,-spawn_distance)) player.set_translation(to) maker_node.switch_charge += portal_charge