Attention | Topic was automatically imported from the old Question2Answer platform. | |
Asked By | ROBOTOO007 |
HEY! i’ve been trying to make a multiplayer game and i used a tutorial for the networking part here’s the link to that video: https://www.youtube.com/watch?v=Xu3LtVihYoo&t=132s
but when i tried creating a server i would get this error : “Invalid get index “0” (on base:‘Dictionnary’)”.
this is my player script:
extends KinematicBody2D
export var maxTimeBetweenShots: int
export var speed:= Vector2(30,30)
var bullet = load("res://gameObjects/bullet.tscn")
var direction: Vector2
var velocity: Vector2
var old_direction: Vector2
var timeBetweenShots: int
var in_body: bool
var old_speed
var b
signal bullet_hit
slave var slave_position = Vector2()
slave var slave_movement = Vector2.ZERO
func _ready() -> void:
old_speed = speed
func calculateVelocity() -> void:
if Input.is_action_pressed("Shift"):
speed = speed * 2
velocity = direction * speed
func calculateDirection() -> void:
if is_network_master():
direction = Vector2( Input.get_action_strength("right") - Input.get_action_strength("left"),
Input.get_action_strength("down") - Input.get_action_strength("up"))
rset_unreliable('slave_position', position)
rset('slave_movement', direction)
else:
position = slave_position
if get_tree().is_network_server():
Network.update_position(int(name), position)
func setGlobalPlayerPos() -> void:
global.player_pos = global_position
func createBulletInstance() -> void:
if timeBetweenShots <= 0:
b = bullet.instance()
get_parent().add_child(b)
var dir = Vector2(1,0).rotated(get_parent().get_node("gun/gun").global_rotation)
b.start(global.bullet_spawn_pos, dir)
timeBetweenShots = maxTimeBetweenShots
else:
timeBetweenShots -= get_process_delta_time()
func _physics_process(delta: float) -> void:
calculateDirection()
calculateVelocity()
move_and_slide(velocity)
if direction != old_direction:
if direction.x > 0 && $player_sprite.flip_h == true:
$player_sprite.flip_h = false
elif direction.x < 0 && $player_sprite.flip_h == false:
$player_sprite.flip_h = true
old_direction = direction
setGlobalPlayerPos()
speed = old_speed
func _process(delta: float) -> void:
$Label.text = Network.players[get_tree().get_network_unique_id()]["name"]
var labelSize = $Label.rect_size
$Label.rect_global_position = position + Vector2(-labelSize.x/2, -75)
if Input.is_action_pressed("left_click") && global.holding != "none":
createBulletInstance()
if in_body && Input.is_action_pressed("E"):
global.gun_throwing = false
global.holding = "pistol"
func _on_detector_body_entered(body: Node) -> void:
if body.is_in_group("Weapons"):
in_body = true
func _on_detector_body_exited(body: Node) -> void:
if body.is_in_group("Weapons"):
in_body = false
func _on_detector_area_entered(area: Area2D) -> void:
if area.is_in_group("Bullet"):
$HealthPlayer.current -= area.damage
area.queue_free()
elif area.is_in_group("Food"):
$HealthPlayer.current += 5
area.queue_free()
func _on_HealthPlayer_depleted() -> void:
global.holding = "none"
queue_free()
and here’s my Network script:
extends Node
var SERVER_PORT = 31899
var MAX_PLAYERS = 2
var SERVER_IP = "127.0.0.1" #192.168.1.46
var players = { }
var self_data = { name = "", position = Vector2(360, 180) }
func _ready() -> void:
get_tree().connect("network_peer_disconnected", self, "_player_disconnected")
func CreateServer(player_nickname):
self_data.name = player_nickname
players[1] = self_data
var peer = NetworkedMultiplayerENet.new()
peer.create_server(SERVER_PORT, MAX_PLAYERS)
get_tree().set_network_peer(peer)
func JoinServer(player_nickname):
self_data.name = player_nickname
get_tree().connect("connected_to_server", self, "_connected_to_server")
var peer = NetworkedMultiplayerENet.new()
peer.create_client(SERVER_IP, SERVER_PORT)
get_tree().set_network_peer(peer)
func _connected_to_server():
players[get_tree().get_network_unique_id()] = self_data
rpc("_send_player_info", get_tree().get_network_unique_id(), self_data)
func _player_connected(id):
print("Player connected" + str(id))
func _player_disconnected(id):
print("Player disconnected" + str(id))
players.erase(id)
remote func _send_player_info(id, info):
if get_tree().is_network_server():
for peer_id in players:
rpc_id(id, "_send_player_info", peer_id, players[peer_id])
players[id] = info
var new_player = load("res://entity/player.tscn").instance()
new_player.name = str(id)
new_player.set_network_master(id)
get_tree().get_root().add_child(new_player)
func update_position(id, position):
# players[id].position = position
print(players[id].position)
PLEASE HELP I’M DESPERATE