├── icon.png ├── remap_files.rar ├── bannedimplant.png ├── models ├── online.glb ├── intro_guy.glb ├── Material.material ├── Phone_mat.material ├── glasses.material ├── basement_blades.glb ├── Phone_screen.material ├── Nude_Material_001.material ├── Nude_Material001_001.material ├── weapon_spawner.mtl └── weapon_spawner.obj.import ├── target_white.png ├── crus_online_logo.png ├── maps ├── greyface1.png ├── greyface2.png ├── greyface1.png.import ├── greyface2.png.import ├── Benchmark.gd ├── benchmark.tscn └── look.tres ├── sadbannedimplant.png ├── maps_stuff ├── respawn_point.tscn └── WeaponSpawner.gd ├── WIKI.md ├── remaped ├── Tutorial_Exit.gd ├── killbox.gd ├── Message_Area.gd ├── Special_Destroy.gd ├── Radiation.gd ├── garbage_destroyer.gd ├── Rotator_Y_Spatial.gd ├── Rotator_Y.gd ├── coin.gd ├── Asset_Pickup.gd ├── Implant_Object.gd ├── Random_Mesh.gd ├── Abraxas_Head.gd ├── Level_Painting.gd ├── Radio.gd ├── Generic_Shell.tscn ├── soulll.gd ├── Shell.tscn ├── Player_Manager.gd ├── Player_Test.tscn ├── 20_mm_shell.tscn ├── Berries.gd ├── Elevator.gd ├── down_switch_door.gd ├── Explosion.gd ├── Exit.gd ├── Terror_Door.gd ├── Cutscene.gd ├── down_door.gd ├── Pushblock.gd ├── snakehead.gd ├── Special_Pushblock.gd ├── Profane_Door.gd ├── weapon_pickup_new.gd ├── vendingmachine.gd ├── Elevator_Door.gd ├── Destructible_Armored.gd ├── Item_Slotmachine.gd ├── Fire.gd ├── Abraxas_Rocket.gd ├── Divine_Door.gd ├── Destructible_Static.gd ├── Slotmachine.gd ├── Destructible.gd ├── abraxas.gd ├── Fire_Child.gd ├── Abraxas_Laser.gd ├── grid_enemy.gd ├── Weapon_Slotmachine.gd ├── MissileKinematic.gd └── Door.gd ├── redpanel.tres ├── BenchmarkBall.tscn ├── BenchmarkBall.gd ├── multiplayer_init.gd ├── effects ├── fake_Fire_Child.tscn ├── fake_Fire.tscn ├── fake_explosion.tscn ├── fake_Radiation.tscn ├── fake_Missile_Kinematic.tscn ├── fake_self_destruct_explosion.tscn ├── fake_Grenade.tscn └── fake_poison_gas.tscn ├── icon.png.import ├── UPnP.gd ├── bannedimplant.png.import ├── crus_online_logo.png.import ├── sadbannedimplant.png.import ├── target_white.png.import ├── BloodParticles.tscn ├── player_model └── player_anim_example.gd ├── entities ├── material_randomizer.gd ├── Enemy_Melee_Weapon.gd └── Enemy_Controller.gd ├── Players.gd ├── shell_physics.gd ├── Stats.gd ├── help.txt.gd ├── Menu.gd ├── Steam.gd ├── ChatBox.gd ├── Button.tscn ├── RelayServer.gd ├── README.md ├── WIKI_RU.md ├── README_RU.md └── extramenu.tres /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/icon.png -------------------------------------------------------------------------------- /remap_files.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/remap_files.rar -------------------------------------------------------------------------------- /bannedimplant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/bannedimplant.png -------------------------------------------------------------------------------- /models/online.glb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/models/online.glb -------------------------------------------------------------------------------- /target_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/target_white.png -------------------------------------------------------------------------------- /crus_online_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/crus_online_logo.png -------------------------------------------------------------------------------- /maps/greyface1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/maps/greyface1.png -------------------------------------------------------------------------------- /maps/greyface2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/maps/greyface2.png -------------------------------------------------------------------------------- /models/intro_guy.glb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/models/intro_guy.glb -------------------------------------------------------------------------------- /sadbannedimplant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/sadbannedimplant.png -------------------------------------------------------------------------------- /models/Material.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/models/Material.material -------------------------------------------------------------------------------- /models/Phone_mat.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/models/Phone_mat.material -------------------------------------------------------------------------------- /models/glasses.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/models/glasses.material -------------------------------------------------------------------------------- /models/basement_blades.glb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/models/basement_blades.glb -------------------------------------------------------------------------------- /models/Phone_screen.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/models/Phone_screen.material -------------------------------------------------------------------------------- /maps_stuff/respawn_point.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene format=2] 2 | 3 | [node name="RespawnPoint" type="Position3D" groups=["Respawn"]] 4 | -------------------------------------------------------------------------------- /models/Nude_Material_001.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/models/Nude_Material_001.material -------------------------------------------------------------------------------- /models/Nude_Material001_001.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TriggeredP/crus-online/HEAD/models/Nude_Material001_001.material -------------------------------------------------------------------------------- /WIKI.md: -------------------------------------------------------------------------------- 1 | # Cruelty Squad Online Development Wiki 2 | 3 |
6 |
7 | English | [Русский](WIKI_RU.md)
--------------------------------------------------------------------------------
/remaped/Tutorial_Exit.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | onready var Multiplayer = Global.get_node("Multiplayer")
6 |
7 | func player_use():
8 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
9 | Multiplayer.goto_menu_host()
10 |
--------------------------------------------------------------------------------
/remaped/killbox.gd:
--------------------------------------------------------------------------------
1 | extends Area
2 |
3 | func _ready():
4 | set_collision_mask_bit(0, 0)
5 | set_collision_mask_bit(1, 1)
6 |
7 | connect("body_entered", self, "_on_Body_Entered")
8 |
9 | func _on_Body_Entered(body):
10 | if body.has_method("damage"):
11 | body.damage(1000, Vector3.ZERO, global_transform.origin, global_transform.origin)
12 |
--------------------------------------------------------------------------------
/remaped/Message_Area.gd:
--------------------------------------------------------------------------------
1 | extends Area
2 |
3 | export (String, MULTILINE) var message = "N/A"
4 | export var tutorial = false
5 |
6 | func _ready():
7 | if tutorial and Global.LEVELS_UNLOCKED > 1:
8 | queue_free()
9 |
10 | func _on_Message_Area_body_entered(body):
11 | if body == Global.player:
12 | body.UI.message(message, false)
13 | queue_free()
14 |
--------------------------------------------------------------------------------
/models/weapon_spawner.mtl:
--------------------------------------------------------------------------------
1 | # Blender 3.6.4 MTL File: 'crus models.blend'
2 | # www.blender.org
3 |
4 | newmtl Material.001
5 | Ns 250.000000
6 | Ka 1.000000 1.000000 1.000000
7 | Ks 0.500000 0.500000 0.500000
8 | Ke 0.000000 0.000000 0.000000
9 | Ni 1.450000
10 | d 1.000000
11 | illum 2
12 | map_Kd C:/Users/Vital/OneDrive/Рабочий стол/CRuS multiplayer/Maps/textures/base/switch.png
13 |
--------------------------------------------------------------------------------
/redpanel.tres:
--------------------------------------------------------------------------------
1 | [gd_resource type="StyleBoxTexture" load_steps=2 format=2]
2 |
3 | [ext_resource path="res://Textures/Menu/background_1.png" type="Texture" id=1]
4 |
5 | [resource]
6 | texture = ExtResource( 1 )
7 | region_rect = Rect2( 0, 0, 256, 256 )
8 | margin_left = 10.0
9 | margin_right = 10.0
10 | margin_top = 5.0
11 | margin_bottom = 5.0
12 | modulate_color = Color( 0.298039, 0.0352941, 0.0352941, 1 )
13 |
--------------------------------------------------------------------------------
/BenchmarkBall.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=4 format=2]
2 |
3 | [ext_resource path="res://Materials/Freak_Snake.tres" type="Material" id=1]
4 | [ext_resource path="res://MOD_CONTENT/CruS Online/BenchmarkBall.gd" type="Script" id=2]
5 |
6 | [sub_resource type="SphereMesh" id=1]
7 | material = ExtResource( 1 )
8 |
9 | [node name="BenchmarkBall" type="Spatial"]
10 | script = ExtResource( 2 )
11 |
12 | [node name="MeshInstance" type="MeshInstance" parent="."]
13 | mesh = SubResource( 1 )
14 |
--------------------------------------------------------------------------------
/remaped/Special_Destroy.gd:
--------------------------------------------------------------------------------
1 | extends StaticBody
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | func _ready():
6 | NetworkBridge.register_rpcs(self, [
7 | ["remove", NetworkBridge.PERMISSION.SERVER]
8 | ])
9 |
10 | puppet func remove(id):
11 | queue_free()
12 |
13 | func special_destroy():
14 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
15 | queue_free()
16 | NetworkBridge.n_rpc(self, "remove")
17 |
--------------------------------------------------------------------------------
/BenchmarkBall.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var Multiplayer = Global.get_node("Multiplayer")
4 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
5 |
6 | func _ready():
7 | NetworkBridge.register_rpcs(self, [
8 | ["test_rpc", NetworkBridge.PERMISSION.SERVER]
9 | ])
10 |
11 | func _physics_process(delta):
12 | if NetworkBridge.n_is_network_master():
13 | NetworkBridge.n_rpc_unreliable(self, "test_rpc", [[Vector3.ONE, Vector3.ONE, Vector3.ONE]])
14 |
15 | puppet func test_rpc(id, garbage_data):
16 | pass
17 |
--------------------------------------------------------------------------------
/multiplayer_init.gd:
--------------------------------------------------------------------------------
1 | extends Node
2 |
3 | func _init():
4 | ProjectSettings.set_setting("debug/gdscript/warnings/enable", true)
5 |
6 | Global.add_child(preload("res://MOD_CONTENT/CruS Online/multiplayer.tscn").instance())
7 | Global.add_child(preload("res://MOD_CONTENT/CruS Online/death_screen.tscn").instance())
8 | Global.get_node("Menu").add_child(preload("res://MOD_CONTENT/CruS Online/menu.tscn").instance())
9 |
10 | # $'/root/Global/Multiplayer'
11 | # Global.get_node('Multiplayer')
12 | # get_tree().get_nodes_in_group("Multiplayer")[0]
13 |
--------------------------------------------------------------------------------
/effects/fake_Fire_Child.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=4 format=2]
2 |
3 | [ext_resource path="res://Materials/Fire.tres" type="Material" id=2]
4 | [ext_resource path="res://Entities/Particles/fire.tres" type="Material" id=3]
5 |
6 | [sub_resource type="QuadMesh" id=2]
7 |
8 | [node name="Particles" type="Particles"]
9 | transform = Transform( 2.052, 0, 0, 0, 2.292, 0, 0, 0, 2.02, 0, 0, 0 )
10 | material_override = ExtResource( 2 )
11 | emitting = false
12 | amount = 5
13 | lifetime = 0.27
14 | fract_delta = false
15 | process_material = ExtResource( 3 )
16 | draw_pass_1 = SubResource( 2 )
17 |
--------------------------------------------------------------------------------
/remaped/Radiation.gd:
--------------------------------------------------------------------------------
1 | extends Particles
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var damage = 0.4
6 |
7 | func _physics_process(delta):
8 | if NetworkBridge.n_is_network_master(self):
9 | for body in $Area.get_overlapping_bodies():
10 | if body == Global.player and Global.death:
11 | return
12 | if body.has_method("player_damage"):
13 | body.player_damage(damage, Vector3.ZERO, body.global_transform.origin, global_transform.origin, "radiation")
14 | elif body.has_method("damage"):
15 | body.damage(damage, Vector3.ZERO, body.global_transform.origin, global_transform.origin)
16 |
--------------------------------------------------------------------------------
/remaped/garbage_destroyer.gd:
--------------------------------------------------------------------------------
1 | extends Area
2 |
3 | var particle_node
4 | var particle = false
5 |
6 | func _ready():
7 | connect("body_entered", self, "_on_body_entered")
8 | particle_node = get_node_or_null("Particles")
9 | if is_instance_valid(particle_node):
10 | particle = true
11 |
12 | func _on_body_entered(body):
13 | if body == get_parent() or body.get_collision_layer_bit(0) or "sound" in body:
14 | return
15 | if particle:
16 | particle_node.emitting = true
17 | if "soul" in body:
18 | body.soul.hide()
19 | body.soul.global_transform.origin = Vector3(-1000,-1000,-1000)
20 | else :
21 | body.hide()
22 | body.global_transform.origin = Vector3(-1000,-1000,-1000)
23 |
--------------------------------------------------------------------------------
/models/weapon_spawner.obj.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="wavefront_obj"
4 | type="Mesh"
5 | path="res://.import/weapon_spawner.obj-f70445d7240aaa7dc3225e4498299fd6.mesh"
6 |
7 | [deps]
8 |
9 | files=[ "res://.import/weapon_spawner.obj-f70445d7240aaa7dc3225e4498299fd6.mesh" ]
10 |
11 | source_file="res://MOD_CONTENT/CruS Online/models/weapon_spawner.obj"
12 | dest_files=[ "res://.import/weapon_spawner.obj-f70445d7240aaa7dc3225e4498299fd6.mesh", "res://.import/weapon_spawner.obj-f70445d7240aaa7dc3225e4498299fd6.mesh" ]
13 |
14 | [params]
15 |
16 | generate_tangents=true
17 | scale_mesh=Vector3( 1, 1, 1 )
18 | offset_mesh=Vector3( 0, 0, 0 )
19 | octahedral_compression=true
20 | optimize_mesh_flags=4286
21 |
--------------------------------------------------------------------------------
/remaped/Rotator_Y_Spatial.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var rotation_speed = 1
6 |
7 | func _ready():
8 | NetworkBridge.register_rpcs(self, [
9 | ["network_set_rotation", NetworkBridge.PERMISSION.SERVER]
10 | ])
11 |
12 | rotation.y += rand_range(0, TAU)
13 |
14 | var tick = 0
15 |
16 | func _physics_process(delta):
17 | rotation.y -= rotation_speed * delta
18 |
19 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
20 | tick += 1
21 | if tick % 30 == 0:
22 | NetworkBridge.n_rpc_unreliable(self, "network_set_rotation", [rotation.y])
23 | tick = 0
24 |
25 | puppet func network_set_rotation(id, recived_y):
26 | rotation.y = recived_y
27 |
--------------------------------------------------------------------------------
/remaped/Rotator_Y.gd:
--------------------------------------------------------------------------------
1 | extends KinematicBody
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var rotation_speed:float = 1
6 |
7 | func _ready():
8 | NetworkBridge.register_rpcs(self, [
9 | ["network_set_rotation", NetworkBridge.PERMISSION.SERVER]
10 | ])
11 |
12 | rotation.y += rand_range(0, TAU)
13 |
14 | var tick = 0
15 |
16 | func _physics_process(delta):
17 | rotation.y -= rotation_speed * delta
18 |
19 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
20 | tick += 1
21 | if tick % 30 == 0:
22 | NetworkBridge.n_rpc_unreliable(self, "network_set_rotation", [rotation.y])
23 | tick = 0
24 |
25 | puppet func network_set_rotation(id, recived_y):
26 | rotation.y = recived_y
27 |
--------------------------------------------------------------------------------
/remaped/coin.gd:
--------------------------------------------------------------------------------
1 | extends Area
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var value = 10
6 | export var id = "N"
7 |
8 | var fromSlotMachine = false
9 |
10 | func _ready():
11 | NetworkBridge.register_rpcs(self, [
12 | ["hide_coin", NetworkBridge.PERMISSION.ALL]
13 | ])
14 |
15 | if Global.MONEY_ITEMS.find(id) != - 1:
16 | get_parent().queue_free()
17 |
18 | func player_use():
19 | Global.player.UI.notify("$" + str(value) + " picked up", Color(1, 1, 0))
20 | Global.money += value
21 | if id != "N":
22 | Global.MONEY_ITEMS.append(id)
23 | Global.save_game()
24 |
25 | if fromSlotMachine:
26 | NetworkBridge.n_rpc(self, "hide_coin")
27 | get_parent().queue_free()
28 |
29 | remote func hide_coin(id):
30 | get_parent().queue_free()
31 |
--------------------------------------------------------------------------------
/remaped/Asset_Pickup.gd:
--------------------------------------------------------------------------------
1 | extends Area
2 |
3 | # WARN: По какой-то причине загружается до инициализации стима
4 |
5 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
6 |
7 | export var value = "Liver"
8 |
9 | func _ready():
10 | NetworkBridge.register_rpcs(self, [
11 | ["hide_asset", NetworkBridge.PERMISSION.ALL]
12 | ])
13 |
14 | func player_use():
15 | Global.player.UI.notify(value + " acquisition complete", Color(1, 1, 0))
16 | for stock in Global.STOCKS.stocks:
17 | if stock.s_name == value:
18 | stock.owned += 1
19 | if Global.STOCKS.ORGANS_FOUND.find(value) == - 1:
20 | Global.STOCKS.ORGANS_FOUND.append(value)
21 | Global.STOCKS.save_stocks("user://stocks.save")
22 | NetworkBridge.n_rpc(self, "hide_asset")
23 | get_parent().queue_free()
24 |
25 | remote func hide_asset(id):
26 | get_parent().queue_free()
27 |
--------------------------------------------------------------------------------
/icon.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="StreamTexture"
5 | path="res://.import/icon.png-18e2a1fd5b08b0cedda4cbca39838751.stex"
6 | metadata={
7 | "vram_texture": false
8 | }
9 |
10 | [deps]
11 |
12 | source_file="res://MOD_CONTENT/CruS Online/icon.png"
13 | dest_files=[ "res://.import/icon.png-18e2a1fd5b08b0cedda4cbca39838751.stex" ]
14 |
15 | [params]
16 |
17 | compress/mode=0
18 | compress/lossy_quality=0.7
19 | compress/hdr_mode=0
20 | compress/bptc_ldr=0
21 | compress/normal_map=0
22 | flags/repeat=true
23 | flags/filter=false
24 | flags/mipmaps=true
25 | flags/anisotropic=false
26 | flags/srgb=0
27 | process/fix_alpha_border=true
28 | process/premult_alpha=false
29 | process/HDR_as_SRGB=false
30 | process/invert_color=false
31 | process/normal_map_invert_y=false
32 | stream=false
33 | size_limit=0
34 | detect_3d=false
35 | svg/scale=1.0
36 |
--------------------------------------------------------------------------------
/remaped/Implant_Object.gd:
--------------------------------------------------------------------------------
1 | extends Area
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var implant_name = "Hazmat Suit"
6 |
7 | func _ready():
8 | if Global.implants.purchased_implants.find(implant_name) == - 1:
9 | for i in Global.implants.IMPLANTS:
10 | if i.i_name == implant_name:
11 |
12 | var new_mat = $implant_object / Cube.mesh.surface_get_material(1).duplicate()
13 | new_mat.albedo_texture = i.texture
14 | $implant_object / Cube.set_surface_material(1, new_mat)
15 | else :
16 | get_parent().hide()
17 | $CollisionShape.disabled = true
18 |
19 | func player_use():
20 | Global.implants.purchased_implants.append(implant_name)
21 | Global.player.UI.notify(implant_name + " acquired.", Color(0.2, 1, 0))
22 | Global.save_game()
23 | get_parent().hide()
24 | $CollisionShape.disabled = true
25 |
--------------------------------------------------------------------------------
/maps/greyface1.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="StreamTexture"
5 | path="res://.import/greyface1.png-6571da76d3da90565fe8856c71892a9d.stex"
6 | metadata={
7 | "vram_texture": false
8 | }
9 |
10 | [deps]
11 |
12 | source_file="res://MOD_CONTENT/CruS Online/maps/greyface1.png"
13 | dest_files=[ "res://.import/greyface1.png-6571da76d3da90565fe8856c71892a9d.stex" ]
14 |
15 | [params]
16 |
17 | compress/mode=3
18 | compress/lossy_quality=0.7
19 | compress/hdr_mode=0
20 | compress/bptc_ldr=0
21 | compress/normal_map=0
22 | flags/repeat=true
23 | flags/filter=false
24 | flags/mipmaps=true
25 | flags/anisotropic=false
26 | flags/srgb=1
27 | process/fix_alpha_border=true
28 | process/premult_alpha=false
29 | process/HDR_as_SRGB=false
30 | process/invert_color=false
31 | process/normal_map_invert_y=false
32 | stream=false
33 | size_limit=0
34 | detect_3d=false
35 | svg/scale=1.0
36 |
--------------------------------------------------------------------------------
/maps/greyface2.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="StreamTexture"
5 | path="res://.import/greyface2.png-997b25d1762a6fe563c73a4b51ea023e.stex"
6 | metadata={
7 | "vram_texture": false
8 | }
9 |
10 | [deps]
11 |
12 | source_file="res://MOD_CONTENT/CruS Online/maps/greyface2.png"
13 | dest_files=[ "res://.import/greyface2.png-997b25d1762a6fe563c73a4b51ea023e.stex" ]
14 |
15 | [params]
16 |
17 | compress/mode=3
18 | compress/lossy_quality=0.7
19 | compress/hdr_mode=0
20 | compress/bptc_ldr=0
21 | compress/normal_map=0
22 | flags/repeat=true
23 | flags/filter=false
24 | flags/mipmaps=true
25 | flags/anisotropic=false
26 | flags/srgb=1
27 | process/fix_alpha_border=true
28 | process/premult_alpha=false
29 | process/HDR_as_SRGB=false
30 | process/invert_color=false
31 | process/normal_map_invert_y=false
32 | stream=false
33 | size_limit=0
34 | detect_3d=false
35 | svg/scale=1.0
36 |
--------------------------------------------------------------------------------
/UPnP.gd:
--------------------------------------------------------------------------------
1 | extends Node
2 |
3 | var thread = null
4 |
5 | signal upnp_completed(error)
6 |
7 | func _upnp_setup(server_port):
8 | var upnp = UPNP.new()
9 | var err = upnp.discover()
10 |
11 | if err != OK:
12 | push_error("[CRUS ONLINE / UPnP]: ERROR " + str(err))
13 | emit_signal("upnp_completed", err)
14 | return
15 |
16 | if upnp.get_gateway() and upnp.get_gateway().is_valid_gateway():
17 | upnp.add_port_mapping(server_port, server_port, ProjectSettings.get_setting("application/config/name"), "UDP")
18 | upnp.add_port_mapping(server_port, server_port, ProjectSettings.get_setting("application/config/name"), "TCP")
19 | print("[CRUS ONLINE / UPnP]: UPnP enabled")
20 | emit_signal("upnp_completed", OK)
21 |
22 | func upnp_setup(server_port):
23 | thread = Thread.new()
24 | thread.start(self, "_upnp_setup", server_port)
25 |
26 | func _exit_tree():
27 | thread.wait_to_finish()
28 |
--------------------------------------------------------------------------------
/bannedimplant.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="StreamTexture"
5 | path="res://.import/bannedimplant.png-309313e794cbfa18f174c26e593cc3d6.stex"
6 | metadata={
7 | "vram_texture": false
8 | }
9 |
10 | [deps]
11 |
12 | source_file="res://MOD_CONTENT/CruS Online/bannedimplant.png"
13 | dest_files=[ "res://.import/bannedimplant.png-309313e794cbfa18f174c26e593cc3d6.stex" ]
14 |
15 | [params]
16 |
17 | compress/mode=0
18 | compress/lossy_quality=0.7
19 | compress/hdr_mode=0
20 | compress/bptc_ldr=0
21 | compress/normal_map=0
22 | flags/repeat=1
23 | flags/filter=false
24 | flags/mipmaps=false
25 | flags/anisotropic=false
26 | flags/srgb=1
27 | process/fix_alpha_border=true
28 | process/premult_alpha=false
29 | process/HDR_as_SRGB=false
30 | process/invert_color=false
31 | process/normal_map_invert_y=false
32 | stream=false
33 | size_limit=0
34 | detect_3d=false
35 | svg/scale=1.0
36 |
--------------------------------------------------------------------------------
/crus_online_logo.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="StreamTexture"
5 | path="res://.import/crus_online_logo.png-33af213939e9b15b39ea86e451ab26c4.stex"
6 | metadata={
7 | "vram_texture": false
8 | }
9 |
10 | [deps]
11 |
12 | source_file="res://MOD_CONTENT/CruS Online/crus_online_logo.png"
13 | dest_files=[ "res://.import/crus_online_logo.png-33af213939e9b15b39ea86e451ab26c4.stex" ]
14 |
15 | [params]
16 |
17 | compress/mode=3
18 | compress/lossy_quality=0.7
19 | compress/hdr_mode=0
20 | compress/bptc_ldr=0
21 | compress/normal_map=0
22 | flags/repeat=true
23 | flags/filter=false
24 | flags/mipmaps=true
25 | flags/anisotropic=false
26 | flags/srgb=0
27 | process/fix_alpha_border=true
28 | process/premult_alpha=false
29 | process/HDR_as_SRGB=false
30 | process/invert_color=false
31 | process/normal_map_invert_y=false
32 | stream=false
33 | size_limit=0
34 | detect_3d=false
35 | svg/scale=1.0
36 |
--------------------------------------------------------------------------------
/sadbannedimplant.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="StreamTexture"
5 | path="res://.import/sadbannedimplant.png-bf7e2c2f56c852eb4c6e9cf459809f07.stex"
6 | metadata={
7 | "vram_texture": false
8 | }
9 |
10 | [deps]
11 |
12 | source_file="res://MOD_CONTENT/CruS Online/sadbannedimplant.png"
13 | dest_files=[ "res://.import/sadbannedimplant.png-bf7e2c2f56c852eb4c6e9cf459809f07.stex" ]
14 |
15 | [params]
16 |
17 | compress/mode=0
18 | compress/lossy_quality=0.7
19 | compress/hdr_mode=0
20 | compress/bptc_ldr=0
21 | compress/normal_map=0
22 | flags/repeat=true
23 | flags/filter=false
24 | flags/mipmaps=false
25 | flags/anisotropic=false
26 | flags/srgb=1
27 | process/fix_alpha_border=true
28 | process/premult_alpha=false
29 | process/HDR_as_SRGB=false
30 | process/invert_color=false
31 | process/normal_map_invert_y=false
32 | stream=false
33 | size_limit=0
34 | detect_3d=false
35 | svg/scale=1.0
36 |
--------------------------------------------------------------------------------
/remaped/Random_Mesh.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | var foodType = 0
6 |
7 | onready var collision = get_node("../Area/CollisionShape")
8 |
9 | func _ready():
10 | NetworkBridge.register_rpcs(self, [
11 | ["set_food", NetworkBridge.PERMISSION.SERVER],
12 | ["get_food", NetworkBridge.PERMISSION.ALL]
13 | ])
14 |
15 | collision.disabled = true
16 |
17 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
18 | if randi() % 2 != 0:
19 | foodType = randi() % get_child_count()
20 | get_child(foodType).show()
21 | collision.disabled = false
22 | else:
23 | get_food(null)
24 |
25 | master func get_food(id):
26 | if not collision.disabled:
27 | NetworkBridge.n_rpc(self, "set_food", [foodType])
28 |
29 | puppet func set_food(id, type):
30 | get_child(type).show()
31 | collision.disabled = false
32 |
--------------------------------------------------------------------------------
/remaped/Abraxas_Head.gd:
--------------------------------------------------------------------------------
1 | extends KinematicBody
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | var type = 1
6 | var active = false
7 | export var health = 10
8 | var destroyed = false
9 |
10 | func _ready():
11 | NetworkBridge.register_rpcs(self, [
12 | ["died", NetworkBridge.PERMISSION.SERVER],
13 | ["network_damage", NetworkBridge.PERMISSION.ALL]
14 | ])
15 |
16 | puppet func died(id):
17 | get_parent().get_node("Sphere").hide()
18 | get_parent().get_node("Particle").show()
19 |
20 | func damage(dmg, nrml, pos, shoot_pos):
21 | network_damage(null, dmg, nrml, pos, shoot_pos)
22 |
23 | master func network_damage(id, dmg, nrml, pos, shoot_pos):
24 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
25 | if not active:
26 | return
27 | health -= dmg
28 | if health <= 0:
29 | destroyed = true
30 | died(null)
31 | NetworkBridge.n_rpc(self, "died")
32 | else:
33 | NetworkBridge.n_rpc(self, "network_damage", [dmg, nrml, pos, shoot_pos])
34 |
35 | func get_type():
36 | return type
37 |
--------------------------------------------------------------------------------
/target_white.png.import:
--------------------------------------------------------------------------------
1 | [remap]
2 |
3 | importer="texture"
4 | type="StreamTexture"
5 | path.s3tc="res://.import/target_white.png-fbe3b145510ca3e5a6967b8d63309f01.s3tc.stex"
6 | path.etc2="res://.import/target_white.png-fbe3b145510ca3e5a6967b8d63309f01.etc2.stex"
7 | metadata={
8 | "imported_formats": [ "s3tc", "etc2" ],
9 | "vram_texture": true
10 | }
11 |
12 | [deps]
13 |
14 | source_file="res://MOD_CONTENT/CruS Online/target_white.png"
15 | dest_files=[ "res://.import/target_white.png-fbe3b145510ca3e5a6967b8d63309f01.s3tc.stex", "res://.import/target_white.png-fbe3b145510ca3e5a6967b8d63309f01.etc2.stex" ]
16 |
17 | [params]
18 |
19 | compress/mode=2
20 | compress/lossy_quality=0.7
21 | compress/hdr_mode=0
22 | compress/bptc_ldr=0
23 | compress/normal_map=0
24 | flags/repeat=true
25 | flags/filter=false
26 | flags/mipmaps=false
27 | flags/anisotropic=false
28 | flags/srgb=1
29 | process/fix_alpha_border=true
30 | process/premult_alpha=false
31 | process/HDR_as_SRGB=false
32 | process/invert_color=false
33 | process/normal_map_invert_y=false
34 | stream=false
35 | size_limit=0
36 | detect_3d=false
37 | svg/scale=1.0
38 |
--------------------------------------------------------------------------------
/maps/Benchmark.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var ball = preload("res://MOD_CONTENT/CruS Online/BenchmarkBall.tscn")
4 |
5 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
6 |
7 | func _ready():
8 | NetworkBridge.register_rpcs(self,[
9 | ["_create_object", NetworkBridge.PERMISSION.SERVER],
10 | ["spawn_ball", NetworkBridge.PERMISSION.ALL]
11 | ])
12 |
13 | puppet func _create_object(id, recivedName, recivedOrigin):
14 | var newObject = ball.instance()
15 | newObject.set_name(recivedName)
16 | $Balls.add_child(newObject)
17 |
18 | newObject.global_transform.origin = recivedOrigin
19 |
20 | master func spawn_ball(id, count = 1):
21 | if NetworkBridge.n_is_network_master(self):
22 | for i in range(count):
23 | var newObject = ball.instance()
24 | newObject.set_name(newObject.name + "#" + str(newObject.get_instance_id()))
25 | $Balls.add_child(newObject)
26 |
27 | newObject.global_transform.origin += Vector3(rand_range(-10.0, 10.0), rand_range(-10.0, 10.0), rand_range(-10.0, 10.0))
28 |
29 | NetworkBridge.n_rpc(self, "_create_object", [newObject.name, newObject.global_transform.origin])
30 | else:
31 | NetworkBridge.n_rpc(self, "spawn_ball", [count])
32 |
--------------------------------------------------------------------------------
/remaped/Level_Painting.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var level_index = 13
6 | export var level_name = "Darkworld"
7 |
8 | onready var Multiplayer = Global.get_node("Multiplayer")
9 |
10 | func _ready():
11 | NetworkBridge.register_rpcs(self, [
12 | ["unlock_level", NetworkBridge.PERMISSION.SERVER]
13 | ])
14 |
15 | var new_mat = $level_painting / Cube.mesh.surface_get_material(1).duplicate()
16 | new_mat.albedo_texture = Global.LEVEL_IMAGES[level_index]
17 | $level_painting / Cube.set_surface_material(1, new_mat)
18 |
19 | func _on_Area_body_entered(body):
20 | if body == Global.player:
21 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
22 | if Global.BONUS_UNLOCK.find(level_name) == -1:
23 | Global.BONUS_UNLOCK.append(level_name)
24 | NetworkBridge.n_rpc(self, "unlock_level")
25 | Global.save_game()
26 | Multiplayer.goto_scene_host(Global.LEVELS[level_index])
27 | else:
28 | Global.UI.notify("It feels like a normal painting", Color(1, 0, 0))
29 |
30 | puppet func unlock_level(id):
31 | if Global.BONUS_UNLOCK.find(level_name) == -1:
32 | Global.BONUS_UNLOCK.append(level_name)
33 |
--------------------------------------------------------------------------------
/remaped/Radio.gd:
--------------------------------------------------------------------------------
1 | extends Area
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | var static_noise = 0
6 | var current_track = 0
7 |
8 | func _ready():
9 | NetworkBridge.register_rpcs(self, [
10 | ["change_track", NetworkBridge.PERMISSION.SERVER],
11 | ["get_track", NetworkBridge.PERMISSION.ALL],
12 | ["player_use", NetworkBridge.PERMISSION.ALL]
13 | ])
14 |
15 | if NetworkBridge.n_is_network_master(self):
16 | current_track = randi() % Global.LEVEL_SONGS.size()
17 | $Radio.stream = Global.LEVEL_SONGS[current_track]
18 | $Radio.play()
19 | else:
20 | NetworkBridge.n_rpc(self, "get_track")
21 |
22 | master func player_use(id):
23 | if NetworkBridge.n_is_network_master(self):
24 | current_track += 1
25 | current_track = wrapi(current_track, 0, Global.LEVEL_SONGS.size())
26 | $Radio.stream = Global.LEVEL_SONGS[current_track]
27 | $Radio.play()
28 |
29 | NetworkBridge.n_rpc(self, "change_track", [current_track])
30 | else:
31 | NetworkBridge.n_rpc(self, "player_use")
32 |
33 | master func get_track(id):
34 | NetworkBridge.n_rpc(self, "change_track", [current_track])
35 |
36 | puppet func change_track(id, recivedTrack):
37 | $Radio.stream = Global.LEVEL_SONGS[recivedTrack]
38 | $Radio.play()
39 |
--------------------------------------------------------------------------------
/effects/fake_Fire.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=5 format=2]
2 |
3 | [ext_resource path="res://Materials/Fire.tres" type="Material" id=2]
4 | [ext_resource path="res://Entities/Particles/fire.tres" type="Material" id=3]
5 |
6 | [sub_resource type="GDScript" id=3]
7 | script/source = "extends Spatial
8 |
9 | onready var NetworkBridge = Global.get_node(\"Multiplayer/NetworkBridge\")
10 |
11 | func _ready():
12 | NetworkBridge.register_rpcs(self,[
13 | [\"_set_transform\", NetworkBridge.PERMISSION.SERVER],
14 | [\"_delete\", NetworkBridge.PERMISSION.SERVER]
15 | ])
16 |
17 | puppet func _set_transform(id, recivedTransform):
18 | global_transform = recivedTransform
19 |
20 | puppet func _delete(id):
21 | hide()
22 | global_translation = Vector3(-1000, -1000, -1000)
23 |
24 | set_process(false)
25 | set_physics_process(false)
26 | "
27 |
28 | [sub_resource type="QuadMesh" id=2]
29 |
30 | [node name="Fire" type="Spatial"]
31 | script = SubResource( 3 )
32 |
33 | [node name="Particles" type="Particles" parent="."]
34 | transform = Transform( 0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0 )
35 | material_override = ExtResource( 2 )
36 | emitting = false
37 | fixed_fps = 30
38 | fract_delta = false
39 | process_material = ExtResource( 3 )
40 | draw_pass_1 = SubResource( 2 )
41 |
--------------------------------------------------------------------------------
/BloodParticles.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=7 format=2]
2 |
3 | [ext_resource path="res://Textures/Decals/blood2.png" type="Texture" id=1]
4 |
5 | [sub_resource type="Curve" id=1]
6 | _data = [ Vector2( 0, 1 ), 0.0, 0.0, 0, 0, Vector2( 1, 0 ), 0.0, 0.0, 0, 0 ]
7 |
8 | [sub_resource type="CurveTexture" id=2]
9 | curve = SubResource( 1 )
10 |
11 | [sub_resource type="ParticlesMaterial" id=3]
12 | lifetime_randomness = 0.2
13 | direction = Vector3( 0, 1, 0 )
14 | spread = 180.0
15 | initial_velocity = 2.0
16 | initial_velocity_random = 0.3
17 | angular_velocity = 5.0
18 | angular_velocity_random = 0.38
19 | linear_accel = 5.0
20 | radial_accel = 5.0
21 | scale = 1.5
22 | scale_curve = SubResource( 2 )
23 |
24 | [sub_resource type="SpatialMaterial" id=4]
25 | flags_transparent = true
26 | flags_unshaded = true
27 | params_billboard_mode = 3
28 | particles_anim_h_frames = 1
29 | particles_anim_v_frames = 1
30 | particles_anim_loop = false
31 | albedo_texture = ExtResource( 1 )
32 |
33 | [sub_resource type="QuadMesh" id=5]
34 | material = SubResource( 4 )
35 |
36 | [node name="BloodParticles" type="Particles"]
37 | emitting = false
38 | amount = 16
39 | lifetime = 0.75
40 | one_shot = true
41 | explosiveness = 1.0
42 | process_material = SubResource( 3 )
43 | draw_pass_1 = SubResource( 5 )
44 |
--------------------------------------------------------------------------------
/effects/fake_explosion.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=6 format=2]
2 |
3 | [ext_resource path="res://Entities/Particles/Explosion_Green1.tscn" type="PackedScene" id=2]
4 | [ext_resource path="res://Sfx/WeaponsPickups/Rocket launcher/missile_explosion.wav" type="AudioStream" id=3]
5 |
6 | [sub_resource type="GDScript" id=4]
7 | script/source = "extends Spatial
8 |
9 | func _ready():
10 | $Particle.emitting = true
11 | $Sound.play()
12 |
13 | func delete():
14 | queue_free()
15 | "
16 |
17 | [sub_resource type="SpatialMaterial" id=2]
18 | albedo_color = Color( 1, 0.352941, 0, 1 )
19 |
20 | [sub_resource type="SphereMesh" id=3]
21 | material = SubResource( 2 )
22 | radius = 1.967
23 | height = 4.081
24 |
25 | [node name="Explosion" type="Spatial"]
26 | script = SubResource( 4 )
27 |
28 | [node name="Timer" type="Timer" parent="."]
29 | one_shot = true
30 | autostart = true
31 |
32 | [node name="MeshInstance" type="MeshInstance" parent="."]
33 | visible = false
34 | mesh = SubResource( 3 )
35 |
36 | [node name="Particle" parent="." instance=ExtResource( 2 )]
37 |
38 | [node name="Sound" type="AudioStreamPlayer3D" parent="."]
39 | stream = ExtResource( 3 )
40 | unit_size = 20.0
41 | max_db = 2.0
42 | autoplay = true
43 | bus = "SFX"
44 |
45 | [connection signal="timeout" from="Timer" to="." method="delete"]
46 |
--------------------------------------------------------------------------------
/player_model/player_anim_example.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var anim_tree = $"../anim_tree"
4 |
5 | func _ready():
6 | ### UPPER BODY
7 | #set look direction. -1 = straight up, 0 = forward, 1 = straight down
8 | anim_tree.set("parameters/LOOK_DIRECTION/blend_amount", 0.0)
9 | #set arm animation. -1 = Phone, 0 = None, 1 = Aiming Gun
10 | anim_tree.set("parameters/ARMS_BLEND/blend_amount", 1.0)
11 |
12 | ### LOWER BODY
13 | #set leg movement type. 0 = Standing, 1 = Crouching
14 | anim_tree.set("parameters/MOVE_BLEND/blend_amount", 0.0)
15 | #set crouch speed. 0 = Not moving, 1 = max speed
16 | anim_tree.set("parameters/CROUCHMOVE_AMOUNT/blend_amount", 1.0)
17 | #set run speed. 0 = Not moving, 1 = max speed
18 | anim_tree.set("parameters/STANDMOVE_AMOUNT/blend_amount", 1.0)
19 | #set run direction (optional). -1 = running left, 0 = running forward, 1 = running right
20 | anim_tree.set("parameters/RUN_DIRECTION/blend_amount", 0.0)
21 | #special legs animation. 0 = None, -1 = Sitting, 1 = Jumping
22 | anim_tree.set("parameters/LEGS_BLEND/blend_amount", 0.0)
23 |
24 | ### ONE SHOT ANIMATIONS
25 | #trigger death 1
26 | anim_tree.set("parameters/DEATH1/active", false)
27 | #trigger death 2
28 | anim_tree.set("parameters/DEATH2/active", false)
29 | #trigger kick
30 | anim_tree.set("parameters/KICK/active", false)
31 |
32 |
--------------------------------------------------------------------------------
/remaped/Generic_Shell.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=7 format=2]
2 |
3 | [ext_resource path="res://MOD_CONTENT/CruS Online/shell_physics.gd" type="Script" id=1]
4 | [ext_resource path="res://Imported_Mesh/Generic_Shell.glb" type="PackedScene" id=2]
5 | [ext_resource path="res://Sfx/WeaponsPickups/ammo_shell_1.wav" type="AudioStream" id=3]
6 | [ext_resource path="res://Sfx/WeaponsPickups/ammo_shell_2.wav" type="AudioStream" id=4]
7 | [ext_resource path="res://Sfx/WeaponsPickups/ammo_shell_3.wav" type="AudioStream" id=5]
8 |
9 | [sub_resource type="CylinderShape" id=1]
10 | height = 0.06
11 | radius = 0.01
12 |
13 | [node name="Shell" type="KinematicBody"]
14 | collision_layer = 0
15 | script = ExtResource( 1 )
16 |
17 | [node name="CollisionShape" type="CollisionShape" parent="."]
18 | shape = SubResource( 1 )
19 |
20 | [node name="Sound1" type="AudioStreamPlayer3D" parent="."]
21 | stream = ExtResource( 3 )
22 | bus = "SFX"
23 |
24 | [node name="Sound2" type="AudioStreamPlayer3D" parent="."]
25 | stream = ExtResource( 4 )
26 | bus = "SFX"
27 |
28 | [node name="Sound3" type="AudioStreamPlayer3D" parent="."]
29 | stream = ExtResource( 5 )
30 | bus = "SFX"
31 |
32 | [node name="Generic_Shell" parent="." instance=ExtResource( 2 )]
33 |
34 | [node name="Remove" type="Timer" parent="."]
35 | wait_time = 15.0
36 | one_shot = true
37 | autostart = true
38 |
39 | [connection signal="timeout" from="Remove" to="." method="remove"]
40 |
--------------------------------------------------------------------------------
/remaped/soulll.gd:
--------------------------------------------------------------------------------
1 | extends Area
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var soul = true
6 | var gib = preload("res://Entities/Physics_Objects/Chest_Gib.tscn")
7 |
8 | func _ready():
9 | NetworkBridge.register_rpcs(self, [
10 | ["spawn_gib", NetworkBridge.PERMISSION.ALL]
11 | ])
12 |
13 | func player_use():
14 | if soul:
15 | Global.set_soul()
16 | else :
17 | Global.set_hope()
18 | Global.player.suicide()
19 | Global.save_game()
20 | get_parent().get_node("MeshInstance").hide()
21 | if not soul:
22 | for i in range(10):
23 | var new_gib = gib.instance()
24 | new_gib.set_name(new_gib.name + "#" + str(new_gib.get_instance_id()))
25 | get_parent().get_parent().add_child(new_gib)
26 | new_gib.global_transform.origin = global_transform.origin
27 | new_gib.damage(20, Vector3.FORWARD.rotated(Vector3.UP, rand_range( - PI, PI)), global_transform.origin, global_transform.origin)
28 | NetworkBridge.n_rpc(self, "spawn_gib", [get_parent().get_parent().get_path(), new_gib.name])
29 | get_parent().get_node("AudioStreamPlayer3D").play()
30 | queue_free()
31 | return
32 | get_parent().get_node("Particles").emitting = true
33 | get_parent().get_node("AudioStreamPlayer3D").play()
34 | queue_free()
35 |
36 | master func spawn_gib(id, recivedPath, recivedName):
37 | var new_gib = gib.instance()
38 | get_node(recivedPath).add_child(new_gib)
39 | new_gib.set_name(recivedName)
40 |
--------------------------------------------------------------------------------
/entities/material_randomizer.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export (Array, String) var materials
6 | export var head_only = false
7 | export var cutscene = false
8 | onready var anim = $AnimationPlayer
9 |
10 | var materialId = 0
11 |
12 | puppet func set_material(id, recived_material_id, head_only_recived):
13 | var material = load(materials[recived_material_id])
14 | $Armature / Skeleton / Head_Mesh.material_override = material
15 | if not head_only_recived:
16 | $Armature / Skeleton / Torso_Mesh.material_override = material
17 |
18 | master func get_material(id):
19 | NetworkBridge.n_rpc_id(self, id, "set_material", [materialId, head_only])
20 |
21 | func _ready():
22 | NetworkBridge.register_rpcs(self,[
23 | ["get_material", NetworkBridge.PERMISSION.ALL],
24 | ["set_material", NetworkBridge.PERMISSION.SERVER]
25 | ])
26 |
27 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
28 | materialId = randi() % materials.size()
29 | var material = load(materials[materialId])
30 | $Armature / Skeleton / Head_Mesh.material_override = material
31 | if not head_only:
32 | $Armature / Skeleton / Torso_Mesh.material_override = material
33 | else:
34 | NetworkBridge.n_rpc_id(self, 0, "get_material")
35 |
36 | func _process(delta):
37 | if not cutscene:
38 | return
39 | set_process(false)
40 | translate(Vector3.FORWARD * delta)
41 | anim.play("Walk")
42 |
--------------------------------------------------------------------------------
/remaped/Shell.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=7 format=2]
2 |
3 | [ext_resource path="res://MOD_CONTENT/CruS Online/shell_physics.gd" type="Script" id=1]
4 | [ext_resource path="res://Imported_Mesh/Shotgun_Shell.glb" type="PackedScene" id=2]
5 | [ext_resource path="res://Entities/Physics_Objects/flesh_sound.tscn" type="PackedScene" id=3]
6 | [ext_resource path="res://Sfx/WeaponsPickups/ammo_shell_2.wav" type="AudioStream" id=4]
7 | [ext_resource path="res://Sfx/WeaponsPickups/ammo_shell_3.wav" type="AudioStream" id=5]
8 |
9 | [sub_resource type="CylinderShape" id=1]
10 | height = 0.06
11 | radius = 0.01
12 |
13 | [node name="Shell" type="KinematicBody"]
14 | collision_layer = 0
15 | script = ExtResource( 1 )
16 |
17 | [node name="CollisionShape" type="CollisionShape" parent="."]
18 | shape = SubResource( 1 )
19 |
20 | [node name="Shotgun_Shell" parent="." instance=ExtResource( 2 )]
21 |
22 | [node name="Sound1" parent="." instance=ExtResource( 3 )]
23 | stream = ExtResource( 4 )
24 | unit_db = 0.0
25 | unit_size = 2.0
26 | max_db = 0.0
27 | pitch_scale = 0.76
28 |
29 | [node name="Sound2" type="AudioStreamPlayer3D" parent="."]
30 | stream = ExtResource( 4 )
31 | bus = "SFX"
32 |
33 | [node name="Sound3" type="AudioStreamPlayer3D" parent="."]
34 | stream = ExtResource( 5 )
35 | bus = "SFX"
36 |
37 | [node name="Remove" type="Timer" parent="."]
38 | wait_time = 15.0
39 | one_shot = true
40 | autostart = true
41 |
42 | [connection signal="timeout" from="Remove" to="." method="remove"]
43 |
--------------------------------------------------------------------------------
/Players.gd:
--------------------------------------------------------------------------------
1 | extends Node
2 |
3 | onready var parent = get_parent()
4 |
5 | func load_players():
6 | print("[CRUS ONLINE / PLAYERS]: Load players")
7 |
8 | reload_players()
9 |
10 | var puppetsNames = []
11 | for puppetNode in get_children():
12 | puppetsNames.append(int(puppetNode.name))
13 |
14 | for key in parent.players.keys():
15 | if not puppetsNames.has(key):
16 | var player = preload("res://MOD_CONTENT/CruS Online/multiplayer_player.tscn").instance()
17 | player.set_name(key)
18 | player.set_network_master(key)
19 | player.setup_puppet(key)
20 | player.nickname = parent.players[key].nickname
21 | player.skinPath = parent.players[key].skinPath
22 | player.color = parent.players[key].color
23 | player.singleton = parent
24 | add_child(player)
25 | parent.players[key]["puppet"] = player
26 | player.global_transform.origin = Vector3(-1000,-1000,-1000)
27 | player.transform_lerp.origin = Vector3(-1000,-1000,-1000)
28 |
29 | func reload_players():
30 | print("[CRUS ONLINE / PLAYERS]: Reload players")
31 | for player in get_children():
32 | player.player_restart()
33 |
34 | func remove_players():
35 | print("[CRUS ONLINE / PLAYERS]: Remove players")
36 | for player in get_children():
37 | player.queue_free()
38 |
39 | func sync_players():
40 | print("[CRUS ONLINE / PLAYERS]: Sync players")
41 | print(get_children())
42 |
43 | for player in get_children():
44 | if parent.players[player.name] == null:
45 | player.queue_free()
46 |
--------------------------------------------------------------------------------
/shell_physics.gd:
--------------------------------------------------------------------------------
1 | extends KinematicBody
2 |
3 | var velocity = Vector3.ZERO
4 | var angular_velocity
5 |
6 | var water : bool
7 | var gravity = 22
8 |
9 | var impact_sound : Array
10 |
11 | func _ready():
12 | impact_sound = [
13 | $Sound1,
14 | $Sound2,
15 | $Sound3
16 | ]
17 |
18 | func _physics_process(delta):
19 | var collision = move_and_collide(velocity * delta)
20 |
21 | global_rotation += angular_velocity
22 |
23 | if water:
24 | gravity = 2
25 | else :
26 | gravity = 22
27 |
28 | if collision:
29 | velocity = velocity.bounce(collision.normal) * 0.6
30 |
31 | if abs(velocity.length()) > 2:
32 | var current_sound = randi() % 3
33 |
34 | impact_sound[current_sound].pitch_scale += rand_range( - 0.1, 0.1)
35 | impact_sound[current_sound].pitch_scale = clamp(impact_sound[current_sound].pitch_scale, 0.8, 1.2)
36 | impact_sound[current_sound].unit_db = velocity.length() * 0.1 - 1
37 | impact_sound[current_sound].play()
38 |
39 | velocity.y -= gravity * delta
40 | angular_velocity = lerp(angular_velocity, Vector3.ZERO, delta * 2)
41 |
42 | func damage(damage, collision_n, collision_p, shooter_pos):
43 | if damage < 3:
44 | return
45 | velocity -= collision_n * damage
46 |
47 | angular_velocity = Vector3(rand_range(1,5),rand_range(1,5),rand_range(1,5))
48 |
49 | func remove():
50 | var tween = create_tween().set_trans(Tween.TRANS_QUINT).set_ease(Tween.EASE_IN)
51 | tween.tween_property(self,"scale",Vector3.ZERO,1)
52 |
53 | yield(tween,"finished")
54 | queue_free()
55 |
--------------------------------------------------------------------------------
/Stats.gd:
--------------------------------------------------------------------------------
1 | extends PanelContainer
2 |
3 | onready var Multiplayer = Global.get_node("Multiplayer")
4 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
5 |
6 | onready var playersList = $VBoxContainer/PanelContainer/RichTextLabel
7 |
8 | var sizeRatio = 16
9 |
10 | func _ready():
11 | hide()
12 |
13 | func set_size_ratio():
14 | sizeRatio = 16 * (Global.resolution[0] / 1280)
15 |
16 | $VBoxContainer/PanelContainer/RichTextLabel.get_font("normal_font").size = sizeRatio
17 | $VBoxContainer/Label.get_font("font").size = sizeRatio
18 |
19 | func open_stats(type):
20 | show()
21 | set_size_ratio()
22 | $"../OpenStats".button_disable()
23 | $"../CloseStats".button_enable()
24 |
25 | func close_stats(type):
26 | hide()
27 | $"../OpenStats".button_enable()
28 | $"../CloseStats".button_disable()
29 |
30 | var tick = 0
31 |
32 | func _physics_process(delta):
33 | if visible and $"..".visible:
34 | tick += 1
35 | if tick % 15 == 0:
36 | var playerNumber = 1
37 | playersList.bbcode_text = ""
38 |
39 | for player in Multiplayer.players:
40 | playersList.bbcode_text += str(playerNumber) + ": [color=#" + Multiplayer.players[player].color + "]" + Multiplayer.players[player].nickname + "[/color]"
41 |
42 | if player == NetworkBridge.get_host_id():
43 | playersList.bbcode_text += " (host)\n"
44 | else:
45 | playersList.bbcode_text += "\n"
46 |
47 | playerNumber += 1
48 |
49 | $VBoxContainer/PanelContainer/RichTextLabel.text += player.nickname
50 |
51 | print(playersList.bbcode_text)
52 | tick = 0
53 |
--------------------------------------------------------------------------------
/help.txt.gd:
--------------------------------------------------------------------------------
1 | extends Node # extends my balls
2 |
3 | # TODO: Не забыть убрать весь этот мусор...
4 |
5 | # Desine sperare qui hic intras
6 |
7 | var frustration_count = 312
8 |
9 | # https://datatracker.ietf.org/doc/html/rfc2795
10 |
11 | var objectInstance
12 |
13 | func sync_object_spawn(objectParent):
14 | var object = objectInstance.instance()
15 | object.set_name(object.name + "#" + str(object.get_instance_id()))
16 | objectParent.add_child(object)
17 | rpc("_spawn_object", objectParent.get_path(), object.name, object.global_transform)
18 |
19 | puppet func _spawn_object(parentPath, recivedName, recivedTransform):
20 | var object = objectInstance.instance()
21 | object.set_name(recivedName)
22 | get_node(parentPath).add_child(object)
23 | object.global_transform = recivedTransform
24 |
25 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
26 |
27 | func _ready():
28 | NetworkBridge.register_rpcs(self, [
29 | ["_ass", NetworkBridge.PERMISSION.ALL],
30 | ["ass", NetworkBridge.PERMISSION.SERVER]
31 | ])
32 |
33 | # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
34 |
35 | # 9 + 10 = 21
36 | # ^ you are stupid
37 |
--------------------------------------------------------------------------------
/remaped/Player_Manager.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var player = $Player
4 | onready var cam_pos = $Position3D
5 |
6 | func _ready():
7 | if Global.implants.head_implant.shrink:
8 | scale = Vector3(0.1, 0.1, 0.1)
9 |
10 | var respawnPoint = load("res://MOD_CONTENT/CruS Online/respawn_point.tscn").instance()
11 | get_node("..").call_deferred("add_child", respawnPoint)
12 | respawnPoint.global_transform.origin = self.global_transform.origin
13 |
14 | var respawnPoints = get_tree().get_nodes_in_group("Respawn")
15 | respawnPoints.shuffle()
16 |
17 | player.global_transform.origin = respawnPoints[0].global_transform.origin
18 | player.global_rotation.y = respawnPoints[0].global_rotation.y
19 |
20 | func _process(delta):
21 | if Input.is_action_just_pressed("Stocks"):
22 | $Stock_Menu.visible = not $Stock_Menu.visible
23 | if $Stock_Menu.visible:
24 | Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
25 | $Position3D / Rotation_Helper / Weapon.disabled = true
26 | else :
27 | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
28 | $Position3D / Rotation_Helper / Weapon.disabled = false
29 | var offset = Vector3(0, 1.481, 0)
30 | if Global.implants.head_implant.shrink:
31 | offset *= 0.1
32 | if player.max_gravity < 0:
33 | offset = Vector3(0, 0, 0)
34 | if Engine.get_frames_per_second() <= 30:
35 | cam_pos.global_transform.origin = player.global_transform.origin + offset
36 | else :
37 | cam_pos.global_transform.origin = lerp(cam_pos.global_transform.origin, player.global_transform.origin + offset, clamp(delta * 30, 0, 1))
38 |
39 | cam_pos.rotation.y = player.rotation.y
40 |
--------------------------------------------------------------------------------
/remaped/Player_Test.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=5 format=2]
2 |
3 | [ext_resource path="res://Entities/Player.tscn" type="PackedScene" id=1]
4 | [ext_resource path="res://Player_Manager.gd" type="Script" id=2]
5 | [ext_resource path="res://Entities/Rotation_Helper.tscn" type="PackedScene" id=3]
6 | [ext_resource path="res://Menu/Stock_Menu2.tscn" type="PackedScene" id=4]
7 |
8 | [node name="Player" type="Spatial"]
9 | script = ExtResource( 2 )
10 |
11 | [node name="Player" parent="." groups=["Player"] instance=ExtResource( 1 )]
12 | interpolated_camera = true
13 |
14 | [node name="BoneAttachment" parent="Player/Body_Mesh/Armature/Skeleton" index="0"]
15 | transform = Transform( 0.999961, 0.000690037, 0.00876781, 0.000670931, 0.988027, -0.154278, -0.0087693, 0.154278, 0.987988, 0.000147821, 0.615141, 0.0506348 )
16 |
17 | [node name="BoneAttachment 2" parent="Player/Body_Mesh/Armature/Skeleton" index="1"]
18 | transform = Transform( -0.0871775, 0.91109, 0.402883, -0.166965, -0.412065, 0.895726, 0.982101, 0.0108198, 0.188043, 0.696529, 0.397017, 0.0232771 )
19 |
20 | [node name="Position3D" type="Position3D" parent="."]
21 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.481, 0 )
22 |
23 | [node name="Rotation_Helper" parent="Position3D" instance=ExtResource( 3 )]
24 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
25 |
26 | [node name="Camera" parent="Position3D/Rotation_Helper" index="1"]
27 | cull_mask = 1048567
28 |
29 | [node name="Stock_Menu" parent="." instance=ExtResource( 4 )]
30 | visible = false
31 |
32 | [editable path="Player"]
33 | [editable path="Player/Body_Mesh"]
34 | [editable path="Position3D/Rotation_Helper"]
35 | [editable path="Stock_Menu"]
36 |
--------------------------------------------------------------------------------
/entities/Enemy_Melee_Weapon.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var damage:float = 75
6 | export var toxic = false
7 | onready var raycast:RayCast = $RayCast
8 | export var velocity_booster = false
9 |
10 | func _ready():
11 | NetworkBridge.register_rpcs(self,[
12 | ["play_sound", NetworkBridge.PERMISSION.SERVER],
13 | ])
14 |
15 | puppet func play_sound(id):
16 | $Attack_Sound.play()
17 |
18 | func AI_shoot()->void :
19 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
20 | if raycast.is_colliding():
21 | if raycast.get_collider().name == "Player" or raycast.get_collider().has_meta("puppet"):
22 | if velocity_booster:
23 | Global.player.player_velocity -= (global_transform.origin - Vector3.UP * 0.5 - Global.player.global_transform.origin).normalized() * damage
24 | var collider = raycast.get_collider()
25 | raycast.force_raycast_update()
26 | if toxic and collider.has_method("set_toxic"):
27 | collider.set_toxic()
28 | if collider.has_method("damage"):
29 | collider.damage(damage, Vector3(0, 0, 0), Vector3(0, 0, 0), global_transform.origin)
30 | raycast.enabled = false
31 | if is_instance_valid($Attack_Sound) and not $Attack_Sound.playing:
32 | $Attack_Sound.play()
33 | NetworkBridge.n_rpc(self, "play_sound")
34 | if get_parent().get_parent().anim_player.current_animation != "Attack":
35 | get_parent().get_parent().anim_player.play("Attack", - 1, 2)
36 | NetworkBridge.n_rpc(get_parent().get_parent(), "set_animation", "Attack", 2)
37 | yield (get_tree().create_timer(0.5), "timeout")
38 | raycast.enabled = true
39 |
--------------------------------------------------------------------------------
/remaped/20_mm_shell.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=9 format=2]
2 |
3 | [ext_resource path="res://MOD_CONTENT/CruS Online/shell_physics.gd" type="Script" id=1]
4 | [ext_resource path="res://Imported_Mesh/20mmshell.obj" type="ArrayMesh" id=2]
5 | [ext_resource path="res://Sfx/WeaponsPickups/ammo_shell_1.wav" type="AudioStream" id=3]
6 | [ext_resource path="res://Sfx/WeaponsPickups/ammo_shell_2.wav" type="AudioStream" id=4]
7 | [ext_resource path="res://Sfx/WeaponsPickups/ammo_shell_3.wav" type="AudioStream" id=5]
8 | [ext_resource path="res://Textures/Particles/Generic_Shell.png" type="Texture" id=6]
9 |
10 | [sub_resource type="CylinderShape" id=1]
11 | height = 0.255391
12 | radius = 0.0372182
13 |
14 | [sub_resource type="SpatialMaterial" id=2]
15 | albedo_texture = ExtResource( 6 )
16 |
17 | [node name="Shell" type="KinematicBody"]
18 | collision_layer = 0
19 | script = ExtResource( 1 )
20 |
21 | [node name="CollisionShape" type="CollisionShape" parent="."]
22 | shape = SubResource( 1 )
23 |
24 | [node name="Sound1" type="AudioStreamPlayer3D" parent="."]
25 | stream = ExtResource( 3 )
26 | bus = "SFX"
27 |
28 | [node name="Sound2" type="AudioStreamPlayer3D" parent="."]
29 | stream = ExtResource( 4 )
30 | bus = "SFX"
31 |
32 | [node name="Sound3" type="AudioStreamPlayer3D" parent="."]
33 | stream = ExtResource( 5 )
34 | bus = "SFX"
35 |
36 | [node name="Generic_Shell" type="Spatial" parent="."]
37 |
38 | [node name="Shell" type="MeshInstance" parent="Generic_Shell"]
39 | material_override = SubResource( 2 )
40 | mesh = ExtResource( 2 )
41 |
42 | [node name="Remove" type="Timer" parent="."]
43 | wait_time = 15.0
44 | one_shot = true
45 | autostart = true
46 |
47 | [connection signal="timeout" from="Remove" to="." method="remove"]
48 |
--------------------------------------------------------------------------------
/effects/fake_Radiation.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=7 format=2]
2 |
3 | [sub_resource type="SpatialMaterial" id=1]
4 | flags_transparent = true
5 | params_blend_mode = 2
6 | albedo_color = Color( 1, 0.47451, 0.356863, 0.0862745 )
7 | metallic_specular = 0.0
8 | transmission_enabled = true
9 | transmission = Color( 1, 0, 0, 1 )
10 |
11 | [sub_resource type="Curve" id=2]
12 | max_value = 1.98
13 | _data = [ Vector2( 0, 0 ), 0.0, 0.0, 0, 0, Vector2( 0.533679, 1.90578 ), 0.0, 0.0, 0, 0, Vector2( 1, 0 ), 0.0, 0.0, 0, 0 ]
14 |
15 | [sub_resource type="CurveTexture" id=3]
16 | curve = SubResource( 2 )
17 |
18 | [sub_resource type="ParticlesMaterial" id=4]
19 | emission_shape = 1
20 | emission_sphere_radius = 1.89
21 | spread = 180.0
22 | gravity = Vector3( 0, 0, 0 )
23 | initial_velocity = 0.29
24 | scale_curve = SubResource( 3 )
25 |
26 | [sub_resource type="SphereMesh" id=5]
27 | radial_segments = 4
28 | rings = 4
29 |
30 | [sub_resource type="GDScript" id=6]
31 | script/source = "extends Particles
32 |
33 | onready var NetworkBridge = Global.get_node(\"Multiplayer/NetworkBridge\")
34 |
35 | func _ready():
36 | NetworkBridge.register_rpcs(self,[
37 | [\"_set_transform\", NetworkBridge.PERMISSION.SERVER],
38 | [\"_delete\", NetworkBridge.PERMISSION.SERVER],
39 | ])
40 |
41 | puppet func _set_transform(id, recivedTransform):
42 | global_transform = recivedTransform
43 |
44 | puppet func _delete(id):
45 | hide()
46 | global_translation = Vector3(-1000, -1000, -1000)
47 |
48 | set_process(false)
49 | set_physics_process(false)
50 | "
51 |
52 | [node name="Particles" type="Particles"]
53 | material_override = SubResource( 1 )
54 | amount = 4
55 | lifetime = 3.27
56 | preprocess = 1.0
57 | process_material = SubResource( 4 )
58 | draw_pass_1 = SubResource( 5 )
59 | script = SubResource( 6 )
60 |
--------------------------------------------------------------------------------
/effects/fake_Missile_Kinematic.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=4 format=2]
2 |
3 | [ext_resource path="res://Entities/Particles/Smoke_1.tscn" type="PackedScene" id=2]
4 | [ext_resource path="res://Sfx/WeaponsPickups/Rocket launcher/missile_flying_loop.wav" type="AudioStream" id=3]
5 |
6 | [sub_resource type="GDScript" id=1]
7 | script/source = "extends Spatial
8 |
9 | onready var NetworkBridge = Global.get_node(\"Multiplayer/NetworkBridge\")
10 |
11 | func _ready():
12 | NetworkBridge.register_rpcs(self,[
13 | [\"_set_transform\", NetworkBridge.PERMISSION.SERVER],
14 | [\"_delete\", NetworkBridge.PERMISSION.SERVER],
15 | [\"_create_object\", NetworkBridge.PERMISSION.SERVER]
16 | ])
17 |
18 |
19 | puppet func _set_transform(id, recivedTransform):
20 | global_transform = recivedTransform
21 |
22 | puppet func _delete(id):
23 | hide()
24 | global_translation = Vector3(-1000, -1000, -1000)
25 |
26 | set_process(false)
27 | set_physics_process(false)
28 |
29 | puppet func _create_object(id, recivedPath, recivedObject, recivedName, recivedTransform, recivedShrapnel = null):
30 | var newObject = load(recivedObject).instance()
31 | newObject.set_name(recivedName)
32 | get_node(recivedPath).add_child(newObject)
33 | newObject.global_transform = recivedTransform
34 | if recivedShrapnel != null:
35 | newObject.shrapnel_flag = recivedShrapnel
36 | "
37 |
38 | [node name="Spatial" type="Spatial"]
39 | script = SubResource( 1 )
40 |
41 | [node name="Smoke_Particle" parent="." instance=ExtResource( 2 )]
42 | transform = Transform( 0.123153, 0, 0, 0, 0.123153, 0, 0, 0, 0.123153, 0.00448698, 0, 0 )
43 | lifetime = 7.54
44 | speed_scale = 8.53
45 | fixed_fps = 30
46 |
47 | [node name="Sound" type="AudioStreamPlayer3D" parent="."]
48 | stream = ExtResource( 3 )
49 | unit_size = 8.2
50 | max_db = 1.956
51 | autoplay = true
52 | bus = "SFX"
53 |
--------------------------------------------------------------------------------
/Menu.gd:
--------------------------------------------------------------------------------
1 | extends Control
2 |
3 | onready var NetworkBridge = $"../NetworkBridge"
4 |
5 | onready var parent = get_parent()
6 |
7 | func _ready():
8 | rect_scale = Vector2(Global.resolution[0] / 1280 ,Global.resolution[1] / 720 )
9 | hide()
10 | set_process_input(false)
11 |
12 | func hide_menu(type = null):
13 | hide()
14 | get_parent().Hint.hide()
15 | Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
16 | Global.player.weapon.disabled = false
17 |
18 | Global.player.set_process(true)
19 | Global.player.set_physics_process(true)
20 | Global.player.set_process_input(true)
21 | Global.player.set_process_unhandled_key_input(true)
22 |
23 | func show_menu(type = null):
24 | rect_scale = Vector2(Global.resolution[0] / 1280 ,Global.resolution[1] / 720 )
25 | show()
26 | Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
27 | Global.player.weapon.disabled = true
28 |
29 | Global.player.set_process(false)
30 | Global.player.set_physics_process(false)
31 | Global.player.set_process_input(false)
32 | Global.player.set_process_unhandled_key_input(false)
33 |
34 | func _input(event):
35 | if Input.is_action_just_pressed("ui_cancel"):
36 | if visible:
37 | hide_menu()
38 | else:
39 | show_menu()
40 |
41 | func leave_server(type):
42 | hide_menu()
43 | set_process_input(false)
44 | Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
45 |
46 | if NetworkBridge.n_is_network_master(self):
47 | parent.goto_menu_host()
48 | else:
49 | for child in parent.Players.get_children():
50 | child.queue_free()
51 |
52 | parent.goto_menu_client(null)
53 | parent.leave_server()
54 |
55 | func leave_game(type):
56 | hide_menu()
57 | set_process_input(false)
58 | Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
59 |
60 | for child in parent.Players.get_children():
61 | child.queue_free()
62 |
63 | parent.leave_server()
64 | get_tree().quit()
65 |
--------------------------------------------------------------------------------
/effects/fake_self_destruct_explosion.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=8 format=2]
2 |
3 | [ext_resource path="res://Textures/Particles/Explosion1.png" type="Texture" id=1]
4 |
5 | [sub_resource type="GDScript" id=9]
6 | script/source = "extends Spatial
7 |
8 | func _ready():
9 | $Particle.emitting = true
10 |
11 | func delete():
12 | queue_free()
13 | "
14 |
15 | [sub_resource type="Curve" id=4]
16 | _data = [ Vector2( 0, 1 ), 0.0, 0.0, 0, 0, Vector2( 1, 1 ), 0.0, 0.0, 0, 0 ]
17 |
18 | [sub_resource type="CurveTexture" id=5]
19 | curve = SubResource( 4 )
20 |
21 | [sub_resource type="ParticlesMaterial" id=6]
22 | lifetime_randomness = 0.09
23 | trail_divisor = 6
24 | trail_size_modifier = SubResource( 5 )
25 | emission_shape = 1
26 | emission_sphere_radius = 0.82
27 | flag_rotate_y = true
28 | direction = Vector3( 0, 1, 0 )
29 | spread = 180.0
30 | gravity = Vector3( 0, 0, 0 )
31 | initial_velocity = 24.95
32 | initial_velocity_random = 0.34
33 | scale = 5.22
34 | scale_random = 0.21
35 |
36 | [sub_resource type="SpatialMaterial" id=7]
37 | flags_unshaded = true
38 | params_blend_mode = 1
39 | params_billboard_mode = 1
40 | params_billboard_keep_scale = true
41 | params_use_alpha_scissor = true
42 | params_alpha_scissor_threshold = 0.98
43 | albedo_color = Color( 0.152941, 0.898039, 0, 1 )
44 | albedo_texture = ExtResource( 1 )
45 |
46 | [sub_resource type="QuadMesh" id=8]
47 | material = SubResource( 7 )
48 |
49 | [node name="Explosion" type="Spatial"]
50 | script = SubResource( 9 )
51 |
52 | [node name="Particle" type="Particles" parent="."]
53 | emitting = false
54 | amount = 200
55 | lifetime = 0.28
56 | one_shot = true
57 | randomness = 1.0
58 | fract_delta = false
59 | local_coords = false
60 | process_material = SubResource( 6 )
61 | draw_pass_1 = SubResource( 8 )
62 |
63 | [node name="Timer" type="Timer" parent="."]
64 | wait_time = 5.0
65 | one_shot = true
66 | autostart = true
67 |
68 | [connection signal="timeout" from="Timer" to="." method="delete"]
69 |
--------------------------------------------------------------------------------
/effects/fake_Grenade.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=5 format=2]
2 |
3 | [ext_resource path="res://Textures/Weapons/Gas_Launcher.png" type="Texture" id=2]
4 | [ext_resource path="res://Imported_Mesh/Weapon_Mesh_Only/Gas_Grenade.obj" type="ArrayMesh" id=4]
5 |
6 | [sub_resource type="GDScript" id=2]
7 | script/source = "extends KinematicBody
8 |
9 | onready var NetworkBridge = Global.get_node(\"Multiplayer/NetworkBridge\")
10 |
11 | func _ready():
12 | NetworkBridge.register_rpcs(self,[
13 | [\"_set_transform\", NetworkBridge.PERMISSION.SERVER],
14 | [\"_delete\", NetworkBridge.PERMISSION.SERVER],
15 | [\"_spawn_shrapnel\", NetworkBridge.PERMISSION.SERVER],
16 | [\"_create_object\", NetworkBridge.PERMISSION.SERVER]
17 | ])
18 |
19 | puppet func _set_transform(id, recivedTransform):
20 | global_transform = recivedTransform
21 |
22 | puppet func _delete(id):
23 | hide()
24 | global_translation = Vector3(-1000, -1000, -1000)
25 |
26 | set_process(false)
27 | set_physics_process(false)
28 |
29 | puppet func _spawn_shrapnel(id, recivedPath, recivedObject,recivedName,recivedTransform,recivedShrapnel):
30 | var newObject = load(recivedObject).instance()
31 | newObject.set_name(recivedName)
32 | get_node(recivedPath).add_child(newObject)
33 | newObject.global_transform = recivedTransform
34 | newObject.shrapnel_flag = recivedShrapnel
35 |
36 | puppet func _create_object(id, recivedPath, recivedObject, recivedName, recivedTransform):
37 | var newObject = load(recivedObject).instance()
38 | newObject.set_name(recivedName)
39 | get_node(recivedPath).add_child(newObject)
40 | newObject.global_transform = recivedTransform
41 | "
42 |
43 | [sub_resource type="SpatialMaterial" id=1]
44 | albedo_texture = ExtResource( 2 )
45 |
46 | [node name="Spatial" type="KinematicBody"]
47 | collision_layer = 0
48 | collision_mask = 17
49 | collision/safe_margin = 0.002
50 | script = SubResource( 2 )
51 |
52 | [node name="MeshInstance" type="MeshInstance" parent="."]
53 | material_override = SubResource( 1 )
54 | mesh = ExtResource( 4 )
55 |
--------------------------------------------------------------------------------
/Steam.gd:
--------------------------------------------------------------------------------
1 | extends Node
2 |
3 | onready var Multiplayer = Global.get_node("Multiplayer")
4 |
5 | onready var Steam = preload("res://addons/godotsteam/godotsteam.gdns").new()
6 |
7 | var is_on_steam_deck: bool = false
8 | var is_online: bool = false
9 | var is_owned: bool = false
10 | var steam_app_id: int = 1388770
11 | var steam_id: int = 0
12 | var steam_username: String = ""
13 |
14 | onready var SteamNetwork = $SteamNetwork
15 | onready var SteamLobby = $SteamLobby
16 |
17 | func _ready() -> void:
18 | OS.set_environment("SteamAppId", str(steam_app_id))
19 | OS.set_environment("SteamGameId", str(steam_app_id))
20 |
21 | var args = OS.get_cmdline_args()
22 |
23 | if args.size() > 0:
24 | for arg in args:
25 | if arg == "+crus_online_debug_1":
26 | print("[CRUS ONLINE / DEBUG] ipc name: crus_online_debug_1")
27 | OS.set_environment("steam_master_ipc_name_override", "crus_online_debug_1")
28 | elif arg == "+crus_online_debug_2":
29 | print("[CRUS ONLINE / DEBUG] ipc name: crus_online_debug_2")
30 | OS.set_environment("steam_master_ipc_name_override", "crus_online_debug_2")
31 |
32 | var initialize_response = Steam.steamInit()
33 |
34 | print("[CRUS ONLINE / STEAM]\n")
35 |
36 | print("Did Steam initialize?: %s" % initialize_response)
37 |
38 | # if initialize_response['status'] > 0:
39 | # print("Failed to initialize Steam, shutting down: %s" % initialize_response)
40 | # get_tree().quit()
41 |
42 | is_on_steam_deck = Steam.isSteamRunningOnSteamDeck()
43 | is_online = Steam.loggedOn()
44 | is_owned = Steam.isSubscribed()
45 | steam_id = Steam.getSteamID()
46 | steam_username = Steam.getPersonaName()
47 |
48 | print("Is on steam deck?: %s" % is_on_steam_deck)
49 | print("Is online?: %s" % is_online)
50 | print("Is is owned?: %s" % is_owned)
51 | print("Steam ID: %s" % steam_id)
52 | print("Steam Username: %s" % steam_username)
53 |
54 | # Check if account owns the game
55 | if is_owned == false:
56 | print("User does not own this game")
57 | #get_tree().quit()
58 |
59 | print("\n[ CRUS ONLINE / STEAM ]")
60 |
61 | $SteamLobby.lobby_init()
62 |
63 | func _process(_delta: float) -> void:
64 | Steam.run_callbacks()
65 |
--------------------------------------------------------------------------------
/effects/fake_poison_gas.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=9 format=2]
2 |
3 | [ext_resource path="res://Sfx/NPCs/Melee mutant/poison_mist.wav" type="AudioStream" id=1]
4 | [ext_resource path="res://Textures/Particles/Explosion1.png" type="Texture" id=2]
5 |
6 | [sub_resource type="GDScript" id=8]
7 | script/source = "extends Spatial
8 |
9 | func _ready():
10 | $Particle.emitting = true
11 |
12 | func delete():
13 | queue_free()
14 | "
15 |
16 | [sub_resource type="Curve" id=9]
17 | max_value = 1.88
18 | _data = [ Vector2( 0, 0.401649 ), 0.0, 0.0, 0, 0, Vector2( 1, 1.88 ), 0.0, 0.0, 0, 0 ]
19 |
20 | [sub_resource type="CurveTexture" id=5]
21 | curve = SubResource( 9 )
22 |
23 | [sub_resource type="ParticlesMaterial" id=10]
24 | emission_shape = 1
25 | emission_sphere_radius = 1.55
26 | flag_rotate_y = true
27 | direction = Vector3( 0, 1, 0 )
28 | spread = 180.0
29 | gravity = Vector3( 0, 0, 0 )
30 | initial_velocity = 0.59
31 | damping = 0.41
32 | scale = 3.44
33 | scale_curve = SubResource( 5 )
34 |
35 | [sub_resource type="SpatialMaterial" id=7]
36 | flags_transparent = true
37 | flags_unshaded = true
38 | params_blend_mode = 1
39 | params_billboard_mode = 1
40 | params_billboard_keep_scale = true
41 | params_use_alpha_scissor = true
42 | params_alpha_scissor_threshold = 0.98
43 | albedo_color = Color( 0, 0.341176, 0.00392157, 1 )
44 | albedo_texture = ExtResource( 2 )
45 |
46 | [sub_resource type="QuadMesh" id=11]
47 | material = SubResource( 7 )
48 |
49 | [node name="Gas" type="Spatial"]
50 | script = SubResource( 8 )
51 |
52 | [node name="Particle" type="Particles" parent="."]
53 | emitting = false
54 | amount = 58
55 | lifetime = 4.03
56 | one_shot = true
57 | randomness = 1.0
58 | fract_delta = false
59 | local_coords = false
60 | process_material = SubResource( 10 )
61 | draw_pass_1 = SubResource( 11 )
62 |
63 | [node name="Timer" type="Timer" parent="."]
64 | wait_time = 10.0
65 | one_shot = true
66 | autostart = true
67 |
68 | [node name="Sound" type="AudioStreamPlayer3D" parent="."]
69 | stream = ExtResource( 1 )
70 | unit_db = 4.0
71 | unit_size = 6.5
72 | max_db = 4.0
73 | autoplay = true
74 |
75 | [connection signal="timeout" from="Timer" to="." method="delete"]
76 |
--------------------------------------------------------------------------------
/remaped/Berries.gd:
--------------------------------------------------------------------------------
1 | extends Area
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | enum {SPEED, FLOATY, TOXIC, PSYCHOSIS, CANCER, GRAVITY}
6 |
7 | export var pills = false
8 | export var toxic = false
9 | export var healing = false
10 | export var healing_amount = 25
11 | export var kinematic = false
12 |
13 | func _ready():
14 | NetworkBridge.register_rpcs(self, [
15 | ["check_food", NetworkBridge.PERMISSION.ALL],
16 | ["delete", NetworkBridge.PERMISSION.ALL],
17 | ["kinematic_delete", NetworkBridge.PERMISSION.ALL]
18 | ])
19 |
20 | if not NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
21 | NetworkBridge.n_rpc(self, "check_food")
22 |
23 | master func check_food(id):
24 | if $CollisionShape.disabled:
25 | if kinematic:
26 | NetworkBridge.n_rpc_id(self, id, "kinematic_delete")
27 | else:
28 | NetworkBridge.n_rpc_id(self, id, "delete")
29 |
30 | remote func delete(id):
31 | $CollisionShape.disabled = true
32 | hide()
33 |
34 | remote func kinematic_delete(id):
35 | $CollisionShape.disabled = true
36 | get_parent().hide()
37 |
38 | func player_use():
39 | if pills:
40 | match randi() % 6:
41 | SPEED:
42 | Global.player.drug_speed = 50
43 | FLOATY:
44 | Global.player.drug_slowfall = 150
45 | TOXIC:
46 | Global.player.set_toxic()
47 | PSYCHOSIS:
48 | Global.player.psychocounter = 200
49 | CANCER:
50 | Global.player.cancer_count = 9
51 | Global.player.cancer()
52 | GRAVITY:
53 | Global.player.drug_gravity_flag = true
54 | get_parent().get_node("AudioStreamPlayer3D").play()
55 | get_parent().hide()
56 | Global.player.UI.notify("You ate pills.", Color(1, 0.0, 1.0))
57 | delete(null)
58 | NetworkBridge.n_rpc(self, "delete")
59 | if healing:
60 | Global.player.add_health(healing_amount)
61 | if kinematic:
62 | kinematic_delete(null)
63 | NetworkBridge.n_rpc(self, "kinematic_delete")
64 | delete(null)
65 | NetworkBridge.n_rpc(self, "delete")
66 | if toxic:
67 | Global.player.set_toxic()
68 | delete(null)
69 | NetworkBridge.n_rpc(self, "delete")
70 | else :
71 | Global.player.detox()
72 | delete(null)
73 | NetworkBridge.n_rpc(self, "delete")
74 |
--------------------------------------------------------------------------------
/ChatBox.gd:
--------------------------------------------------------------------------------
1 | extends PanelContainer
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var in_game_chat = true
6 |
7 | onready var textBox = $VBoxContainer/PanelContainer/RichTextLabel
8 | onready var lineEdit = $VBoxContainer/LineEdit
9 | onready var labelText = $VBoxContainer/Label
10 |
11 | onready var parent = Global.get_node("Multiplayer")
12 |
13 | var sizeRatio = 16
14 |
15 | func _ready():
16 | NetworkBridge.register_rpcs(self,[
17 | ["send_message_host", NetworkBridge.PERMISSION.ALL],
18 | ["send_message", NetworkBridge.PERMISSION.SERVER]
19 | ])
20 |
21 | if in_game_chat:
22 | hide()
23 |
24 | func set_size_ratio():
25 | sizeRatio = 16 * (Global.resolution[0] / 1280)
26 |
27 | textBox.get_font("normal_font").size = sizeRatio
28 | lineEdit.get_font("font").size = sizeRatio
29 | labelText.get_font("font").size = sizeRatio
30 |
31 | master func send_message_host(id, message, author, img = "null", color = "ff0000"):
32 | NetworkBridge.n_rpc(self, "send_message", [message, author, img, color])
33 | send_message(null, message, author, img, color)
34 |
35 | puppet func send_message(id, message, author, img = "null", color = "ff0000"):
36 | var rawText = '\n'
37 |
38 | if img != "null":
39 | rawText = rawText + '[img=32]' + img + '[/img] '
40 |
41 | if color != "ff0000":
42 | rawText = rawText + '[color=#' + color + ']'
43 |
44 | rawText = rawText + author + ': ' + message
45 |
46 | textBox.bbcode_text = textBox.bbcode_text + rawText
47 | $AudioStreamPlayer.play()
48 |
49 | if in_game_chat:
50 | Global.UI.notify(message, Color(1, 0, 0))
51 | Global.UI.notify(author + ":", Color(color))
52 |
53 | func _text_entered(new_text):
54 | if new_text != "":
55 | if NetworkBridge.n_is_network_master(self):
56 | send_message_host(null, new_text, parent.playerInfo.nickname, parent.playerInfo.image, parent.playerInfo.color)
57 | else:
58 | NetworkBridge.n_rpc(self, "send_message_host", [new_text, parent.playerInfo.nickname, parent.playerInfo.image, parent.playerInfo.color])
59 | lineEdit.text = ""
60 |
61 | func open_chat(type):
62 | show()
63 | set_size_ratio()
64 | $"../OpenChat".button_disable()
65 | $"../CloseChat".button_enable()
66 |
67 | func close_chat(type):
68 | hide()
69 | $"../OpenChat".button_enable()
70 | $"../CloseChat".button_disable()
71 |
--------------------------------------------------------------------------------
/remaped/Elevator.gd:
--------------------------------------------------------------------------------
1 | extends KinematicBody
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | var stopped = true
6 | var speed = - 2
7 | var initpos = true
8 | var last_pos
9 | var col = false
10 | var mesh_instance:MeshInstance
11 | var collision_area:Area
12 | var collision_object:CollisionShape
13 | var bell_audio:AudioStreamPlayer3D
14 | var move_audio:AudioStreamPlayer3D
15 |
16 | func _ready():
17 | NetworkBridge.register_rpcs(self, [
18 | ["stop", NetworkBridge.PERMISSION.ALL],
19 | ["network_use", NetworkBridge.PERMISSION.ALL]
20 | ])
21 |
22 | NetworkBridge.register_rset(self, "global_transform", NetworkBridge.PERMISSION.SERVER)
23 | rset_config("global_transform",MultiplayerAPI.RPC_MODE_PUPPET)
24 |
25 | for child in get_children():
26 | if child is MeshInstance:
27 | mesh_instance = child
28 | set_collision_mask_bit(9, 1)
29 | set_collision_mask_bit(8, 1)
30 | set_collision_layer_bit(8, 1)
31 | set_collision_mask_bit(0, 0)
32 | bell_audio = AudioStreamPlayer3D.new()
33 | add_child(bell_audio)
34 | bell_audio.unit_size = 10
35 | bell_audio.unit_db = 3
36 | bell_audio.global_transform.origin = global_transform.origin
37 | move_audio = bell_audio.duplicate()
38 | add_child(move_audio)
39 | move_audio.unit_db = 2
40 | bell_audio.stream = load("res://Sfx/Environment/Elevator_Bell.wav")
41 | move_audio.stream = load("res://Sfx/Environment/Elevator_Move.wav")
42 |
43 | func _process(delta):
44 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
45 | NetworkBridge.n_rset_unreliable(self, "global_transform", global_transform)
46 |
47 | last_pos = global_transform.origin
48 | if not stopped:
49 | if not move_audio.playing:
50 | move_audio.play()
51 | translate(Vector3(0, speed * delta, 0))
52 |
53 | master func stop(id):
54 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
55 | stopped = true
56 | initpos = not initpos
57 | speed = - speed
58 | bell_audio.play()
59 | move_audio.stop()
60 | else:
61 | NetworkBridge.n_rpc(self, "stop")
62 |
63 | func use():
64 | network_use(null)
65 |
66 | master func network_use(id):
67 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
68 | stopped = false
69 | else:
70 | NetworkBridge.n_rpc(self, "network_use")
71 |
--------------------------------------------------------------------------------
/remaped/down_switch_door.gd:
--------------------------------------------------------------------------------
1 | extends KinematicBody
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var door_health = 100
6 | export var speed = 2
7 | var open = false
8 | var stop = true
9 | var initrot = rotation
10 | var movement_counter = 0
11 | var mesh_instance
12 | var collision_shape
13 | var collision = false
14 | var found_overlap
15 | var sfx = preload("res://Sfx/Environment/door_concrete.wav")
16 | var audio_player:AudioStreamPlayer3D
17 |
18 | func _ready():
19 | rset_config("global_transform", MultiplayerAPI.RPC_MODE_PUPPET)
20 | NetworkBridge.register_rset(self, "global_transform", NetworkBridge.PERMISSION.SERVER)
21 |
22 | NetworkBridge.register_rpcs(self, [
23 | ["switch_use", NetworkBridge.PERMISSION.ALL]
24 | ])
25 |
26 | audio_player = AudioStreamPlayer3D.new()
27 | audio_player.stream = sfx
28 | add_child(audio_player)
29 | for child in get_children():
30 | if child is MeshInstance:
31 | mesh_instance = child
32 | if child is CollisionShape:
33 | collision_shape = child
34 | var t = mesh_instance.transform
35 | global_transform.origin.x -= mesh_instance.get_aabb().position.x
36 | global_transform.origin.z -= mesh_instance.get_aabb().position.z
37 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x, 0, mesh_instance.get_aabb().position.z))
38 | mesh_instance.transform = t
39 | collision_shape.transform = t
40 |
41 | func _physics_process(delta):
42 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
43 | NetworkBridge.n_rset_unreliable(self, "global_transform", global_transform)
44 |
45 | if not open and not stop:
46 | if not audio_player.playing:
47 | audio_player.play()
48 | translation.y += speed * delta
49 | movement_counter += speed * delta
50 | if open and not stop:
51 | if not audio_player.playing:
52 | audio_player.play()
53 | translation.y -= speed * delta
54 | movement_counter += speed * delta
55 | if movement_counter > mesh_instance.get_aabb().size.y + 0.1:
56 | audio_player.stop()
57 | movement_counter = 0
58 | stop = true
59 |
60 | master func switch_use(id):
61 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
62 | if stop and not open:
63 | open = not open
64 | stop = not stop
65 | else:
66 | NetworkBridge.n_rpc(self, "switch_use")
67 |
--------------------------------------------------------------------------------
/remaped/Explosion.gd:
--------------------------------------------------------------------------------
1 | extends Area
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var damage = 50
6 | export var gas = false
7 | export var sleep = false
8 | export var piercing = true
9 | var c_shape
10 | var particle
11 |
12 | var gas_timer = 0
13 |
14 | func _delete():
15 | queue_free()
16 |
17 | func _ready():
18 | particle = $Particle
19 | c_shape = $CollisionShape
20 | particle.emitting = true
21 |
22 | func _physics_process(delta):
23 | if NetworkBridge.n_is_network_master(self):
24 | if particle.emitting == false:
25 | if not gas:
26 | c_shape.disabled = true
27 | c_shape.visible = false
28 | else :
29 | gas_timer += delta
30 | if gas_timer >= 3:
31 | _delete()
32 | if gas and not sleep:
33 | for overlap_body in get_overlapping_bodies():
34 | if overlap_body.has_method("player_damage"):
35 | overlap_body.player_damage(damage, Vector3.ZERO, overlap_body.global_transform.origin, global_transform.origin, "gas")
36 | elif overlap_body.has_method("damage"):
37 | overlap_body.damage(damage, Vector3.ZERO, overlap_body.global_transform.origin, global_transform.origin)
38 |
39 | func _on_Explosion_area_entered(area):
40 | if NetworkBridge.n_is_network_master(self):
41 | do_damage(area)
42 |
43 | func _on_Explosion_body_entered(body):
44 | if NetworkBridge.n_is_network_master(self):
45 | do_damage(body)
46 | if sleep and body.has_method("tranquilize"):
47 | body.tranquilize(true)
48 |
49 | func do_damage(body):
50 | if gas:
51 | return
52 | var state = get_world().direct_space_state
53 | var result = state.intersect_ray(global_transform.origin, body.global_transform.origin, [self])
54 | if result:
55 | if result.collider.get_class() == "StaticBody":
56 | if result.collider.has_method("damage"):
57 | return
58 | if body.has_method("damage"):
59 | if body == Global.player and Global.implants.torso_implant.explosive_shield:
60 | Global.player.player_velocity -= (global_transform.origin - body.global_transform.origin).normalized() * damage * 0.05
61 | return
62 | body.damage(damage, (global_transform.origin - body.global_transform.origin).normalized(), body.global_transform.origin, global_transform.origin)
63 | if body.has_method("piercing_damage") and piercing:
64 | body.piercing_damage(damage, (global_transform.origin - body.global_transform.origin).normalized(), body.global_transform.origin, global_transform.origin)
65 |
--------------------------------------------------------------------------------
/maps_stuff/WeaponSpawner.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | var activeWeapon = null
6 | onready var weaponModels = get_node("Weapons").get_children()
7 |
8 | const maxAmmo = [24, 60, 5, 0, 25, 5, 6, 90, 50, 20, 0, 0, 20, 9, 0, 100, 0, 0, 200, 90, 72, 72, 18, 0, 0, 30, 200, 20, 90]
9 |
10 | export var rotateSpeed = 0.1
11 | export var respawnWeaponIds = [0]
12 | export var respawnTime = 5
13 |
14 | remote func _disable(id, disable):
15 | $Collect/CollisionShape.disabled = disable
16 |
17 | if NetworkBridge.n_is_network_master(self):
18 | NetworkBridge.n_rpc(self, "_disable", [disable])
19 |
20 | remote func _set_weapon(id, weaponId):
21 | if activeWeapon != null:
22 | weaponModels[activeWeapon].hide()
23 |
24 | activeWeapon = weaponId
25 |
26 | if activeWeapon != null:
27 | weaponModels[activeWeapon].show()
28 |
29 | if NetworkBridge.n_is_network_master(self):
30 | NetworkBridge.n_rpc(self, "_set_weapon", [weaponId])
31 |
32 | remote func _enable_timer(id):
33 | if NetworkBridge.n_is_network_master(self):
34 | $Timer.start()
35 | else:
36 | NetworkBridge.n_rpc(self, "_enable_timer")
37 |
38 | func _ready():
39 | NetworkBridge.register_rpcs(self,[
40 | ["_set_weapon", NetworkBridge.PERMISSION.ALL],
41 | ["_disable", NetworkBridge.PERMISSION.ALL],
42 | ["_enable_timer", NetworkBridge.PERMISSION.ALL]
43 | ])
44 |
45 | $Timer.wait_time = respawnTime
46 | $Timer.connect("timeout", self, "_selectWeapon")
47 |
48 | func _physics_process(delta):
49 | $Weapons.rotate_y(rotateSpeed)
50 |
51 | func collected():
52 | if activeWeapon != null:
53 | if (activeWeapon != Global.player.weapon.weapon1 and activeWeapon != Global.player.weapon.weapon2) or Global.player.weapon.current_weapon == activeWeapon:
54 | Global.player.weapon.magazine_ammo[activeWeapon] = Global.player.weapon.MAX_MAG_AMMO[activeWeapon]
55 | if Global.player.weapon.ammo[activeWeapon] < maxAmmo[activeWeapon]:
56 | Global.player.weapon.ammo[activeWeapon] = maxAmmo[activeWeapon]
57 | Global.player.weapon.set_weapon(activeWeapon)
58 |
59 | if not NetworkBridge.n_is_network_master(self):
60 | NetworkBridge.n_rpc(self, "_disable", [true])
61 | NetworkBridge.n_rpc(self, "_set_weapon", [null])
62 |
63 | _set_weapon(null, null)
64 | _disable(null, true)
65 |
66 | _enable_timer(null)
67 |
68 | func _selectWeapon():
69 | respawnWeaponIds.shuffle()
70 | _set_weapon(null, respawnWeaponIds[0])
71 | _disable(null, false)
72 |
--------------------------------------------------------------------------------
/remaped/Exit.gd:
--------------------------------------------------------------------------------
1 | extends Area
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | var Multiplayer = Global.get_node("Multiplayer")
6 |
7 | var exitPlayers = []
8 | var exitTimer
9 |
10 | var exiting = false
11 |
12 | func _ready():
13 | connect("body_entered", self, "_on_Body_entered")
14 | connect("body_exited", self, "_on_Body_exited")
15 |
16 | NetworkBridge.register_rpcs(self, [
17 | ["send_player_count", NetworkBridge.PERMISSION.SERVER],
18 | ["send_exit_message", NetworkBridge.PERMISSION.SERVER],
19 | ["player_exited", NetworkBridge.PERMISSION.ALL],
20 | ["player_entered", NetworkBridge.PERMISSION.ALL]
21 | ])
22 |
23 | exitTimer = Timer.new()
24 | add_child(exitTimer)
25 | exitTimer.wait_time = 5
26 | exitTimer.connect("timeout", self , "exit_to_menu")
27 |
28 | func _on_Body_exited(body):
29 | if body.name == "Player":
30 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
31 | player_exited(NetworkBridge.get_host_id())
32 | else:
33 | NetworkBridge.n_rpc(self, "player_exited")
34 |
35 | func _on_Body_entered(body):
36 | if body.name == "Player":
37 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
38 | player_entered(NetworkBridge.get_host_id())
39 | else:
40 | NetworkBridge.n_rpc(self, "player_entered")
41 |
42 | master func player_exited(id):
43 | if exitPlayers.has(id):
44 | exitPlayers.erase(id)
45 |
46 | master func player_entered(id):
47 | if not exitPlayers.has(id):
48 | exitPlayers.append(id)
49 |
50 | var all_player_entered = true
51 |
52 | for player in Multiplayer.players:
53 | if not exitPlayers.has(player):
54 | all_player_entered = false
55 |
56 | if Global.objective_complete:
57 | if all_player_entered:
58 | if not exiting:
59 | exiting = true
60 | send_exit_message(null)
61 | NetworkBridge.n_rpc(self, "send_exit_message")
62 | exitTimer.start()
63 | else:
64 | if NetworkBridge.n_is_network_master(self):
65 | send_player_count(null, len(exitPlayers), len(Multiplayer.players))
66 | else:
67 | NetworkBridge.n_rpc_id(self, id, "send_player_count", [len(exitPlayers), len(Multiplayer.players)])
68 |
69 | puppet func send_player_count(id, exitCount, hostCount):
70 | Global.UI.notify(str(exitCount) + "/" + str(hostCount) + " need to exit", Color(1, 0, 0))
71 |
72 | puppet func send_exit_message(id):
73 | Global.UI.notify("Exiting...", Color(1, 0, 0))
74 | Global.UI.notify("All players are at the exit", Color(1, 0, 0))
75 |
76 | func exit_to_menu():
77 | Multiplayer.goto_menu_host(true)
78 |
--------------------------------------------------------------------------------
/remaped/Terror_Door.gd:
--------------------------------------------------------------------------------
1 | extends KinematicBody
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | var GIB = preload("res://Entities/Physics_Objects/Chest_Gib.tscn")
6 |
7 | export var door_health = 100
8 | export var rotation_speed = 2
9 | var open = false
10 | var stop = true
11 | var initrot = rotation
12 | var rotation_counter = 0
13 | var mesh_instance
14 | var collision_shape
15 | var collision = false
16 | var found_overlap
17 | var type = 0
18 | var audio_player
19 |
20 | func _ready():
21 | NetworkBridge.register_rpcs(self, [
22 | ["remove_on_ready", NetworkBridge.PERMISSION.SERVER],
23 | ["remove", NetworkBridge.PERMISSION.SERVER],
24 | ["spawn_gib", NetworkBridge.PERMISSION.SERVER]
25 | ])
26 |
27 | set_collision_layer_bit(8, 1)
28 | audio_player = AudioStreamPlayer3D.new()
29 | get_parent().call_deferred("add_child", audio_player)
30 | yield (get_tree(), "idle_frame")
31 | audio_player.global_transform.origin = global_transform.origin
32 | audio_player.stream = load("res://Sfx/Flesh/gibbing_3.wav")
33 | audio_player.unit_size = 10
34 | audio_player.unit_db = 4
35 | audio_player.max_db = 4
36 | audio_player.pitch_scale = 0.6
37 |
38 | func get_type():
39 | return type
40 |
41 | func player_use():
42 | if not Global.hope_discarded:
43 | Global.player.UI.notify("zvhvhivj jidv ijvdkjaeui djvhduhekj vduihkeu", Color(1, 0, 0))
44 | else :
45 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
46 | for i in range(10):
47 | var new_gib = GIB.instance()
48 |
49 | new_gib.set_name(new_gib.name + "#" + str(new_gib.get_instance_id()))
50 |
51 | get_parent().add_child(new_gib)
52 | new_gib.global_transform.origin = global_transform.origin
53 | new_gib.velocity = Vector3.FORWARD.rotated(Vector3.UP, rand_range( - PI, PI))
54 | NetworkBridge.n_rpc(self, "spawn_gib", [get_parent().get_path(), new_gib.name])
55 |
56 | remove(null)
57 | NetworkBridge.n_rpc(self, "remove")
58 | else:
59 | Global.player.UI.notify("Something is keeping you from opening this door", Color(1, 0, 0))
60 |
61 | puppet func remove_on_ready(id):
62 | set_collision_layer_bit(0,false)
63 | set_collision_mask_bit(0,false)
64 | set_collision_layer_bit(8, false)
65 | hide()
66 |
67 | puppet func remove(id):
68 | set_collision_layer_bit(0,false)
69 | set_collision_mask_bit(0,false)
70 | set_collision_layer_bit(8, false)
71 | hide()
72 |
73 | puppet func spawn_gib(id, recivedPath, recivedName):
74 | var new_gib = GIB.instance()
75 | get_node(recivedPath).add_child(new_gib)
76 | new_gib.set_name(recivedName)
77 |
--------------------------------------------------------------------------------
/remaped/Cutscene.gd:
--------------------------------------------------------------------------------
1 | extends Spatial
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var next_scene = ""
6 | export (Array, String, MULTILINE) var LINES:Array = [""]
7 | export (Array, float) var DURATION:Array = [1]
8 | export (String) var music
9 | export var instant = false
10 | export var line_skip = true
11 | export var introskip = false
12 | var CAMERAS
13 | onready var TIMER = $Timer
14 | onready var SUBTITLE = $MarginContainer / CenterContainer / Subtitle
15 | var current_scene = 0
16 | var t = 0
17 |
18 | onready var Multiplayer = Global.get_node('Multiplayer')
19 | var oneshot = false
20 |
21 | func _ready():
22 | $MarginContainer / CenterContainer / Subtitle.get_font("font").size = 32 * (Global.resolution[0] / 1280)
23 |
24 | Global.menu.hide()
25 | if music != "":
26 | if music == "NO":
27 | Global.music.stop()
28 | else :
29 | Global.music.stream = load(music)
30 | Global.music.play()
31 | Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
32 | Global.cutscene = true
33 | Global.border.hide()
34 | CAMERAS = $Cameras.get_children()
35 | if introskip:
36 | Multiplayer.goto_menu_host()
37 | elif get_tree().network_peer == null:
38 | oneshot = true
39 | Multiplayer.host_server(23753)
40 | get_tree().network_peer.refuse_new_connections = true
41 |
42 | func _process(delta):
43 | if instant:
44 | t += 1
45 | SUBTITLE.modulate = Color((cos(t * 0.01) + 1) * 0.5, 0, 0)
46 | if TIMER.is_stopped() and current_scene != LINES.size():
47 | current_scene = clamp(current_scene, 0, LINES.size() - 1)
48 | TIMER.wait_time = DURATION[current_scene]
49 | if CAMERAS.size() > 0:
50 | CAMERAS[current_scene].current = true
51 | SUBTITLE.text = LINES[current_scene]
52 | if not instant:
53 | SUBTITLE.speech()
54 | else :
55 | SUBTITLE.visible_characters = - 1
56 | current_scene += 1
57 | TIMER.start()
58 | if TIMER.is_stopped() and current_scene == LINES.size():
59 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
60 | if oneshot:
61 | get_tree().network_peer = null
62 | if next_scene == "res://Menu/Main_Menu.tscn":
63 | Multiplayer.goto_menu_host()
64 | else:
65 | Multiplayer.goto_scene_host(next_scene)
66 |
67 | func _input(event):
68 | if event is InputEventKey:
69 | if Input.is_action_just_pressed("ui_cancel") or Input.is_action_just_pressed("ui_accept"):
70 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
71 | if oneshot:
72 | get_tree().network_peer = null
73 | if next_scene == "res://Menu/Main_Menu.tscn":
74 | Multiplayer.goto_menu_host()
75 | else:
76 | Multiplayer.goto_scene_host(next_scene)
77 | if Input.is_action_just_pressed("movement_jump") and line_skip:
78 | TIMER.stop()
79 |
--------------------------------------------------------------------------------
/remaped/down_door.gd:
--------------------------------------------------------------------------------
1 | extends KinematicBody
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | export var door_health = 100
6 | export var speed = 2
7 | var open = false
8 | var stop = true
9 | var initrot = rotation
10 | var movement_counter = 0
11 | var mesh_instance
12 | var collision_shape
13 | var collision = false
14 | var found_overlap
15 | var sfx = preload("res://Sfx/Environment/door_concrete.wav")
16 | var audio_player:AudioStreamPlayer3D
17 | var timer:Timer
18 |
19 | func _ready():
20 | NetworkBridge.register_rpcs(self, [
21 | ["network_use", NetworkBridge.PERMISSION.ALL]
22 | ])
23 |
24 | rset_config("global_transform", MultiplayerAPI.RPC_MODE_PUPPET)
25 | NetworkBridge.register_rset(self, "global_transform", NetworkBridge.PERMISSION.SERVER)
26 |
27 | timer = Timer.new()
28 | add_child(timer)
29 | timer.wait_time = 5
30 | timer.one_shot = true
31 | timer.connect("timeout", self, "timeout")
32 | set_collision_layer_bit(8, 1)
33 | audio_player = AudioStreamPlayer3D.new()
34 | audio_player.stream = sfx
35 | add_child(audio_player)
36 | for child in get_children():
37 | if child is MeshInstance:
38 | mesh_instance = child
39 | if child is CollisionShape:
40 | collision_shape = child
41 | var t = mesh_instance.transform
42 | global_transform.origin.x -= mesh_instance.get_aabb().position.x
43 | global_transform.origin.z -= mesh_instance.get_aabb().position.z
44 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x, 0, mesh_instance.get_aabb().position.z))
45 | mesh_instance.transform = t
46 | collision_shape.transform = t
47 |
48 | func _physics_process(delta):
49 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
50 | NetworkBridge.n_rset_unreliable(self, "global_transform", global_transform)
51 |
52 | if not open and not stop:
53 | if not audio_player.playing:
54 | audio_player.play()
55 | translation.y += speed * delta
56 | movement_counter += speed * delta
57 | if open and not stop:
58 | if not audio_player.playing:
59 | audio_player.play()
60 | translation.y -= speed * delta
61 | movement_counter += speed * delta
62 | if movement_counter > mesh_instance.get_aabb().size.y + 0.1:
63 | audio_player.stop()
64 | movement_counter = 0
65 | stop = true
66 |
67 | func switch_use():
68 | if stop and not open:
69 | open = not open
70 | stop = not stop
71 |
72 | func timeout():
73 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
74 | stop = not stop
75 | open = not open
76 |
77 | func use():
78 | network_use(null)
79 |
80 | master func network_use(id):
81 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
82 | if stop and not open:
83 | open = not open
84 | stop = not stop
85 | timer.start()
86 | else:
87 | NetworkBridge.n_rpc(self, "network_use")
88 |
--------------------------------------------------------------------------------
/remaped/Pushblock.gd:
--------------------------------------------------------------------------------
1 | extends StaticBody
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | func _ready():
6 | rset_config("global_transform", MultiplayerAPI.RPC_MODE_PUPPET)
7 | NetworkBridge.register_rset(self, "global_transform", NetworkBridge.PERMISSION.SERVER)
8 |
9 | set_collision_mask_bit(0, 1)
10 | set_collision_mask_bit(1, 1)
11 | set_collision_mask_bit(4, 1)
12 |
13 | func get_near_player(object) -> Dictionary:
14 | var oldDistance = null
15 | var checkPlayer = null
16 |
17 | for selectedPlayer in get_tree().get_nodes_in_group("Player"):
18 | var distance = object.global_transform.origin.distance_to(selectedPlayer.global_transform.origin)
19 | if oldDistance == null or oldDistance > distance:
20 | oldDistance = distance
21 | checkPlayer = selectedPlayer
22 |
23 | return {
24 | "player" : checkPlayer,
25 | "distance" : oldDistance
26 | }
27 |
28 | func _physics_process(delta):
29 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
30 |
31 | var space_state = get_world().direct_space_state
32 | var result_down = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.DOWN * 1)
33 |
34 | if not result_down:
35 | translate(Vector3.DOWN * 0.1)
36 | NetworkBridge.n_rset(self, "global_transform", global_transform)
37 |
38 | if get_near_player(self).distance > 3:
39 | return
40 |
41 | var result_forward = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.FORWARD * 1.1)
42 | var result_back = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.BACK * 1.1)
43 | var result_left = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.LEFT * 1.1)
44 | var result_right = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.RIGHT * 1.1)
45 |
46 | if result_forward and not result_back:
47 | if result_forward.collider == Global.player or result_forward.collider.has_meta("puppet"):
48 | translate(Vector3.BACK * 2)
49 | NetworkBridge.n_rset(self, "global_transform", global_transform)
50 |
51 | if result_back and not result_forward:
52 | if result_back.collider == Global.player or result_back.collider.has_meta("puppet"):
53 | translate(Vector3.FORWARD * 2)
54 | NetworkBridge.n_rset(self, "global_transform", global_transform)
55 |
56 | if result_left and not result_right:
57 | if result_left.collider == Global.player or result_left.collider.has_meta("puppet"):
58 | translate(Vector3.RIGHT * 2)
59 | NetworkBridge.n_rset(self, "global_transform", global_transform)
60 |
61 | if result_right and not result_left:
62 | if result_right.collider == Global.player or result_right.collider.has_meta("puppet"):
63 | translate(Vector3.LEFT * 2)
64 | NetworkBridge.n_rset(self, "global_transform", global_transform)
65 |
--------------------------------------------------------------------------------
/remaped/snakehead.gd:
--------------------------------------------------------------------------------
1 | extends KinematicBody
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | enum I{GOLEM, WEAPON, MONEY}
6 | export (I) var index = I.GOLEM
7 | var type = 1
8 | var laser
9 | var health = 2500
10 | var death_flag = false
11 | var follow_speed = 0.02
12 | var particle
13 | var active = false
14 | var destroyed = false
15 | var look_towards = Vector3.ZERO
16 | var t = 0
17 | var disabled = false
18 | var gib = preload("res://Entities/Physics_Objects/Snake_Gib.tscn")
19 | export var line = "Triagon 01 is gone. (Golem Exosystem Received)"
20 | export var line2 = "I bestow upon you power."
21 |
22 | func _ready():
23 | NetworkBridge.register_rpcs(self, [
24 | ["network_damage", NetworkBridge.PERMISSION.ALL]
25 | ])
26 |
27 | if Global.DEAD_CIVS.find(line) != - 1:
28 | get_parent().hide()
29 | queue_free()
30 | look_towards = Global.player.global_transform.origin
31 | laser = $Laser
32 | particle = $Particles
33 |
34 | func _process(delta):
35 | t += 1
36 | if destroyed:
37 | hide()
38 | return
39 | if disabled:
40 | particle.hide()
41 | if laser.scale.z < 3:
42 | hide()
43 | laser.scale.z = lerp(laser.scale.z, 1, 0.2)
44 | return
45 | show()
46 | look_towards = lerp(look_towards, Global.player.global_transform.origin, follow_speed)
47 | var space = get_world().direct_space_state
48 |
49 | if not active:
50 | return
51 |
52 | var result = space.intersect_ray(global_transform.origin, global_transform.origin - (global_transform.origin - look_towards).normalized() * 1000, [self])
53 | if result:
54 | particle.show()
55 | particle.global_transform.origin = result.position
56 | laser.scale.z = lerp(laser.scale.z, global_transform.origin.distance_to(result.position) * 0.5, 0.2)
57 | laser.look_at(result.position, Vector3.UP)
58 | if result.collider == Global.player:
59 | Global.player.damage(20, result.normal, result.position, global_transform.origin)
60 | else :
61 | particle.hide()
62 | laser.scale.z = 400
63 |
64 | func damage(dmg, nrml, pos, shoot_pos):
65 | network_damage(null, dmg, nrml, pos, shoot_pos)
66 |
67 | master func network_damage(id, dmg, nrml, pos, shoot_pos):
68 | if death_flag:
69 | return
70 | active = true
71 | health -= dmg
72 | if health <= 0:
73 | death_flag = true
74 | if index == I.GOLEM:
75 | Global.implants.purchased_implants.append("CSIJ Level VI Golem Exosystem")
76 | if index == I.MONEY:
77 | Global.money += 1000000
78 | if index == I.WEAPON:
79 | Global.WEAPONS_UNLOCKED[Global.player.weapon.W_SHOCK] = true
80 | var new_gib = gib.instance()
81 | Global.player.get_parent().add_child(new_gib)
82 | new_gib.global_transform.origin = global_transform.origin
83 | Global.player.UI.notify(line, Color(0, 1, 0))
84 | Global.player.UI.message(line2, true)
85 | Global.DEAD_CIVS.append(line)
86 | Global.save_game()
87 | get_parent().queue_free()
88 |
89 | func get_type():
90 | return type;
91 |
--------------------------------------------------------------------------------
/Button.tscn:
--------------------------------------------------------------------------------
1 | [gd_scene load_steps=11 format=2]
2 |
3 | [ext_resource path="res://Textures/Menu/Disabled_Button/4.png" type="Texture" id=1]
4 | [ext_resource path="res://Textures/Menu/Disabled_Button/3.png" type="Texture" id=2]
5 | [ext_resource path="res://Sfx/Flesh/flesh_slap.wav" type="AudioStream" id=3]
6 | [ext_resource path="res://Textures/Menu/hover.png" type="Texture" id=4]
7 | [ext_resource path="res://Textures/Menu/Disabled_Button/1.png" type="Texture" id=5]
8 | [ext_resource path="res://Textures/Menu/Disabled_Button/2.png" type="Texture" id=6]
9 | [ext_resource path="res://Textures/Menu/retry_normal.png" type="Texture" id=7]
10 |
11 | [sub_resource type="GDScript" id=4]
12 | script/source = "extends TextureRect
13 |
14 | export (Texture) var idleTexture
15 | export (Texture) var hoverTexture
16 | export (Texture) var disabledTexture
17 |
18 | export var enalbed = true
19 |
20 | export var labelText = \"Cruelty Squad Online\"
21 | export var buttonType = \"Menu\"
22 |
23 | onready var hint = get_tree().get_nodes_in_group(\"Hint\")[0]
24 |
25 | signal button_pressed(type)
26 |
27 | func _ready():
28 | if enalbed:
29 | button_enable()
30 | else:
31 | button_disable()
32 |
33 | func _on_mouse_enter():
34 | if enalbed:
35 | texture = hoverTexture
36 | hint.show()
37 |
38 | func _on_mouse_exit():
39 | if enalbed:
40 | texture = idleTexture
41 | hint.hide()
42 |
43 | func button_enable():
44 | enalbed = true
45 | texture = idleTexture
46 |
47 | func button_disable():
48 | enalbed = false
49 | texture = disabledTexture
50 |
51 | func _mouse_input(event):
52 | if event is InputEventMouseMotion and enalbed:
53 | hint.change_pos(event.global_position + Vector2(50,30))
54 | hint.change_text(labelText)
55 | if event is InputEventMouseButton and event.pressed and enalbed:
56 | texture = idleTexture
57 | emit_signal(\"button_pressed\",buttonType)
58 | $ClickSound.play()
59 | hint.hide()
60 | "
61 |
62 | [sub_resource type="AnimatedTexture" id=5]
63 | flags = 19
64 | frames = 4
65 | frame_0/texture = ExtResource( 5 )
66 | frame_0/delay_sec = 0.19
67 | frame_1/texture = ExtResource( 6 )
68 | frame_1/delay_sec = 0.06
69 | frame_2/texture = ExtResource( 2 )
70 | frame_2/delay_sec = 0.32
71 | frame_3/texture = ExtResource( 1 )
72 | frame_3/delay_sec = 0.25
73 |
74 | [sub_resource type="AudioStreamRandomPitch" id=10]
75 | audio_stream = ExtResource( 3 )
76 |
77 | [node name="Button" type="TextureRect"]
78 | margin_right = 128.0
79 | margin_bottom = 128.0
80 | rect_scale = Vector2( 0.5, 0.5 )
81 | texture = ExtResource( 7 )
82 | stretch_mode = 1
83 | script = SubResource( 4 )
84 | idleTexture = ExtResource( 7 )
85 | hoverTexture = ExtResource( 4 )
86 | disabledTexture = SubResource( 5 )
87 |
88 | [node name="ClickSound" type="AudioStreamPlayer" parent="."]
89 | stream = SubResource( 10 )
90 | volume_db = -5.0
91 | pitch_scale = 0.43
92 |
93 | [connection signal="gui_input" from="." to="." method="_mouse_input"]
94 | [connection signal="mouse_entered" from="." to="." method="_on_mouse_enter"]
95 | [connection signal="mouse_exited" from="." to="." method="_on_mouse_exit"]
96 |
--------------------------------------------------------------------------------
/RelayServer.gd:
--------------------------------------------------------------------------------
1 | extends Node
2 |
3 | export var enabled = true
4 |
5 | export var virtual_server_port = 25568
6 | export var true_server_port = 25567
7 |
8 | export var fake_latency_ms = 0
9 | export var fake_loss = 0.0
10 |
11 | # Mental picture :
12 | #
13 | # (True) Server <--> Virtual Client -[Laggy bridge]- Virtual Server <--> (True) Client
14 | #
15 |
16 | var vserver_peer
17 | var vserver_has_dest_address = false
18 | var vserver_first_client_port = -1
19 | var vclient_peer
20 |
21 | class QueEntry:
22 | var byte_array
23 | var qued_at
24 |
25 | func _init(packet, time_now):
26 | self.byte_array = packet
27 | self.qued_at = time_now
28 |
29 | var client_to_server_que = []
30 | var server_to_client_que = []
31 |
32 | func _ready():
33 | set_process(false)
34 |
35 | func setup():
36 | if enabled:
37 | print("[CRUS ONLINE / DEBUG / UDP LAGGER]: Setting up")
38 |
39 | vserver_peer = PacketPeerUDP.new()
40 | vserver_peer.listen(virtual_server_port, "127.0.0.1")
41 |
42 | vclient_peer = PacketPeerUDP.new()
43 | vclient_peer.set_dest_address("127.0.0.1", true_server_port)
44 |
45 | set_process(true)
46 |
47 | func _process(delta):
48 | var now = Time.get_ticks_msec()
49 | var send_at_ms = now - fake_latency_ms
50 |
51 | # Handle packets Client -> Server
52 | while vserver_peer.get_available_packet_count() > 0:
53 | var packet = vserver_peer.get_packet()
54 | var err = vserver_peer.get_packet_error()
55 | if err != OK :
56 | push_error("[CRUS ONLINE / DEBUG / UDP LAGGER]: Incoming packet error : " + str(err))
57 | continue
58 |
59 | var from_port = vserver_peer.get_packet_port()
60 |
61 | if not vserver_has_dest_address:
62 | vserver_peer.set_dest_address("127.0.0.1", from_port)
63 | vserver_first_client_port = from_port
64 | vserver_has_dest_address = true
65 | elif vserver_first_client_port != from_port :
66 | push_warning("[CRUS ONLINE / DEBUG / UDP LAGGER]: VServer got packet from unknown port, ignored.")
67 | continue
68 |
69 | client_to_server_que.push_back(QueEntry.new(packet, now))
70 | _process_que(client_to_server_que, vclient_peer, send_at_ms)
71 |
72 | if not vserver_has_dest_address:
73 | return
74 |
75 | # Handle packets Server -> Client
76 | while vclient_peer.get_available_packet_count() > 0:
77 | var packet = vclient_peer.get_packet()
78 | var err = vclient_peer.get_packet_error()
79 | if err != OK :
80 | push_error("[CRUS ONLINE / DEBUG / UDP LAGGER]: Incoming packet error: " + str(err))
81 | continue
82 |
83 | var from_port = vclient_peer.get_packet_port()
84 | if from_port != true_server_port :
85 | push_warning("[CRUS ONLINE / DEBUG / UDP LAGGER]: VClient got packet from unknown port, ignored.")
86 | continue
87 |
88 | server_to_client_que.push_back(QueEntry.new(packet, now))
89 | _process_que(server_to_client_que, vserver_peer, send_at_ms)
90 |
91 | func _process_que(que, to_peer, send_at_ms):
92 | while not que.empty():
93 | var front = que.front()
94 | if send_at_ms >= front.qued_at :
95 | if fake_loss <= 0 or randf() >= fake_loss:
96 | to_peer.put_packet(front.byte_array)
97 | que.pop_front()
98 | else:
99 | break
100 |
--------------------------------------------------------------------------------
/remaped/Special_Pushblock.gd:
--------------------------------------------------------------------------------
1 | extends KinematicBody
2 |
3 | onready var NetworkBridge = Global.get_node("Multiplayer/NetworkBridge")
4 |
5 | func _ready():
6 | NetworkBridge.register_rpcs(self, [
7 | ["remove", NetworkBridge.PERMISSION.SERVER]
8 | ])
9 |
10 | rset_config("global_transform", MultiplayerAPI.RPC_MODE_PUPPET)
11 | NetworkBridge.register_rset(self, "global_transform", NetworkBridge.PERMISSION.SERVER)
12 |
13 | set_collision_mask_bit(0, 1)
14 | set_collision_mask_bit(1, 1)
15 | set_safe_margin(0)
16 |
17 | puppet func remove(id):
18 | queue_free()
19 |
20 | func get_near_player(object) -> Dictionary:
21 | var oldDistance = null
22 | var checkPlayer = null
23 |
24 | for selectedPlayer in get_tree().get_nodes_in_group("Player"):
25 | var distance = object.global_transform.origin.distance_to(selectedPlayer.global_transform.origin)
26 | if oldDistance == null or oldDistance > distance:
27 | oldDistance = distance
28 | checkPlayer = selectedPlayer
29 |
30 | return {
31 | "player" : checkPlayer,
32 | "distance" : oldDistance
33 | }
34 |
35 |
36 | func _physics_process(delta):
37 | if NetworkBridge.check_connection() and NetworkBridge.n_is_network_master(self):
38 |
39 | var space_state = get_world().direct_space_state
40 | var result_down = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.DOWN * 1)
41 |
42 | if not result_down:
43 | translate(Vector3.DOWN * 0.1)
44 | NetworkBridge.n_rset(self, "global_transform", global_transform)
45 |
46 | if result_down:
47 | if result_down.collider.has_method("special_destroy"):
48 | result_down.collider.special_destroy()
49 | queue_free()
50 | NetworkBridge.n_rpc(self, "remove")
51 |
52 | if get_near_player(self).distance > 3:
53 | return
54 |
55 | var result_forward = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.FORWARD * 1.1)
56 | var result_back = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.BACK * 1.1)
57 | var result_left = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.LEFT * 1.1)
58 | var result_right = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.RIGHT * 1.1)
59 |
60 | if result_forward and not result_back:
61 | if result_forward.collider == Global.player or result_forward.collider.has_meta("puppet"):
62 | translate(Vector3.BACK * 2)
63 | NetworkBridge.n_rset(self, "global_transform", global_transform)
64 |
65 | if result_back and not result_forward:
66 | if result_back.collider == Global.player or result_back.collider.has_meta("puppet"):
67 | translate(Vector3.FORWARD * 2)
68 | NetworkBridge.n_rset(self, "global_transform", global_transform)
69 |
70 | if result_left and not result_right:
71 | if result_left.collider == Global.player or result_left.collider.has_meta("puppet"):
72 | translate(Vector3.RIGHT * 2)
73 | NetworkBridge.n_rset(self, "global_transform", global_transform)
74 |
75 | if result_right and not result_left:
76 | if result_right.collider == Global.player or result_right.collider.has_meta("puppet"):
77 | translate(Vector3.LEFT * 2)
78 | NetworkBridge.n_rset(self, "global_transform", global_transform)
79 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Cruelty Squad Online
2 |
3 |
6 |
7 | English | [Русский](README_RU.md)
8 |
9 |
6 |
7 | [English](WIKI.md) | Русский
8 |
9 |
6 |
7 | [English](README.md) | Русский
8 |
9 |