Pushing off players like sumo. (Multiplayer)

Godot Version

4.3

Question

Hey all!
I am trying to make a multiplayer game where the player controls his character completely with his mouse. I am kinda working for a sumo like mechanic right now where the player must dash his character to other player to push him. The problem I am facing is that I want the player that is getting hit move towards the direction the player who hits is facing at. I can’t seem to figure it out though. Here’s the script I got for the player:

extends CharacterBody3D
var mousepos:Vector2
var speed = 0.6
var g_hit = 0
var opface: Vector3
var pause = 0
var damage = 0
var facing: Vector3


func _ready():
	if not is_multiplayer_authority(): return
	Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)

func _enter_tree():
	set_multiplayer_authority(str(name).to_int())
	
func _input(event):
	if not is_multiplayer_authority(): return
	var direction = Vector3.ZERO
	if event is InputEventMouseMotion:
		if event.relative.x >= 200:
			event.relative.x = 199
		elif event.relative.x <= -200:
			event.relative.x = -199
		elif event.relative.y <= -200:
			event.relative.y = -199
		elif event.relative.y >= 200:
			event.relative.y = 199
		if pause > 0:
			event.relative.y = 0
			event.relative.x = 0
			pause -= 1
		velocity.x += event.relative.x
		velocity.z += event.relative.y
	var fast = (abs(velocity.x)+abs(velocity.z))/2
	facing = transform.basis.z
	move_and_slide()
	rotation.y = lerp_angle(rotation.y, atan2(-velocity.x, -velocity.z), speed)
	velocity *= 0
	facing = transform.basis.z
	for i in get_slide_collision_count():
		var collision = get_slide_collision(i)
		var push_player = collision.get_collider()
		if fast >=7:
			push_player.recieve_damage.rpc_id(push_player.get_multiplayer_authority())
			#opface.x = 0
			#opface.y = 0
			#opface.z = 0
	
@rpc("any_peer")	
func recieve_damage ():
	damage += 1
	g_hit = 7
	opface = facing
	
func _physics_process(delta):
	if not is_multiplayer_authority(): return
	if g_hit > 0:
		velocity = -opface*g_hit
		g_hit-=1
		move_and_slide()

I really appreciate your guys help!!

You could try passing to recieve_damage the direction facing? And I’ve Changed facing = transform.basis.z to facing = -transform.basis.z to get the correct forward direction

extends CharacterBody3D
var mousepos: Vector2
var speed = 0.6
var g_hit = 0
var opface: Vector3
var pause = 0
var damage = 0
var facing: Vector3

func _ready():
    if not is_multiplayer_authority(): return
    Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)

func _enter_tree():
    set_multiplayer_authority(str(name).to_int())
    
func _input(event):
    if not is_multiplayer_authority(): return
    if event is InputEventMouseMotion:
        if event.relative.x >= 200:
            event.relative.x = 199
        elif event.relative.x <= -200:
            event.relative.x = -199
        elif event.relative.y <= -200:
            event.relative.y = -199
        elif event.relative.y >= 200:
            event.relative.y = 199
        if pause > 0:
            event.relative.y = 0
            event.relative.x = 0
            pause -= 1
        velocity.x += event.relative.x
        velocity.z += event.relative.y
        
    var fast = (abs(velocity.x) + abs(velocity.z))/2
    facing = -transform.basis.z  # Get the forward direction
    move_and_slide()
    rotation.y = lerp_angle(rotation.y, atan2(-velocity.x, -velocity.z), speed)
    velocity *= 0
    
    for i in get_slide_collision_count():
        var collision = get_slide_collision(i)
        var push_player = collision.get_collider()
        if fast >= 7:
            # Pass the facing direction along with the damage call
            push_player.recieve_damage.rpc_id(push_player.get_multiplayer_authority(), facing)

@rpc("any_peer")    
func recieve_damage(attacker_facing: Vector3):
    damage += 1
    g_hit = 7
    opface = attacker_facing  # Use the attacker's facing direction
    
func _physics_process(delta):
    if not is_multiplayer_authority(): return
    if g_hit > 0:
        velocity = opface * g_hit 
        g_hit -= 1
        move_and_slide()
2 Likes

Ahha! So that’s how you call with parameters! I was trying something like this but I didn’t know how to add parameters. Thank you very much!!! I hope you have an amazing day!

1 Like