|
|
@ -18,6 +18,12 @@ func _ready(): |
|
|
|
for player in get_node("/root/Level/Players").get_children(): |
|
|
|
player.connect("body_entered", self, "player_collided", [player]) |
|
|
|
|
|
|
|
func _exit_tree(): |
|
|
|
# We delete in pairs |
|
|
|
if other: |
|
|
|
maker_node.placement.placed.remove(index - 1) |
|
|
|
other.queue_free() |
|
|
|
|
|
|
|
func init(maker): |
|
|
|
|
|
|
|
var maker_portals = maker.placement.placed |
|
|
@ -29,33 +35,29 @@ func init(maker): |
|
|
|
var color = color_set[int(second)] |
|
|
|
|
|
|
|
var mat = SpatialMaterial.new() |
|
|
|
color.a = 0.5 |
|
|
|
mat.flags_transparent = true |
|
|
|
# color.a = 0.5 |
|
|
|
# mat.flags_transparent = true |
|
|
|
mat.albedo_color = color |
|
|
|
get_node("MeshInstance").set_surface_material(0, mat) |
|
|
|
|
|
|
|
.init(maker) |
|
|
|
|
|
|
|
func place(): |
|
|
|
.place() |
|
|
|
var second = index % 2 != 0 |
|
|
|
if second: |
|
|
|
# Our responsibility to complete the pairing |
|
|
|
other = maker_node.placement.placed[index - 1] |
|
|
|
other.other = self |
|
|
|
|
|
|
|
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 |
|
|
|
if other: |
|
|
|
var spawn_distance = 1.75 |
|
|
|
# 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 |
|
|
|