help me to completely rewrite this 2d character script to adapt from the playerbase so I easily can swap between this and the 3d script:

extends PlayerBase
class_name Player2D
enum State { IDLE, RUN, JUMP, ATTACK }
var state = State.IDLE
# Data (now stats will come from PlayerBase health)
var bullets_amount: int = 30
var attack_animation: String = "Attack1"
@export var movement_data: MovementData
var stats: Stats = null

# References
@onready var animator : AnimatedSprite2D = $AnimatedSprite2D
@onready var guns_animator : AnimationPlayer = $ShootingAnimationPlayer
@onready var hit_animator : AnimationPlayer = $HitAnimationPlayer
@onready var hand : Node2D = $Hand
@onready var pistol : Sprite2D = $Hand/Pivot/Pistol
@onready var pistol_bullet_marker : Marker2D = $Hand/Pivot/Pistol/PistolBulletMarker
@onready var attacking: bool = false
@export var camera: Camera2D

# Load Scenes
@onready var muzzle_load: PackedScene = preload("res://Scenes/Particles/muzzle.tscn")
@onready var bullet_load: PackedScene = preload("res://Scenes/Props/bullet.tscn")
@onready var death_particle_load: PackedScene = preload("res://Scenes/Particles/player_death_particle.tscn")

func _ready():
	stats.health = stats.max_health

	EventManager.bullets_amount = bullets_amount
	EventManager.update_bullet_ui.emit()
	
	PlayerState.health = stats.health;


func _physics_process(delta):
	apply_gravity(delta)
	
	var input_vector = Input.get_axis("move_left","move_right")
	if input_vector != 0:
		apply_acceleration(input_vector, delta)
	else:
		apply_friction(delta)
	if Input.is_action_just_pressed("SwapPlane"):
		_on_swapPlane()
	if Input.is_action_just_pressed("jump") and is_on_floor():
		jump()
	
	if Input.is_action_just_pressed("shoot"):
		animator.play("Attacking")
		
		if bullets_amount:
			guns_animator.play("Shoot")
		
	
	move_and_slide()
	animate(input_vector)

func apply_acceleration(input_vector, delta):
	velocity.x = move_toward(velocity.x, movement_data.max_speed * input_vector, movement_data.acceleration * delta)

func apply_friction(delta):
	velocity.x = move_toward(velocity.x, 0, movement_data.friction * delta)

func apply_gravity(delta):
	if not is_on_floor():
		velocity.y += movement_data.gravity * movement_data.gravity_scale * delta

func knockback(vector):
	velocity = velocity.move_toward(vector * movement_data.knockback_force, movement_data.acceleration)

func jump():
	velocity.y = -movement_data.jump_strength
	AudioManager.play_sound(AudioManager.JUMP)

func shoot():
	state = State.ATTACK
	attack_animation = "Attack" + str(randi_range(1, 2))
	animator.play(attack_animation)
	$Hand/AttackArea/CollisionShape2D.disabled = false;
	await animator.animation_looped
	EventManager.update_bullet_ui.emit()
	var mouse_position : Vector2 = (get_global_mouse_position() - global_position).normalized()
	var muzzle = muzzle_load.instantiate()
	var bullet = bullet_load.instantiate()
	pistol_bullet_marker.add_child(muzzle)
	bullet.global_position = pistol_bullet_marker.global_position
	bullet.target_vector = mouse_position
	bullet.rotation = mouse_position.angle()
	get_tree().current_scene.add_child(bullet)
	AudioManager.play_sound(AudioManager.SHOOT)

	$Hand/AttackArea/CollisionShape2D.disabled = true;
	
	state = State.IDLE
	
func animate(input_vector):
	var mouse_position : Vector2 = (get_global_mouse_position() - global_position).normalized()
	if mouse_position.x > 0 and animator.flip_h:
		animator.flip_h = false
	elif mouse_position.x < 0 and not animator.flip_h:
		animator.flip_h = true
	
	hand.rotation = mouse_position.angle()
	if hand.scale.y == 1 and mouse_position.x < 0:
		hand.scale.y = -1
	elif hand.scale.y == -1 and mouse_position.x > 0:
		hand.scale.y = 1
	
	if state != State.ATTACK:
		if is_on_floor():
			if input_vector != 0:
				animator.play("Run")
			else:
				animator.play("Idle")
		else:
			if velocity.y > 0:
					animator.play("Jump")
		# Check if the current animation is the attack animation


func _on_hurtbox_area_entered(_area):
	if not _area.is_in_group("Bullet"):
		hit_animator.play("Hit")
		EventManager.update_health_ui.emit()
		if stats.health <= 0:
			die()
		else:
			AudioManager.play_sound(AudioManager.HURT)
		EventManager.frame_freeze.emit()

func _on_swapPlane():
	PlayerState.set_last_2d_position(global_position); 
	get_tree().change_scene_to_file("res://demo/Scenes/main_scene.tscn")


func die():
	AudioManager.play_sound(AudioManager.DEATH)
	animator.play("Died")
	var death_particle = death_particle_load.instantiate()
	death_particle.global_position = global_position
	get_tree().current_scene.add_child(death_particle)
	EventManager.player_died.emit()
	queue_free()


playbase:

extends Node
class_name PlayerBase

const MAX_HEALTH = 10


var health: int = MAX_HEALTH
var speed: float = 5.0
var jump_strength: float = 4.5

signal health_changed(new_health)

func _ready() -> void:
	initialize_ui()

func initialize_ui() -> void:
	var player_lifebar: ProgressBar = get_tree().current_scene.get_node("HUD/PlayerLifeBar")
	player_lifebar.max_value = MAX_HEALTH
	player_lifebar.value = health

func set_health(value: int) -> void:
	health = clamp(value, 0, MAX_HEALTH)
	update_health_ui()
	emit_signal("health_changed", health)

func update_health_ui() -> void:
	var player_lifebar: ProgressBar = get_tree().current_scene.get_node("HUD/PlayerLifeBar")
	player_lifebar.value = health

func take_damage(damage: int) -> void:
	set_health(health - damage)

func heal(amount: int) -> void:
	set_health(health + amount)

func move(input_dir: Vector2) -> void:
	pass  # To be implemented by child classes (2D / 3D)

func attack() -> void:
	pass  # To be implemented by child classes (2D / 3D)