diff --git a/assets/Weapons/Bullet/Bullet.gltf.import b/assets/Weapons/Bullet/Bullet.gltf.import index 6a4b245..0dd88f9 100644 --- a/assets/Weapons/Bullet/Bullet.gltf.import +++ b/assets/Weapons/Bullet/Bullet.gltf.import @@ -25,6 +25,5 @@ meshes/lightmap_texel_size=0.2 skins/use_named_skins=true animation/import=true animation/fps=30 -animation/trimming=false import_script/path="" _subresources={} diff --git a/assets/Weapons/Gun/Revolver.gltf.import b/assets/Weapons/Gun/Revolver.gltf.import index 30e0f5e..6abb801 100644 --- a/assets/Weapons/Gun/Revolver.gltf.import +++ b/assets/Weapons/Gun/Revolver.gltf.import @@ -25,7 +25,6 @@ meshes/lightmap_texel_size=0.2 skins/use_named_skins=true animation/import=true animation/fps=30 -animation/trimming=false import_script/path="" _subresources={ "materials": { diff --git a/assets/shader/crosshair.gdshader b/assets/shader/crosshair.gdshader new file mode 100644 index 0000000..c22e6ac --- /dev/null +++ b/assets/shader/crosshair.gdshader @@ -0,0 +1,42 @@ +shader_type canvas_item; + +uniform bool center_enabled = true; +uniform bool legs_enabled = true; +uniform bool inverted = false; +uniform int color_id = 0; +uniform vec4 color_0 = vec4(0., 1, 0., 1.); +uniform vec4 color_1 = vec4(1., 0., 0., 1.); +uniform vec4 color_2 = vec4(0., 0., 1., 1.); +uniform float center_radius = .001; +uniform float width = .001; +uniform float len = .005; +uniform float spacing = .008; +uniform float spread = 1.; + + +void fragment(){ + + float a = SCREEN_PIXEL_SIZE.x / SCREEN_PIXEL_SIZE.y; + vec2 UVa = vec2(UV.x / a, UV.y); + vec2 center = vec2(.5 / a, .5); + + float point = step(distance(UVa, center), center_radius); + + float h = step(center.x - len - spacing*spread, UVa.x) - step(center.x - spacing*spread, UVa.x); + h += step(center.x + spacing*spread, UVa.x) - step(center.x + len + spacing*spread, UVa.x); + h *= step(center.y - width, UVa.y) - step(center.y + width, UVa.y); + + float v = step(center.y - len - spacing*spread, UVa.y) - step(center.y - spacing*spread, UVa.y); + v += step(center.y + spacing*spread, UVa.y) - step(center.y + len + spacing*spread, UVa.y); + v *= step(center.x - width, UVa.x) - step(center.x + width, UVa.x); + + float crosshair; + + crosshair = (h+v) * float(legs_enabled) + point * float(center_enabled); + + if(!inverted){ + COLOR = (color_0 * float(color_id == 0) + color_1 * float(color_id == 1) + color_2 * float(color_id == 2)) * crosshair; + }else{ + COLOR = vec4((cos(textureLod(SCREEN_TEXTURE, SCREEN_UV, 0.0).rgb * 3.1415926534) + 1.)/2., 1.) * crosshair; + } +} \ No newline at end of file diff --git a/project.godot b/project.godot index bcb0237..95aaa3a 100644 --- a/project.godot +++ b/project.godot @@ -97,6 +97,11 @@ wheel_down={ "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"pressed":false,"double_click":false,"script":null) ] } +reload={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"unicode":0,"echo":false,"script":null) +] +} [physics] diff --git a/scenes/player/PlayerQ3.tscn b/scenes/player/PlayerQ3.tscn index 1c180c2..ba876a2 100644 --- a/scenes/player/PlayerQ3.tscn +++ b/scenes/player/PlayerQ3.tscn @@ -1,10 +1,26 @@ -[gd_scene load_steps=4 format=3 uid="uid://bl7jynld7s25o"] +[gd_scene load_steps=6 format=3 uid="uid://bl7jynld7s25o"] [ext_resource type="Script" path="res://scripts/player/PlayerQ3.gd" id="1"] [ext_resource type="Script" path="res://scripts/player/Weapons.gd" id="2_dl1i1"] +[ext_resource type="Shader" path="res://assets/shader/crosshair.gdshader" id="3_3vnqi"] [sub_resource type="CylinderShape3D" id="1"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_mqdp4"] +shader = ExtResource("3_3vnqi") +shader_parameter/center_enabled = null +shader_parameter/center_radius = null +shader_parameter/color_0 = null +shader_parameter/color_1 = null +shader_parameter/color_2 = null +shader_parameter/color_id = null +shader_parameter/inverted = null +shader_parameter/legs_enabled = null +shader_parameter/len = null +shader_parameter/spacing = null +shader_parameter/spread = null +shader_parameter/width = null + [node name="PlayerQ3" type="CharacterBody3D"] script = ExtResource("1") @@ -19,8 +35,17 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.75, 0) [node name="Hand" type="Node3D" parent="Body/Head"] script = ExtResource("2_dl1i1") -sway_left = Vector3(0, 0.1, 0) -sway_right = Vector3(0, -0.1, 0) + +[node name="ColorRect" type="ColorRect" parent="Body/Head/Hand"] +material = SubResource("ShaderMaterial_mqdp4") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 [node name="Camera3D" type="Camera3D" parent="Body/Head"] current = true + +[node name="AimCast" type="RayCast3D" parent="Body/Head/Camera3D"] +target_position = Vector3(0, 0, -1) diff --git a/scripts/player/Weapon.gd b/scripts/player/Weapon.gd index 939ee50..820f4a7 100644 --- a/scripts/player/Weapon.gd +++ b/scripts/player/Weapon.gd @@ -8,8 +8,6 @@ const RELOAD = 3 const DRAW_TIME = 0.35 -#TODO: Load gun config from file - var MAX_CLIP : int var DAMAGE : float var MOMENTUM : Vector2 @@ -20,10 +18,12 @@ var DRAW_POS : Vector3 var DRAW_ROT : Vector3 var MODEL : Node3D var FIREMODE : int +var HITSCAN : bool +var RAY_LEN : float = 1000 var SHOOTING_SPEED: float var can_shoot : bool -var clip = 444444 +var clip : int var state = DEFAULT func init(): @@ -51,7 +51,7 @@ func InitialPos(): func Shoot(): - if clip > 0 && state == INITIAL && can_shoot: + if CanShoot(): if !FIREMODE: can_shoot = false clip -= 1 @@ -68,6 +68,9 @@ func Shoot(): return true return false +func CanShoot(): + return clip > 0 && state == INITIAL && can_shoot + func Release(): if !FIREMODE: can_shoot = true @@ -75,7 +78,7 @@ func Release(): func Reload(): if(clip < MAX_CLIP && state == INITIAL): - state = RELOAD - + #state = RELOAD + clip = MAX_CLIP return true return false diff --git a/scripts/player/Weapons.gd b/scripts/player/Weapons.gd index 8bc1787..118cd65 100644 --- a/scripts/player/Weapons.gd +++ b/scripts/player/Weapons.gd @@ -9,6 +9,7 @@ const BOB = 1 var state = 0 @onready var player_root = get_node("../../../../PlayerQ3") as CharacterBody3D +@onready var raycast = get_node("../Camera3D/AimCast") as RayCast3D var weapons = [] @@ -27,19 +28,14 @@ var file_data = { "RECOIL_COOLDOWN": 0.35, "RPM": 120, "DRAW_POS": Vector3(0,-0.5,-0.3), - "DRAW_ROT": Vector3(1.3, 0, 0) + "DRAW_ROT": Vector3(1.3, 0, 0), + "HITSCAN": true } } var mouse_mov : Vector3 -var sway_threshold = 5 var sway_lerp = 5 -@export var sway_left : Vector3 -@export var sway_right : Vector3 -@export var sway_normal : Vector3 - - func _ready(): save_data(file_data) load_data() @@ -50,12 +46,17 @@ func _ready(): var resource = "res://scenes/weapons/" + file_data[i].MODEL + ".tscn" var weapon_model_resource = load(resource) var weapon_model = weapon_model_resource.instantiate() + + #Set Weapon nodes root.add_child(weapon_model) root.position = file_data[i].HAND_POS root.rotation = file_data[i].HAND_ROT root.hide() add_child(root) + + #Set Weapon Data root.MAX_CLIP = file_data[i].MAX_CLIP + root.clip = root.MAX_CLIP root.DAMAGE = file_data[i].DAMAGE root.MOMENTUM = file_data[i].MOMENTUM root.ANGULAR_MOMENTUM = file_data[i].ANGULAR_MOMENTUM @@ -64,8 +65,14 @@ func _ready(): root.MODEL = root.get_node(file_data[i].MODEL) root.DRAW_POS = file_data[i].DRAW_POS root.DRAW_ROT = file_data[i].DRAW_ROT + root.HITSCAN = file_data[i].HITSCAN + if(not root.HITSCAN): + print("Projectile stats") + weapons.append(root) weapons[current_weapon].init() + raycast.target_position.z = -weapons[current_weapon].RAY_LEN + func _input(event): if event is InputEventMouseMotion: @@ -75,21 +82,31 @@ func _input(event): func _unhandled_input(_event): if weapons.size() > 1 && Input.is_action_just_released("wheel_up"): - weapons[current_weapon].hide() - current_weapon = (current_weapon + 1) % weapons.size() - weapons[current_weapon].init() + ChangeWeapon((current_weapon + 1) % weapons.size()) if weapons.size() > 1 && Input.is_action_just_released("wheel_down"): - weapons[current_weapon].hide() - current_weapon = (current_weapon - 1) % weapons.size() - weapons[current_weapon].init() - + ChangeWeapon((current_weapon - 1) % weapons.size()) + + if Input.is_action_just_pressed("reload"): + weapons[current_weapon].Reload() + +func ChangeWeapon(i): + weapons[current_weapon].hide() + current_weapon = (i) + weapons[current_weapon].init() + raycast.target_position.z = -weapons[current_weapon].RAY_LEN var time = 0 func _process(delta): - if Input.is_action_pressed("shoot"): - weapons[current_weapon].Shoot() + if Input.is_action_pressed("shoot") && weapons[current_weapon].Shoot(): + if(weapons[current_weapon].HITSCAN): + HitScan() + else: + Projectile() + if Input.is_action_just_released("shoot"): weapons[current_weapon].Release() + + #SWAY if mouse_mov != null && mouse_mov.length() > 0: weapons[current_weapon].MODEL.rotation = weapons[current_weapon].MODEL.rotation.lerp(mouse_mov, sway_lerp * delta) @@ -104,12 +121,15 @@ func _process(delta): position.y = bobOscillate bobOscillate = sin(time * 4 * (PI) + PI/4) * 0.015 position.x = bobOscillate - #else: - #position = lerp(position, Vector3.ZERO, ) +func HitScan(): + if(raycast.is_colliding()): + var target = raycast.get_collider() + print("Hit target ", target.name) - +func Projectile(): + pass func save_data(data): var file = FileAccess.open(CONFIG_PATH, FileAccess.WRITE)