Add ball
This commit is contained in:
parent
25fe3e5ae6
commit
b57d31065a
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://ct70bpbca8one" path="res://scenes/player/local_player.tscn" id="1_yjvui"]
|
[ext_resource type="PackedScene" uid="uid://ct70bpbca8one" path="res://scenes/player/local_player.tscn" id="1_yjvui"]
|
||||||
[ext_resource type="PackedScene" uid="uid://kfxc0migw80o" path="res://scenes/player/remote_player.tscn" id="2_kcncr"]
|
[ext_resource type="PackedScene" uid="uid://kfxc0migw80o" path="res://scenes/player/remote_player.tscn" id="2_kcncr"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://dfnbc8sbufa4j" path="res://scenes/misc/ball.tscn" id="3_e0nj3"]
|
||||||
|
|
||||||
[sub_resource type="ImageTexture" id="ImageTexture_3vyb7"]
|
[sub_resource type="ImageTexture" id="ImageTexture_3vyb7"]
|
||||||
|
|
||||||
@ -14,10 +15,12 @@ size = Vector2(100, 100)
|
|||||||
[sub_resource type="BoxShape3D" id="BoxShape3D_1cgct"]
|
[sub_resource type="BoxShape3D" id="BoxShape3D_1cgct"]
|
||||||
size = Vector3(100, 0.01, 100)
|
size = Vector3(100, 0.01, 100)
|
||||||
|
|
||||||
[node name="map" type="Map" unique_id=914577955 node_paths=PackedStringArray("spawner")]
|
[node name="map" type="Map" unique_id=914577955 node_paths=PackedStringArray("spawner", "ball_spawner")]
|
||||||
spawner = NodePath("spawner")
|
spawner = NodePath("spawner")
|
||||||
|
ball_spawner = NodePath("ball_spawner")
|
||||||
local_player = ExtResource("1_yjvui")
|
local_player = ExtResource("1_yjvui")
|
||||||
remote_player = ExtResource("2_kcncr")
|
remote_player = ExtResource("2_kcncr")
|
||||||
|
ball = ExtResource("3_e0nj3")
|
||||||
|
|
||||||
[node name="net_stats_label" type="NetStatsLabel" parent="." unique_id=1821474986]
|
[node name="net_stats_label" type="NetStatsLabel" parent="." unique_id=1821474986]
|
||||||
anchors_preset = 2
|
anchors_preset = 2
|
||||||
@ -44,3 +47,6 @@ transform = Transform3D(1, 0, 0, 0, 0.7274598, 0.6861503, 0, -0.6861503, 0.72745
|
|||||||
|
|
||||||
[node name="spawner" type="Node3D" parent="." unique_id=1364438299]
|
[node name="spawner" type="Node3D" parent="." unique_id=1364438299]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.028572083, 3.9666176, 0.031027317)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.028572083, 3.9666176, 0.031027317)
|
||||||
|
|
||||||
|
[node name="ball_spawner" type="Node3D" parent="." unique_id=1149426253]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.080344, 4.78083, -9.363691)
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[gd_scene format=3 uid="uid://bwd6bj21x310s"]
|
[gd_scene format=3 uid="uid://bwd6bj21x310s"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://ccd0wj2usx5os" path="res://scenes/player_listing.tscn" id="1_o1atq"]
|
[ext_resource type="PackedScene" uid="uid://ccd0wj2usx5os" path="res://scenes/ui/player_listing.tscn" id="1_o1atq"]
|
||||||
|
|
||||||
[sub_resource type="LabelSettings" id="LabelSettings_1cgct"]
|
[sub_resource type="LabelSettings" id="LabelSettings_1cgct"]
|
||||||
font_size = 32
|
font_size = 32
|
||||||
|
|||||||
26
godot/scenes/misc/ball.tscn
Normal file
26
godot/scenes/misc/ball.tscn
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
[gd_scene format=3 uid="uid://dfnbc8sbufa4j"]
|
||||||
|
|
||||||
|
[sub_resource type="FastNoiseLite" id="FastNoiseLite_yxhor"]
|
||||||
|
noise_type = 2
|
||||||
|
|
||||||
|
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_yli5f"]
|
||||||
|
noise = SubResource("FastNoiseLite_yxhor")
|
||||||
|
|
||||||
|
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3g557"]
|
||||||
|
albedo_color = Color(0, 1, 0, 1)
|
||||||
|
albedo_texture = SubResource("NoiseTexture2D_yli5f")
|
||||||
|
|
||||||
|
[sub_resource type="SphereMesh" id="SphereMesh_1cgct"]
|
||||||
|
material = SubResource("StandardMaterial3D_3g557")
|
||||||
|
|
||||||
|
[sub_resource type="SphereShape3D" id="SphereShape3D_1cgct"]
|
||||||
|
|
||||||
|
[node name="ball" type="Ball" unique_id=816748600]
|
||||||
|
collision_layer = 4
|
||||||
|
collision_mask = 7
|
||||||
|
|
||||||
|
[node name="mesh_instance_3d" type="MeshInstance3D" parent="." unique_id=2076561614]
|
||||||
|
mesh = SubResource("SphereMesh_1cgct")
|
||||||
|
|
||||||
|
[node name="collision_shape_3d" type="CollisionShape3D" parent="." unique_id=1408432914]
|
||||||
|
shape = SubResource("SphereShape3D_1cgct")
|
||||||
18
rust/src/ball.rs
Normal file
18
rust/src/ball.rs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
use godot::{classes::RigidBody3D, prelude::*};
|
||||||
|
|
||||||
|
use crate::player::NetTransform;
|
||||||
|
|
||||||
|
#[derive(GodotClass)]
|
||||||
|
#[class(base=RigidBody3D, init)]
|
||||||
|
pub struct Ball {
|
||||||
|
base: Base<RigidBody3D>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ball {
|
||||||
|
pub fn get_transform(&self) -> NetTransform {
|
||||||
|
NetTransform {
|
||||||
|
location: self.base().get_global_position().into(),
|
||||||
|
rotation: self.base().get_global_rotation().into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -14,7 +14,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
util::NetVector3,
|
util::NetVector3,
|
||||||
},
|
},
|
||||||
player::{DamageSource, IPlayer, LocalPlayer, NetPlayerTransform, RemotePlayer},
|
player::{DamageSource, IPlayer, LocalPlayer, NetTransform, RemotePlayer},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const GAME_MANAGER_GLOBAL: &str = "GameManagerGlobal";
|
pub const GAME_MANAGER_GLOBAL: &str = "GameManagerGlobal";
|
||||||
@ -300,11 +300,26 @@ impl Game {
|
|||||||
for player in s.players.clone() {
|
for player in s.players.clone() {
|
||||||
s.spawn_player_server(player.id);
|
s.spawn_player_server(player.id);
|
||||||
}
|
}
|
||||||
|
s.spawn_ball(None);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn spawn_ball(&mut self, transform: Option<NetTransform>) {
|
||||||
|
if let Some(map) = &mut self.current_map {
|
||||||
|
let ball = map.bind_mut().spawn_ball(transform);
|
||||||
|
self.run_deferred(|_| {
|
||||||
|
if let Some(ball) = ball
|
||||||
|
&& let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer
|
||||||
|
&& let PeerKind::Server(peer, _) = peer
|
||||||
|
{
|
||||||
|
peer.broadcast_reliable(Package::SpawnBall(ball.bind().get_transform()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn spawn_player_server(&mut self, id: u16) -> Option<DynGd<CharacterBody3D, dyn IPlayer>> {
|
pub fn spawn_player_server(&mut self, id: u16) -> Option<DynGd<CharacterBody3D, dyn IPlayer>> {
|
||||||
if let Some(player) = self.find_player_mut(id)
|
if let Some(player) = self.find_player_mut(id)
|
||||||
&& let Some(character) = &mut player.character
|
&& let Some(character) = &mut player.character
|
||||||
@ -360,7 +375,7 @@ impl Game {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Method called on the client-side whenever a player has spawned
|
// Method called on the client-side whenever a player has spawned
|
||||||
pub fn spawn_player_client(&mut self, id: u16, transform: NetPlayerTransform) {
|
pub fn spawn_player_client(&mut self, id: u16, transform: NetTransform) {
|
||||||
if let Some(map) = &mut self.current_map {
|
if let Some(map) = &mut self.current_map {
|
||||||
if let Some(player) = self.players.iter_mut().find(|p| p.id == id) {
|
if let Some(player) = self.players.iter_mut().find(|p| p.id == id) {
|
||||||
if let Some(character) = &mut player.character {
|
if let Some(character) = &mut player.character {
|
||||||
@ -423,7 +438,7 @@ impl Game {
|
|||||||
&mut self,
|
&mut self,
|
||||||
player_id: u16,
|
player_id: u16,
|
||||||
to: Vector3,
|
to: Vector3,
|
||||||
transform: NetPlayerTransform,
|
transform: NetTransform,
|
||||||
look_up: f32,
|
look_up: f32,
|
||||||
deal_damage: bool,
|
deal_damage: bool,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
@ -487,7 +502,7 @@ pub struct Player {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Player {
|
impl Player {
|
||||||
pub fn get_transform(&self) -> Option<NetPlayerTransform> {
|
pub fn get_transform(&self) -> Option<NetTransform> {
|
||||||
if let Some(character) = &self.character {
|
if let Some(character) = &self.character {
|
||||||
Some(character.dyn_bind().get_transform())
|
Some(character.dyn_bind().get_transform())
|
||||||
} else {
|
} else {
|
||||||
@ -495,7 +510,7 @@ impl Player {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_transform(&mut self, transform: NetPlayerTransform) {
|
pub fn set_transform(&mut self, transform: NetTransform) {
|
||||||
if let Some(character) = &mut self.character {
|
if let Some(character) = &mut self.character {
|
||||||
character.dyn_bind_mut().apply_transform(transform);
|
character.dyn_bind_mut().apply_transform(transform);
|
||||||
}
|
}
|
||||||
@ -562,7 +577,7 @@ impl Player {
|
|||||||
pub fn try_shoot(
|
pub fn try_shoot(
|
||||||
&mut self,
|
&mut self,
|
||||||
to: Vector3,
|
to: Vector3,
|
||||||
transform: NetPlayerTransform,
|
transform: NetTransform,
|
||||||
look_up: f32,
|
look_up: f32,
|
||||||
deal_damage: bool,
|
deal_damage: bool,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
use godot::prelude::*;
|
use godot::prelude::*;
|
||||||
|
|
||||||
|
pub mod ball;
|
||||||
pub mod game_manager;
|
pub mod game_manager;
|
||||||
pub mod killbox;
|
pub mod killbox;
|
||||||
pub mod map;
|
pub mod map;
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
use godot::{classes::CharacterBody3D, prelude::*};
|
use godot::{classes::CharacterBody3D, prelude::*};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
ball::Ball,
|
||||||
game_manager::Game,
|
game_manager::Game,
|
||||||
player::{IPlayer, LocalPlayer, NetPlayerTransform, RemotePlayer},
|
player::{IPlayer, LocalPlayer, NetTransform, RemotePlayer},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(GodotClass)]
|
#[derive(GodotClass)]
|
||||||
@ -11,9 +12,13 @@ pub struct Map {
|
|||||||
#[export]
|
#[export]
|
||||||
pub spawner: Option<Gd<Node3D>>,
|
pub spawner: Option<Gd<Node3D>>,
|
||||||
#[export]
|
#[export]
|
||||||
|
pub ball_spawner: Option<Gd<Node3D>>,
|
||||||
|
#[export]
|
||||||
pub local_player: Option<Gd<PackedScene>>,
|
pub local_player: Option<Gd<PackedScene>>,
|
||||||
#[export]
|
#[export]
|
||||||
pub remote_player: Option<Gd<PackedScene>>,
|
pub remote_player: Option<Gd<PackedScene>>,
|
||||||
|
#[export]
|
||||||
|
pub ball: Option<Gd<PackedScene>>,
|
||||||
|
|
||||||
base: Base<Node3D>,
|
base: Base<Node3D>,
|
||||||
}
|
}
|
||||||
@ -36,7 +41,7 @@ impl Map {
|
|||||||
&mut self,
|
&mut self,
|
||||||
player_id: u16,
|
player_id: u16,
|
||||||
is_local: bool,
|
is_local: bool,
|
||||||
transform: Option<NetPlayerTransform>,
|
transform: Option<NetTransform>,
|
||||||
) -> Option<DynGd<CharacterBody3D, dyn IPlayer + 'static>> {
|
) -> Option<DynGd<CharacterBody3D, dyn IPlayer + 'static>> {
|
||||||
if is_local {
|
if is_local {
|
||||||
if let Some(local_player) = &self.local_player {
|
if let Some(local_player) = &self.local_player {
|
||||||
@ -84,4 +89,22 @@ impl Map {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn spawn_ball(&mut self, transform: Option<NetTransform>) -> Option<Gd<Ball>> {
|
||||||
|
if let Some(ball_spawner) = self.ball_spawner.clone()
|
||||||
|
&& let Some(ball_prefab) = &self.ball
|
||||||
|
{
|
||||||
|
let mut ball = ball_prefab.instantiate_as::<Ball>();
|
||||||
|
self.base_mut().add_child(&ball);
|
||||||
|
if let Some(transform) = transform {
|
||||||
|
ball.set_global_position(transform.location.into());
|
||||||
|
ball.set_global_rotation(transform.rotation.into());
|
||||||
|
} else {
|
||||||
|
ball.set_global_position(ball_spawner.get_global_position());
|
||||||
|
}
|
||||||
|
Some(ball)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ use teanet::{Peer, PeerConfig};
|
|||||||
use crate::{
|
use crate::{
|
||||||
game_manager::{Game, GameManager, NetPlayer},
|
game_manager::{Game, GameManager, NetPlayer},
|
||||||
net::{net_stats::Stats, util::NetVector3},
|
net::{net_stats::Stats, util::NetVector3},
|
||||||
player::{DamageSource, NetPlayerTransform},
|
player::{DamageSource, NetTransform},
|
||||||
ui::cli::{CliColor, CommandLinePanel},
|
ui::cli::{CliColor, CommandLinePanel},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -257,6 +257,11 @@ impl INode for NetworkManager {
|
|||||||
.handle_kill(source_player_id, target_player_id);
|
.handle_kill(source_player_id, target_player_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Package::SpawnBall(transform) => {
|
||||||
|
if let Some(game) = &mut Game::singleton() {
|
||||||
|
game.bind_mut().spawn_ball(Some(transform));
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -567,20 +572,21 @@ pub enum Package {
|
|||||||
MapLoaded,
|
MapLoaded,
|
||||||
|
|
||||||
// Game packages
|
// Game packages
|
||||||
SpawnPlayer(u16, NetPlayerTransform),
|
SpawnPlayer(u16, NetTransform),
|
||||||
Sync(HashMap<u16, SyncPackage>),
|
Sync(HashMap<u16, SyncPackage>),
|
||||||
SelfSync(SyncPackage),
|
SelfSync(SyncPackage),
|
||||||
Jump(u16),
|
Jump(u16),
|
||||||
Shoot(u16, NetVector3, NetPlayerTransform, f32),
|
Shoot(u16, NetVector3, NetTransform, f32),
|
||||||
TakeDamage(DamageSource, u16, i32),
|
TakeDamage(DamageSource, u16, i32),
|
||||||
Kill(DamageSource, u16),
|
Kill(DamageSource, u16),
|
||||||
|
SpawnBall(NetTransform),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
pub struct SyncPackage {
|
pub struct SyncPackage {
|
||||||
pub movement_direction: NetVector3,
|
pub movement_direction: NetVector3,
|
||||||
pub look_up: f32,
|
pub look_up: f32,
|
||||||
pub transform: NetPlayerTransform,
|
pub transform: NetTransform,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum PeerKind {
|
pub enum PeerKind {
|
||||||
|
|||||||
@ -26,7 +26,7 @@ use crate::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
|
||||||
pub struct NetPlayerTransform {
|
pub struct NetTransform {
|
||||||
pub location: NetVector3,
|
pub location: NetVector3,
|
||||||
pub rotation: NetVector3,
|
pub rotation: NetVector3,
|
||||||
}
|
}
|
||||||
@ -38,11 +38,11 @@ pub trait IPlayer {
|
|||||||
fn get_movement_dir(&self) -> Vector3;
|
fn get_movement_dir(&self) -> Vector3;
|
||||||
fn set_movement_dir(&mut self, dir: Vector3);
|
fn set_movement_dir(&mut self, dir: Vector3);
|
||||||
fn get_move_speed(&self) -> f32;
|
fn get_move_speed(&self) -> f32;
|
||||||
fn apply_transform(&mut self, transform: NetPlayerTransform);
|
fn apply_transform(&mut self, transform: NetTransform);
|
||||||
fn apply_rotation(&mut self, rot: Vector3);
|
fn apply_rotation(&mut self, rot: Vector3);
|
||||||
fn apply_look_up(&mut self, rot: f32);
|
fn apply_look_up(&mut self, rot: f32);
|
||||||
fn get_look_up(&self) -> f32;
|
fn get_look_up(&self) -> f32;
|
||||||
fn get_transform(&self) -> NetPlayerTransform;
|
fn get_transform(&self) -> NetTransform;
|
||||||
fn jump(&mut self);
|
fn jump(&mut self);
|
||||||
fn try_shoot(&mut self, to: Vector3, deal_damage: bool) -> bool;
|
fn try_shoot(&mut self, to: Vector3, deal_damage: bool) -> bool;
|
||||||
fn take_damage(&mut self, source_player: DamageSource, damage: i32, kill: bool);
|
fn take_damage(&mut self, source_player: DamageSource, damage: i32, kill: bool);
|
||||||
@ -143,7 +143,7 @@ impl IPlayer for LocalPlayer {
|
|||||||
self.move_speed
|
self.move_speed
|
||||||
}
|
}
|
||||||
|
|
||||||
fn apply_transform(&mut self, transform: NetPlayerTransform) {
|
fn apply_transform(&mut self, transform: NetTransform) {
|
||||||
self.base_mut()
|
self.base_mut()
|
||||||
.set_global_position(transform.location.into());
|
.set_global_position(transform.location.into());
|
||||||
self.base_mut()
|
self.base_mut()
|
||||||
@ -152,8 +152,8 @@ impl IPlayer for LocalPlayer {
|
|||||||
|
|
||||||
fn apply_rotation(&mut self, _rot: Vector3) {}
|
fn apply_rotation(&mut self, _rot: Vector3) {}
|
||||||
|
|
||||||
fn get_transform(&self) -> NetPlayerTransform {
|
fn get_transform(&self) -> NetTransform {
|
||||||
NetPlayerTransform {
|
NetTransform {
|
||||||
location: self.base().get_global_position().into(),
|
location: self.base().get_global_position().into(),
|
||||||
rotation: self.base().get_global_rotation().into(),
|
rotation: self.base().get_global_rotation().into(),
|
||||||
}
|
}
|
||||||
@ -470,7 +470,7 @@ impl IPlayer for RemotePlayer {
|
|||||||
self.player_id
|
self.player_id
|
||||||
}
|
}
|
||||||
|
|
||||||
fn apply_transform(&mut self, transform: NetPlayerTransform) {
|
fn apply_transform(&mut self, transform: NetTransform) {
|
||||||
self.base_mut()
|
self.base_mut()
|
||||||
.set_global_position(transform.location.into());
|
.set_global_position(transform.location.into());
|
||||||
self.base_mut()
|
self.base_mut()
|
||||||
@ -481,8 +481,8 @@ impl IPlayer for RemotePlayer {
|
|||||||
self.base_mut().set_global_rotation(rot);
|
self.base_mut().set_global_rotation(rot);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_transform(&self) -> NetPlayerTransform {
|
fn get_transform(&self) -> NetTransform {
|
||||||
NetPlayerTransform {
|
NetTransform {
|
||||||
location: self.base().get_global_position().into(),
|
location: self.base().get_global_position().into(),
|
||||||
rotation: self.base().get_global_rotation().into(),
|
rotation: self.base().get_global_rotation().into(),
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user