Boat/Ocean/ocean.gd
LUCASTUCIOUS 31ac4db49e A lot of changes
- Changed the scale of the project. Since water tiles are 10m, a boat need to occupy less than 1/3 of the space. So i made a 2m long boat. We'll see.
- Removed corrupted fbx. Hail for the bite
- Removed buyancy probe view. @TODO: make a CheatCode manager to help debug
- Made the ocean follow you
-
2025-03-27 00:03:49 +01:00

93 lines
2.9 KiB
GDScript

@tool
@icon("uid://nwanoqn5yas8")
extends Node3D
class_name Ocean
@export_category("Gameplay")
@export var follow_player:bool = true
@export_category("Tiles")
@export_tool_button("Generate Tiles","Ocean") var generate_tile_action = generate_tile
@export_tool_button("Remove Tiles","Ocean") var remove_tile_action = remove_tile
@onready var OceanTileMesh_Main:PlaneMesh = preload("uid://wes0mbjy8mno")
@onready var OceanTileMesh_Near:PlaneMesh = preload("uid://coql6l6v4cybp")
@onready var OceanTileMesh_Far:PlaneMesh = preload("uid://c82xwqk7ljku0")
@onready var OceanShader:ShaderMaterial = preload("uid://cf3lxmfb2d7c8")
enum OceanTileType {MAIN, NEAR, FAR, HORIZON}
var tiles:Array[MeshInstance3D]
@export_category("Waves")
var wave_time:float = 0.0
@onready var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
var boats:Array[Boat]
var PlayerBoat:Boat
func _ready() -> void:
if not Engine.is_editor_hint():
position = Vector3(0.0,0.0,0.0)
add_to_group("Ocean",true)
if OceanShader != null:
OceanShader.set_shader_parameter("wave_time",0.0)
if get_tree().get_nodes_in_group("Boats").size() > 0.0:
PlayerBoat = get_tree().get_nodes_in_group("Boats")[0]
func _process(delta:float) :
if OceanShader != null:
wave_time += delta
OceanShader.set_shader_parameter("wave_time",wave_time)
if follow_player && PlayerBoat != null:
global_position.x = PlayerBoat.global_position.x
global_position.z = PlayerBoat.global_position.z
########################
### EDITOR FUNCTIONS ###
@export_category("Tiles")
@export var tile_size = 10.0
@export var _layer_number = 3
func remove_tile():
# Supprimer toutes les tuiles existantes
for child in get_children():
child.queue_free()
func generate_tile(_full: bool = true):
# Si _full est vrai, on enlève toutes les tuiles existantes
if _full:
remove_tile()
# Generate a square grid of tiles
for x in range(-_layer_number, _layer_number + 1):
for z in range(-_layer_number, _layer_number + 1):
var tile_position = Vector3(
x * tile_size,
0.0,
z * tile_size
)
if tile_position.x == 0.0 && tile_position.z ==0.0:
create_new_tile(tile_position, OceanTileType.MAIN)
elif abs(tile_position.x) <= tile_size && abs(tile_position.z) <= tile_size:
create_new_tile(tile_position, OceanTileType.NEAR)
else:
create_new_tile(tile_position, OceanTileType.FAR)
func create_new_tile(tile_position: Vector3, Type: OceanTileType):
# Créer une nouvelle tuile
var NewTile = MeshInstance3D.new()
add_child(NewTile)
NewTile.set_owner(get_tree().edited_scene_root)
NewTile.set_name("OceanTile00")
NewTile.add_to_group("OceanTiles",true)
NewTile.global_position = tile_position
match Type:
OceanTileType.MAIN:
NewTile.mesh = OceanTileMesh_Main
OceanTileType.NEAR:
NewTile.mesh = OceanTileMesh_Near
OceanTileType.FAR:
NewTile.mesh = OceanTileMesh_Far
# Ajouter la tuile à la liste
tiles.append(NewTile)