xrjamfeb2025/addons/godot-xr-tools/desktop-support/movement_gravity_zones.gd

62 lines
1.8 KiB
GDScript

@tool
class_name XRToolsMovementGravityZones
extends XRToolsMovementProvider
# Default wall-walk mask of 4:wall-walk
const DEFAULT_MASK := 0b0000_0000_0000_0000_0000_0000_0000_1000
## Wall walking provider order
@export var order : int = 26
## Set our follow layer mask
@export_flags_3d_physics var follow_mask : int = DEFAULT_MASK
var _gravity_dir := Vector3(0,-9.8,0)
@onready var fly_desktop : XRToolsDesktopMovementFlight = XRTools.find_xr_child(
XRTools.find_xr_ancestor(self,"*","XROrigin3D"),
"*",
"XRToolsDesktopMovementFlight")
@onready var fly_xr : XRToolsMovementFlight = XRTools.find_xr_child(
XRTools.find_xr_ancestor(self,"*","XROrigin3D"),
"*",
"XRToolsMovementFlight")
func physics_pre_movement(_delta: float, player_body: XRToolsPlayerBody):
# Test for collision with wall under feet
var gravity_zones1 = get_tree().get_nodes_in_group("gravity_zone1")
var gravity_zones2 = get_tree().get_nodes_in_group("gravity_zone2")
var gravity_zones3 = get_tree().get_nodes_in_group("gravity_zone3")
#_gravity_dir = Vector3(0,-9.8,0)
var grav_z := 0
for zone in gravity_zones3:
if zone.overlaps_body(player_body) and zone is Area3D:
grav_z=3
_gravity_dir=zone.global_transform.basis.y*zone.gravity*-1
if grav_z==0:
for zone in gravity_zones2:
if zone.overlaps_body(player_body) and zone is Area3D:
grav_z=2
_gravity_dir=zone.global_transform.basis.y*zone.gravity*-1
if grav_z==0:
for zone in gravity_zones1:
if zone.overlaps_body(player_body) and zone is Area3D:
grav_z=1
_gravity_dir=zone.global_transform.basis.y*zone.gravity*-1
if grav_z==0:
fly_desktop.set_flying(true)
fly_xr.set_flying(true)
else:
fly_desktop.set_flying(false)
fly_xr.set_flying(false)
# Modify the player gravity
player_body.gravity = _gravity_dir