2023-01-08 01:25:48 +00:00
|
|
|
extends BaseWeapon
|
|
|
|
class_name PeaShooter
|
|
|
|
|
|
|
|
const FIRE_RATE := 0.15
|
|
|
|
var last_fired := 0
|
|
|
|
var remaining := 10
|
|
|
|
|
2023-01-09 00:54:54 +00:00
|
|
|
@onready var raycast = $RayCast3D
|
2023-01-08 19:22:56 +00:00
|
|
|
@onready var audio_player: AudioStreamPlayer = $ShootSound
|
2023-01-08 12:08:15 +00:00
|
|
|
# FIXME: use singleton class here as well
|
|
|
|
@onready var croptiles_container: Node3D = get_tree().root.find_child("CropTiles", true, false)
|
2023-01-08 11:29:41 +00:00
|
|
|
var croptile = preload("res://island/CropTile.tscn")
|
2023-01-08 01:25:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
func _init() -> void:
|
|
|
|
self.weaponSlot = WeaponSlot.ONE
|
|
|
|
self.ammoType = AmmoType.SINGLE
|
|
|
|
|
|
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
|
|
func _ready() -> void:
|
|
|
|
pass # Replace with function body.
|
|
|
|
|
|
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
2023-01-08 12:13:09 +00:00
|
|
|
func _process(_delta: float) -> void:
|
2023-01-08 17:39:37 +00:00
|
|
|
super.bob_weapon(self, _delta)
|
2023-01-08 01:25:48 +00:00
|
|
|
var current_time = Time.get_ticks_msec()
|
|
|
|
|
|
|
|
if Input.is_action_just_pressed("fire") and current_time > (last_fired + FIRE_RATE*1000):
|
|
|
|
if remaining > 0:
|
|
|
|
shoot()
|
|
|
|
|
|
|
|
|
|
|
|
func shoot() -> void:
|
|
|
|
last_fired = Time.get_ticks_msec()
|
2023-01-08 15:44:18 +00:00
|
|
|
audio_player.play()
|
2023-01-08 01:25:48 +00:00
|
|
|
# $AnimationPlayer.seek(0)
|
|
|
|
# $AnimationPlayer.play("shoot")
|
|
|
|
|
2023-01-09 00:54:54 +00:00
|
|
|
if raycast.is_colliding():
|
|
|
|
var _normal = raycast.get_collision_normal() as Vector3
|
|
|
|
var _point = raycast.get_collision_point() as Vector3
|
|
|
|
var _object = raycast.get_collider() as Node3D
|
|
|
|
try_placing_seed()
|
2023-01-08 01:25:48 +00:00
|
|
|
# decalInstance.position = point
|
|
|
|
# object.add_child(decalInstance)
|
|
|
|
else:
|
|
|
|
# We should show a particle fx where the seed bouced off
|
|
|
|
pass
|
|
|
|
|
|
|
|
remaining -= 1
|
2023-01-08 11:29:41 +00:00
|
|
|
|
|
|
|
|
2023-01-09 00:54:54 +00:00
|
|
|
func try_placing_seed() -> bool:
|
|
|
|
var point = raycast.get_collision_point() as Vector3
|
|
|
|
var normal = raycast.get_collision_normal() as Vector3
|
|
|
|
var coll = raycast.get_collider() as CollisionObject3D
|
2023-01-08 23:28:39 +00:00
|
|
|
var similarity = normal.dot(Vector3.UP)
|
|
|
|
|
|
|
|
if similarity < 0.95:
|
2023-01-08 11:29:41 +00:00
|
|
|
return false
|
2023-01-08 13:48:15 +00:00
|
|
|
|
|
|
|
if coll.collision_layer == 0b10000:
|
|
|
|
return false
|
2023-01-08 11:29:41 +00:00
|
|
|
|
2023-01-08 23:28:39 +00:00
|
|
|
var correct_point = Vector3(floor(point.x), round(point.y), floor(point.z))
|
|
|
|
|
2023-01-08 11:29:41 +00:00
|
|
|
var crop = croptile.instantiate() as CropTile
|
|
|
|
crop.position = correct_point
|
2023-01-08 12:08:15 +00:00
|
|
|
croptiles_container.add_child(crop)
|
|
|
|
crop.plant()
|
2023-01-08 11:29:41 +00:00
|
|
|
|
|
|
|
return true
|