Prikoliki

This commit is contained in:
Rendo 2025-12-14 15:52:38 +05:00
commit 66fbad750c
22 changed files with 11192 additions and 42 deletions

View file

@ -13,7 +13,5 @@ Current plans:
Icon Icon
Behaviour Behaviour
Visuals Visuals
Primary weapons:
МЦ-255

View file

@ -30,18 +30,35 @@ layout_mode = 2
[node name="WeaponsContainer" type="VBoxContainer" parent="CenterContainer/PanelContainer"] [node name="WeaponsContainer" type="VBoxContainer" parent="CenterContainer/PanelContainer"]
layout_mode = 2 layout_mode = 2
[node name="Label" type="Label" parent="CenterContainer/PanelContainer/WeaponsContainer"] [node name="MoneyLabel" type="Label" parent="CenterContainer/PanelContainer/WeaponsContainer"]
layout_mode = 2 layout_mode = 2
horizontal_alignment = 1
vertical_alignment = 1
script = ExtResource("2_ll0n6") script = ExtResource("2_ll0n6")
[node name="WeaponsContainer" type="GridContainer" parent="CenterContainer/PanelContainer/WeaponsContainer"] [node name="WeaponsContainer" type="HBoxContainer" parent="CenterContainer/PanelContainer/WeaponsContainer"]
layout_mode = 2 layout_mode = 2
columns = 5
[node name="BuyButton" parent="CenterContainer/PanelContainer/WeaponsContainer/WeaponsContainer" instance=ExtResource("1_8guql")] [node name="ShotgunContainer" type="VBoxContainer" parent="CenterContainer/PanelContainer/WeaponsContainer/WeaponsContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="Shotgun" type="Label" parent="CenterContainer/PanelContainer/WeaponsContainer/WeaponsContainer/ShotgunContainer"]
layout_mode = 2
text = "Дробовики"
horizontal_alignment = 1
vertical_alignment = 1
[node name="MC255Button" parent="CenterContainer/PanelContainer/WeaponsContainer/WeaponsContainer/ShotgunContainer" instance=ExtResource("1_8guql")]
layout_mode = 2 layout_mode = 2
weapon = ExtResource("4_8uk5y") weapon = ExtResource("4_8uk5y")
[node name="AbilitiesLabel" type="Label" parent="CenterContainer/PanelContainer/WeaponsContainer"]
layout_mode = 2
text = "Способности"
horizontal_alignment = 1
vertical_alignment = 1
[node name="AbilitiesContainer" type="HBoxContainer" parent="CenterContainer/PanelContainer/WeaponsContainer"] [node name="AbilitiesContainer" type="HBoxContainer" parent="CenterContainer/PanelContainer/WeaponsContainer"]
layout_mode = 2 layout_mode = 2

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ct8b5dcenubms"
path.s3tc="res://.godot/imported/molikman_hands_tex_Molikman.png-ccd86400adbab09a67b0605e2bae3fe8.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "adf17223cdac27afac207ae40df37427"
}
[deps]
source_file="res://models/characters/molikman_hands_tex_Molikman.png"
dest_files=["res://.godot/imported/molikman_hands_tex_Molikman.png-ccd86400adbab09a67b0605e2bae3fe8.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ba0xi4ts40yb3"
path.s3tc="res://.godot/imported/molikman_hands_tex_bomb.png-6e48ea8587f348fc8c0188faec0617d2.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "478cd944aa7bbc08b6e05bea8b51b71e"
}
[deps]
source_file="res://models/characters/molikman_hands_tex_bomb.png"
dest_files=["res://.godot/imported/molikman_hands_tex_bomb.png-6e48ea8587f348fc8c0188faec0617d2.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cne3m4lsqaag5"
path.s3tc="res://.godot/imported/molikman_hands_tex_knife.png-14e609ed7efd05ea01238d295ced16c5.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "4e73f55f15c15350685cfd902157007e"
}
[deps]
source_file="res://models/characters/molikman_hands_tex_knife.png"
dest_files=["res://.godot/imported/molikman_hands_tex_knife.png-14e609ed7efd05ea01238d295ced16c5.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cydet5mugcv2y"
path.s3tc="res://.godot/imported/molikman_hands_tex_mc255.png-783083fd6f59893d1f5994f40b2f4e54.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "4c4e74ad08b505b93eeacccff4d2ee72"
}
[deps]
source_file="res://models/characters/molikman_hands_tex_mc255.png"
dest_files=["res://.godot/imported/molikman_hands_tex_mc255.png-783083fd6f59893d1f5994f40b2f4e54.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bnfvn64lqad84"
path.s3tc="res://.godot/imported/molikman_hands_tex_sp_albedo.png-f215d17851010b3798c57ae0584fbbca.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "6643bd50a4e6b8c34195f1c0b3363b30"
}
[deps]
source_file="res://models/characters/molikman_hands_tex_sp_albedo.png"
dest_files=["res://.godot/imported/molikman_hands_tex_sp_albedo.png-f215d17851010b3798c57ae0584fbbca.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c4enoo2ke23m8"
path.s3tc="res://.godot/imported/molikman_hands_tex_sp_roughness.png-f8a5e100a388929d559f72b52c5e5e55.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "8efa9a6c4e818d6467103a6b5a25a7bc"
}
[deps]
source_file="res://models/characters/molikman_hands_tex_sp_roughness.png"
dest_files=["res://.godot/imported/molikman_hands_tex_sp_roughness.png-f8a5e100a388929d559f72b52c5e5e55.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

View file

@ -8263,6 +8263,24 @@ _subresources={
"slice_99/start_frame": 0, "slice_99/start_frame": 0,
"slices/amount": 0 "slices/amount": 0
} }
},
"materials": {
"mat_Molikman.001": {
"use_external/enabled": true,
"use_external/fallback_path": "res://materials/players/molikman/mat_Molikman.tres",
"use_external/path": "uid://cjb0h3of85nc2"
}
},
"meshes": {
"molikman_hands_Plane_004": {
"generate/lightmap_uv": 0,
"generate/lods": 0,
"generate/shadow_meshes": 0,
"lods/normal_merge_angle": 20.0,
"save_to_file/enabled": true,
"save_to_file/fallback_path": "res://models/characters/viewmodels/meshes/molikman_cloak.res",
"save_to_file/path": "uid://uv03iu0vvniq"
}
} }
} }
gltf/naming_version=2 gltf/naming_version=2

View file

@ -20,6 +20,7 @@ enum ROUND_STATES {
const WIN_MONEY: int = 3400 const WIN_MONEY: int = 3400
const LOSE_MONEY: int = 2000 const LOSE_MONEY: int = 2000
const START_MONEY: int = 800
const ATTACK_LAYER: int = 0b10000 const ATTACK_LAYER: int = 0b10000
const DEFENCE_LAYER: int = 0b100000 const DEFENCE_LAYER: int = 0b100000
@ -55,6 +56,7 @@ var bomb_timer: Timer
var round_timer: Timer var round_timer: Timer
var buy_timer: Timer var buy_timer: Timer
func _ready() -> void: func _ready() -> void:
if multiplayer.is_server() == false: if multiplayer.is_server() == false:
return return
@ -155,8 +157,9 @@ func start_session() -> void:
all_players.append(multiplayer.get_unique_id()) all_players.append(multiplayer.get_unique_id())
for player in all_players: for player in all_players:
player_data[player] = { player_data[player] = {
"money" : 800, "money" : START_MONEY,
"nickname" : "Seliboba" "nickname" : Lobby.client_nicknames[player],
"saved_slots" : {}
} }
start_round() start_round()
@ -178,6 +181,8 @@ func end_session() -> void:
session_started_flag = false session_started_flag = false
plants = [] plants = []
plant_deadzones = {} plant_deadzones = {}
player_nodes.clear()
player_data.clear()
dynamic_objects_parent = null dynamic_objects_parent = null
@ -200,6 +205,21 @@ func start_round() -> void:
start_round.rpc() start_round.rpc()
round_timer.stop() round_timer.stop()
bomb_timer.stop() bomb_timer.stop()
if not current_round == LobbySettings.half_rounds:
for player_id in player_nodes.keys():
var player: Player = player_nodes[player_id]
if player.dead:
player_data[player_id].saved_slots = {}
continue
var weapon_system: WeaponSystem = player.get_node("%WeaponSystem")
var saved_slots: Dictionary[StringName,StringName] = {}
for slot in weapon_system.slots:
if slot == "bomb" or slot == "knife" or weapon_system.slots[slot] == null:
continue
saved_slots[slot] = weapon_system.slots[slot].weapon_gid
player_data[player_id].saved_slots = saved_slots
for container in object_containers: for container in object_containers:
container.despawn() container.despawn()
attackers_alive = 0 attackers_alive = 0
@ -246,6 +266,9 @@ func end_round(win_team: int) -> void:
var temp_rounds = attacker_score var temp_rounds = attacker_score
attacker_score = defender_score attacker_score = defender_score
defender_score = temp_rounds defender_score = temp_rounds
for id in player_data:
player_data[id].money = START_MONEY
player_data[id].saved_slots = {}
sync_score.rpc(attacker_score,defender_score) sync_score.rpc(attacker_score,defender_score)
round_state = ROUND_STATES.AFTER_ROUND round_state = ROUND_STATES.AFTER_ROUND
@ -347,16 +370,16 @@ func shoot(id:int , limb_damage: int, torso_damage: int,head_damage: int, distan
reduction = damage_reduction_curve.sample(distance_to_hit) reduction = damage_reduction_curve.sample(distance_to_hit)
hit_player.take_damage(int(float(damage) * reduction)) hit_player.take_damage(int(float(damage) * reduction))
else:
var bullet_hole: Decal = BULLET_HOLE.instantiate() var bullet_hole: Decal = BULLET_HOLE.instantiate()
dynamic_objects_parent.add_child(bullet_hole,true) dynamic_objects_parent.add_child(bullet_hole,true)
var rotation_quat: Quaternion = Quaternion(Vector3.UP,collision["normal"]) var rotation_quat: Quaternion = Quaternion(Vector3.UP,collision["normal"])
bullet_hole.quaternion *= rotation_quat bullet_hole.quaternion *= rotation_quat
bullet_hole.global_position = collision["position"] bullet_hole.global_position = collision["position"]
func shoot_pellets(id:int,limb_pellet_damage: int, torso_pellet_damage: int,head_pellet_damage: int, distance: float, pellets: PackedVector2Array, damage_reduction_curve: Curve = null): func shoot_pellets(id:int,limb_pellet_damage: int, torso_pellet_damage: int,head_pellet_damage: int, distance: float, pellets: PackedVector2Array, damage_reduction_curve: Curve = null):
if multiplayer.is_server() == false: if multiplayer.is_server() == false:
return return
@ -404,7 +427,7 @@ func shoot_pellets(id:int,limb_pellet_damage: int, torso_pellet_damage: int,head
reduction = damage_reduction_curve.sample(distance_to_hit) reduction = damage_reduction_curve.sample(distance_to_hit)
hit_player.take_damage(int(float(damage) * reduction)) hit_player.take_damage(int(float(damage) * reduction))
else:
var bullet_hole: Decal = BULLET_HOLE.instantiate() var bullet_hole: Decal = BULLET_HOLE.instantiate()
dynamic_objects_parent.add_child(bullet_hole,true) dynamic_objects_parent.add_child(bullet_hole,true)
@ -475,6 +498,7 @@ func delete_player(id: int):
player_data.erase(id) player_data.erase(id)
# For clients only
func get_player_data() -> Dictionary: func get_player_data() -> Dictionary:
var id: int = multiplayer.get_unique_id() var id: int = multiplayer.get_unique_id()
if player_data.has(id): if player_data.has(id):

File diff suppressed because one or more lines are too long

View file

@ -36,6 +36,10 @@ const MAX_HP = 100
var dead: bool var dead: bool
func _ready() -> void:
for model in weapon_models.values():
model.hide()
func _physics_process(_delta: float) -> void: func _physics_process(_delta: float) -> void:
if not multiplayer.is_server(): if not multiplayer.is_server():
return return

View file

@ -1,5 +1,7 @@
extends Node extends Node
@export var player: Player
@export var starting_pistol: PackedScene @export var starting_pistol: PackedScene
@export var starting_knife: PackedScene @export var starting_knife: PackedScene
@export var weapon_system: WeaponSystem @export var weapon_system: WeaponSystem
@ -9,6 +11,12 @@ func _ready() -> void:
func deferred_ready() -> void: func deferred_ready() -> void:
if is_multiplayer_authority(): if is_multiplayer_authority():
var saved_slots = Session.player_data[player.player_id].saved_slots
if saved_slots != {}:
for slot in saved_slots:
var weapon = Registry.weapons[saved_slots[slot]]
weapon_system.add(weapon.weapon_system_scene.instantiate(),weapon.slot)
else:
weapon_system.add(starting_pistol.instantiate(),"secondary") weapon_system.add(starting_pistol.instantiate(),"secondary")
weapon_system.add(starting_knife.instantiate(),"knife") weapon_system.add(starting_knife.instantiate(),"knife")
queue_free() queue_free()

View file

@ -53,6 +53,8 @@ func can_add(slot: StringName) -> bool:
func add(state: WeaponSubStateMachine, slot: StringName) -> void: func add(state: WeaponSubStateMachine, slot: StringName) -> void:
if not multiplayer.is_server(): if not multiplayer.is_server():
return return
if slot == "ability":
slot = get_empty_ability_slot()
if can_add(slot) == false: if can_add(slot) == false:
return return

View file

@ -5,12 +5,13 @@
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_wpexx"] [sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_wpexx"]
properties/0/path = NodePath(".:position") properties/0/path = NodePath(".:position")
properties/0/spawn = true properties/0/spawn = true
properties/0/replication_mode = 1 properties/0/replication_mode = 0
properties/1/path = NodePath(".:rotation") properties/1/path = NodePath(".:rotation")
properties/1/spawn = true properties/1/spawn = true
properties/1/replication_mode = 1 properties/1/replication_mode = 0
[node name="BulletHole" type="Decal"] [node name="BulletHole" type="Decal"]
layers = 4
size = Vector3(0.25, 0.5, 0.25) size = Vector3(0.25, 0.5, 0.25)
texture_albedo = ExtResource("1_wpexx") texture_albedo = ExtResource("1_wpexx")