@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) 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 ### var tile_size = 10.0 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)