First ever primary weapon
This commit is contained in:
parent
630cc8abb1
commit
eabc137ce8
14 changed files with 237 additions and 15 deletions
|
|
@ -346,6 +346,54 @@ func shoot(id:int , limb_damage: int, torso_damage: int,head_damage: int, distan
|
|||
hit_player.take_damage(int(float(damage) * reduction))
|
||||
|
||||
|
||||
func shoot_pellets(id:int,amount: int, limb_total_damage: int, torso_total_damage: int,head_total_damage: int, distance: float, arc: float, damage_reduction_curve: Curve = null):
|
||||
if multiplayer.is_server() == false:
|
||||
return
|
||||
|
||||
var player: Player = player_nodes[id]
|
||||
var player_camera: Camera3D = player.get_node("Camera3D")
|
||||
var space: PhysicsDirectSpaceState3D = player.get_world_3d().direct_space_state
|
||||
var head_damage: int = head_total_damage / amount
|
||||
var torso_damage: int = torso_total_damage / amount
|
||||
var limb_damage: int = limb_total_damage / amount
|
||||
|
||||
for i in range(amount):
|
||||
var endpoint: Vector3 = player_camera.global_position - player_camera.global_basis.z.rotated(Vector3.RIGHT,randf_range(-arc/2,arc/2)).rotated(Vector3.UP,randf_range(-arc/2,arc/2)) * distance
|
||||
|
||||
var ray = PhysicsRayQueryParameters3D.create(player_camera.global_position,endpoint,1)
|
||||
ray.exclude = [player.get_rid()]
|
||||
ray.collide_with_areas = false
|
||||
match player.team:
|
||||
TEAMS.DEFENCE:
|
||||
ray.collision_mask |= ATTACK_LAYER
|
||||
TEAMS.ATTACK:
|
||||
ray.collision_mask |= DEFENCE_LAYER
|
||||
_:
|
||||
ray.collision_mask |= ATTACK_LAYER | DEFENCE_LAYER
|
||||
|
||||
var collision = space.intersect_ray(ray)
|
||||
|
||||
|
||||
if collision != {} and collision["collider"] is Player:
|
||||
var hit_player: Player = collision["collider"]
|
||||
var shape_object: CollisionShape3D = hit_player.shape_owner_get_owner(collision["shape"])
|
||||
var reduction: float = 1
|
||||
var damage: int = 0
|
||||
|
||||
match shape_object.get_groups()[0]:
|
||||
"Head":
|
||||
damage = head_damage
|
||||
"Limb":
|
||||
damage = limb_damage
|
||||
_:
|
||||
damage = torso_damage
|
||||
|
||||
if damage_reduction_curve != null:
|
||||
var distance_to_hit = (player_camera.global_position - collision["position"]).length()/distance
|
||||
reduction = damage_reduction_curve.sample(distance_to_hit)
|
||||
|
||||
hit_player.take_damage(int(float(damage) * reduction))
|
||||
|
||||
func interact(id: int) -> void:
|
||||
if multiplayer.is_server() == false:
|
||||
return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue