Browse Source

Fix `placement.gd` not working with multiplayer

master
Luna 7 years ago
parent
commit
7ca8ee31b0
3 changed files with 28 additions and 16 deletions
  1. +1
    -5
      scripts/heroes/1.gd
  2. +6
    -0
      scripts/placeable.gd
  3. +21
    -11
      scripts/placement.gd

+ 1
- 5
scripts/heroes/1.gd View File

@ -1,17 +1,13 @@
extends "res://scripts/player.gd"
onready var placement = preload("res://scripts/placement.gd").new()
onready var placement = preload("res://scripts/placement.gd").new(self, "res://scenes/heroes/1_wall.tscn")
# --- Godot overrides ---
func _ready():
# connect("start_placement", self, "add_wall")
# connect("confirm_placement", self, "finalize_wall")
placement.player = self
placement.start_action = "hero_1_place_wall"
placement.confirm_action = "hero_1_confirm_wall"
placement.delete_action = "hero_1_remove_wall"
placement.scene_path = "res://scenes/heroes/1_wall.tscn"
placement.max_placed = 100
func _process(delta):


+ 6
- 0
scripts/placeable.gd View File

@ -2,10 +2,16 @@ extends StaticBody
var maker_node
func _ready():
get_node("CollisionShape").disabled = true
func init(maker):
maker_node = maker
var mat = get_node("MeshInstance").get_surface_material(0)
if not mat:
mat = SpatialMaterial.new()
get_node("MeshInstance").set_surface_material(0, mat)
mat.flags_transparent = true
mat.albedo_color.a = 0.5


+ 21
- 11
scripts/placement.gd View File

@ -1,3 +1,5 @@
extends Node # Networking functionality
var player
var is_placing = false
@ -9,11 +11,19 @@ var start_action
var confirm_action
var delete_action
var scene_path
var scene
signal start_placement
signal confirm_placement
func _init(parent, scene_path):
player = parent
player.add_child(self)
# Set the network master to the player's network master, which happens to be its name
# This allows it to use master, slave keywords appropriately
set_network_master(int(player.get_name()))
scene = load(scene_path)
func place_input():
# We allow you to just click to place, without needing to press E
@ -33,22 +43,20 @@ func place_input():
if Input.is_action_just_pressed(delete_action):
var pick = player.pick_from(placed)
if pick != -1:
remove_placed(pick)
rpc("remove_placed", pick)
if is_placing or confirm:
call_deferred("position_placement", placing_node)
position_placement(placing_node)
if confirm:
call_deferred("confirm_placement", placing_node)
emit_signal("confirm_placement")
# Order matters here: confirm_placement resets placing_node so we have to do anything with it first
rpc("slave_place", placing_node.transform)
confirm_placement(placing_node)
func confirm_placement(node, tf=null):
if tf:
node.set_transform(tf)
# TODO: Is this working? Could it be done better?
node.place()
# Remember this wall, and return to non-placing state
# We need to do this even as slave, because we keep track of the count
placed.append(node)
check_count()
placing_node = null
@ -106,8 +114,10 @@ sync func remove_placed(index):
placed.remove(index)
func create():
var node = load(scene_path).instance()
player.get_node("/root/Level").call_deferred("add_child", node)
node.call_deferred("init", player) # TODO: Is call_deferred legal on possibly not existing node?
var node = scene.instance()
print(node)
player.get_node("/root/Level").add_child(node)
# We have to call_deferred because we're `load`ing instead of `preload`ing. TODO: preload?
node.init(player)
return node

Loading…
Cancel
Save