mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Added carriage
This commit is contained in:
parent
623ab099b8
commit
8a8a5526f1
@ -179,6 +179,42 @@
|
|||||||
central: ("submarine.rudder"),
|
central: ("submarine.rudder"),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
custom_indices: {
|
||||||
|
1: Air(ChairSingle, 4),
|
||||||
|
2: Air(Helm, 0),
|
||||||
|
3: Air(Door, 4),
|
||||||
|
4: Air(Door, 0),
|
||||||
|
9: Air(CraftingBench, 0),
|
||||||
|
10: Air(Window1, 0),
|
||||||
|
11: Air(RepairBench, 0),
|
||||||
|
12: Air(DismantlingBench, 4),
|
||||||
|
13: Air(Window1, 2),
|
||||||
|
14: Air(Crate, 0),
|
||||||
|
15: Air(Cauldron, 2),
|
||||||
|
16: Air(Tent, 0),
|
||||||
|
17: Air(CookingPot, 0),
|
||||||
|
18: Air(WallLampSmall, 4),
|
||||||
|
19: Air(Lantern, 4),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Carriage: (
|
||||||
|
bone0: (
|
||||||
|
offset: (-4.5, -6.5, -0.5),
|
||||||
|
central: ("carriage.structure"),
|
||||||
|
),
|
||||||
|
bone1: (
|
||||||
|
offset: (0.0, 0.0, 0.0),
|
||||||
|
central: ("empty"),
|
||||||
|
),
|
||||||
|
bone2: (
|
||||||
|
offset: (0.0, 0.0, 0.0),
|
||||||
|
central: ("empty"),
|
||||||
|
),
|
||||||
|
bone3: (
|
||||||
|
offset: (0.0, 0.0, 0.0),
|
||||||
|
central: ("empty"),
|
||||||
|
),
|
||||||
|
|
||||||
custom_indices: {
|
custom_indices: {
|
||||||
1: Air(ChairSingle, 4),
|
1: Air(ChairSingle, 4),
|
||||||
2: Air(Helm, 0),
|
2: Air(Helm, 0),
|
||||||
|
BIN
assets/common/voxel/carriage/prop.vox
(Stored with Git LFS)
Normal file
BIN
assets/common/voxel/carriage/prop.vox
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/common/voxel/carriage/rudder.vox
(Stored with Git LFS)
Normal file
BIN
assets/common/voxel/carriage/rudder.vox
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/common/voxel/carriage/structure.vox
(Stored with Git LFS)
Normal file
BIN
assets/common/voxel/carriage/structure.vox
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -1099,6 +1099,7 @@ impl Body {
|
|||||||
ship::Body::Galleon => [-2.0, -5.0, 4.0],
|
ship::Body::Galleon => [-2.0, -5.0, 4.0],
|
||||||
ship::Body::Skiff => [1.0, -2.0, 2.0],
|
ship::Body::Skiff => [1.0, -2.0, 2.0],
|
||||||
ship::Body::Submarine => [1.0, -2.0, 2.0],
|
ship::Body::Submarine => [1.0, -2.0, 2.0],
|
||||||
|
ship::Body::Carriage => [1.0, -2.0, 2.0],
|
||||||
ship::Body::Volume => [0.0, 0.0, 0.0],
|
ship::Body::Volume => [0.0, 0.0, 0.0],
|
||||||
},
|
},
|
||||||
_ => [0.0, 0.0, 0.0],
|
_ => [0.0, 0.0, 0.0],
|
||||||
|
@ -19,7 +19,7 @@ pub const ALL_BODIES: [Body; 6] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
pub const ALL_AIRSHIPS: [Body; 2] = [Body::DefaultAirship, Body::AirBalloon];
|
pub const ALL_AIRSHIPS: [Body; 2] = [Body::DefaultAirship, Body::AirBalloon];
|
||||||
pub const ALL_SHIPS: [Body; 4] = [Body::SailBoat, Body::Galleon, Body::Skiff, Body::Submarine];
|
pub const ALL_SHIPS: [Body; 5] = [Body::SailBoat, Body::Galleon, Body::Skiff, Body::Submarine, Body::Carriage];
|
||||||
|
|
||||||
make_case_elim!(
|
make_case_elim!(
|
||||||
body,
|
body,
|
||||||
@ -33,6 +33,7 @@ make_case_elim!(
|
|||||||
Volume = 4,
|
Volume = 4,
|
||||||
Skiff = 5,
|
Skiff = 5,
|
||||||
Submarine = 6,
|
Submarine = 6,
|
||||||
|
Carriage = 7,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -64,6 +65,7 @@ impl Body {
|
|||||||
Body::Galleon => Some("galleon.structure"),
|
Body::Galleon => Some("galleon.structure"),
|
||||||
Body::Skiff => Some("skiff.structure"),
|
Body::Skiff => Some("skiff.structure"),
|
||||||
Body::Submarine => Some("submarine.structure"),
|
Body::Submarine => Some("submarine.structure"),
|
||||||
|
Body::Carriage => Some("carriage.structure"),
|
||||||
Body::Volume => None,
|
Body::Volume => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -76,6 +78,7 @@ impl Body {
|
|||||||
Body::Galleon => Vec3::new(14.0, 48.0, 10.0),
|
Body::Galleon => Vec3::new(14.0, 48.0, 10.0),
|
||||||
Body::Skiff => Vec3::new(7.0, 15.0, 10.0),
|
Body::Skiff => Vec3::new(7.0, 15.0, 10.0),
|
||||||
Body::Submarine => Vec3::new(2.0, 15.0, 8.0),
|
Body::Submarine => Vec3::new(2.0, 15.0, 8.0),
|
||||||
|
Body::Carriage => Vec3::new(2.0, 15.0, 8.0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,6 +112,7 @@ impl Body {
|
|||||||
match self {
|
match self {
|
||||||
Body::DefaultAirship | Body::AirBalloon | Body::Volume => Density(AIR_DENSITY),
|
Body::DefaultAirship | Body::AirBalloon | Body::Volume => Density(AIR_DENSITY),
|
||||||
Body::Submarine => Density(WATER_DENSITY), // Neutrally buoyant
|
Body::Submarine => Density(WATER_DENSITY), // Neutrally buoyant
|
||||||
|
Body::Carriage => Density(WATER_DENSITY * 0.5),
|
||||||
_ => Density(AIR_DENSITY * 0.95 + WATER_DENSITY * 0.05), /* Most boats should be very
|
_ => Density(AIR_DENSITY * 0.95 + WATER_DENSITY * 0.05), /* Most boats should be very
|
||||||
* buoyant */
|
* buoyant */
|
||||||
}
|
}
|
||||||
@ -123,7 +127,7 @@ impl Body {
|
|||||||
pub fn flying_height(&self) -> f32 { if self.can_fly() { 200.0 } else { 0.0 } }
|
pub fn flying_height(&self) -> f32 { if self.can_fly() { 200.0 } else { 0.0 } }
|
||||||
|
|
||||||
pub fn has_water_thrust(&self) -> bool {
|
pub fn has_water_thrust(&self) -> bool {
|
||||||
!self.can_fly() // TODO: Differentiate this more carefully
|
!self.can_fly() && !matches!(self, Body::Carriage) // TODO: Differentiate this more carefully
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn make_collider(&self) -> Collider {
|
pub fn make_collider(&self) -> Collider {
|
||||||
|
@ -63,6 +63,7 @@ pub struct PreviousPhysCache {
|
|||||||
pub origins: Option<(Vec2<f32>, Vec2<f32>)>,
|
pub origins: Option<(Vec2<f32>, Vec2<f32>)>,
|
||||||
pub pos: Option<Pos>,
|
pub pos: Option<Pos>,
|
||||||
pub ori: Quaternion<f32>,
|
pub ori: Quaternion<f32>,
|
||||||
|
pub pos_interp: Option<Pos>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Component for PreviousPhysCache {
|
impl Component for PreviousPhysCache {
|
||||||
|
@ -6,7 +6,7 @@ use crate::{
|
|||||||
ActiveAbilities, Beam, Body, CharacterActivity, CharacterState, Combo, ControlAction,
|
ActiveAbilities, Beam, Body, CharacterActivity, CharacterState, Combo, ControlAction,
|
||||||
Controller, ControllerInputs, Density, Energy, Health, InputAttr, InputKind, Inventory,
|
Controller, ControllerInputs, Density, Energy, Health, InputAttr, InputKind, Inventory,
|
||||||
InventoryAction, Mass, Melee, Ori, PhysicsState, Pos, Scale, SkillSet, Stance, StateUpdate,
|
InventoryAction, Mass, Melee, Ori, PhysicsState, Pos, Scale, SkillSet, Stance, StateUpdate,
|
||||||
Stats, Vel,
|
Stats, Vel, PreviousPhysCache,
|
||||||
},
|
},
|
||||||
link::Is,
|
link::Is,
|
||||||
mounting::{Rider, VolumeRider},
|
mounting::{Rider, VolumeRider},
|
||||||
@ -149,6 +149,7 @@ pub struct JoinData<'a> {
|
|||||||
pub mount_data: Option<&'a Is<Rider>>,
|
pub mount_data: Option<&'a Is<Rider>>,
|
||||||
pub volume_mount_data: Option<&'a Is<VolumeRider>>,
|
pub volume_mount_data: Option<&'a Is<VolumeRider>>,
|
||||||
pub stance: Option<&'a Stance>,
|
pub stance: Option<&'a Stance>,
|
||||||
|
pub previous_physics: Option<&'a PreviousPhysCache>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct JoinStruct<'a> {
|
pub struct JoinStruct<'a> {
|
||||||
@ -179,6 +180,7 @@ pub struct JoinStruct<'a> {
|
|||||||
pub mount_data: Option<&'a Is<Rider>>,
|
pub mount_data: Option<&'a Is<Rider>>,
|
||||||
pub volume_mount_data: Option<&'a Is<VolumeRider>>,
|
pub volume_mount_data: Option<&'a Is<VolumeRider>>,
|
||||||
pub stance: Option<&'a Stance>,
|
pub stance: Option<&'a Stance>,
|
||||||
|
pub previous_physics: Option<&'a PreviousPhysCache>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> JoinData<'a> {
|
impl<'a> JoinData<'a> {
|
||||||
@ -223,6 +225,7 @@ impl<'a> JoinData<'a> {
|
|||||||
mount_data: j.mount_data,
|
mount_data: j.mount_data,
|
||||||
volume_mount_data: j.volume_mount_data,
|
volume_mount_data: j.volume_mount_data,
|
||||||
stance: j.stance,
|
stance: j.stance,
|
||||||
|
previous_physics: j.previous_physics,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -146,6 +146,7 @@ impl Body {
|
|||||||
quadruped_low::Species::Deadwood => 140.0,
|
quadruped_low::Species::Deadwood => 140.0,
|
||||||
quadruped_low::Species::Mossdrake => 100.0,
|
quadruped_low::Species::Mossdrake => 100.0,
|
||||||
},
|
},
|
||||||
|
Body::Ship(ship::Body::Carriage) => 250.0,
|
||||||
Body::Ship(_) => 0.0,
|
Body::Ship(_) => 0.0,
|
||||||
Body::Arthropod(arthropod) => match arthropod.species {
|
Body::Arthropod(arthropod) => match arthropod.species {
|
||||||
arthropod::Species::Tarantula => 135.0,
|
arthropod::Species::Tarantula => 135.0,
|
||||||
@ -220,6 +221,7 @@ impl Body {
|
|||||||
quadruped_low::Species::Mossdrake => 1.7,
|
quadruped_low::Species::Mossdrake => 1.7,
|
||||||
_ => 2.0,
|
_ => 2.0,
|
||||||
},
|
},
|
||||||
|
Body::Ship(ship::Body::Carriage) => 0.6,
|
||||||
Body::Ship(ship) if ship.has_water_thrust() => 5.0 / self.dimensions().y,
|
Body::Ship(ship) if ship.has_water_thrust() => 5.0 / self.dimensions().y,
|
||||||
Body::Ship(_) => 6.0 / self.dimensions().y,
|
Body::Ship(_) => 6.0 / self.dimensions().y,
|
||||||
Body::Arthropod(_) => 3.5,
|
Body::Arthropod(_) => 3.5,
|
||||||
@ -587,6 +589,13 @@ pub fn handle_orientation(
|
|||||||
(a.to_quat().into_vec4() - b.to_quat().into_vec4()).reduce(|a, b| a.abs() + b.abs())
|
(a.to_quat().into_vec4() - b.to_quat().into_vec4()).reduce(|a, b| a.abs() + b.abs())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let pitch = if matches!(data.body, Body::Ship(ship::Body::Carriage)) {
|
||||||
|
let change = (data.pos.0 - data.previous_physics.and_then(|p| p.pos_interp).unwrap_or(*data.pos).0) / data.dt.0;
|
||||||
|
change.z / change.xy().magnitude().max(1.0)
|
||||||
|
} else {
|
||||||
|
0.0
|
||||||
|
};
|
||||||
|
|
||||||
// Direction is set to the override if one is provided, else if entity is
|
// Direction is set to the override if one is provided, else if entity is
|
||||||
// strafing or attacking the horiontal component of the look direction is used,
|
// strafing or attacking the horiontal component of the look direction is used,
|
||||||
// else the current horizontal movement direction is used
|
// else the current horizontal movement direction is used
|
||||||
@ -601,7 +610,8 @@ pub fn handle_orientation(
|
|||||||
} else {
|
} else {
|
||||||
Dir::from_unnormalized(data.inputs.move_dir.into())
|
Dir::from_unnormalized(data.inputs.move_dir.into())
|
||||||
.map_or_else(|| to_horizontal_fast(data.ori), |dir| dir.into())
|
.map_or_else(|| to_horizontal_fast(data.ori), |dir| dir.into())
|
||||||
};
|
}
|
||||||
|
.pitched_up(pitch);
|
||||||
// unit is multiples of 180°
|
// unit is multiples of 180°
|
||||||
let half_turns_per_tick = data.body.base_ori_rate() / data.scale.map_or(1.0, |s| s.0.sqrt())
|
let half_turns_per_tick = data.body.base_ori_rate() / data.scale.map_or(1.0, |s| s.0.sqrt())
|
||||||
* efficiency
|
* efficiency
|
||||||
|
@ -10,7 +10,7 @@ use common::{
|
|||||||
inventory::item::{tool::AbilityMap, MaterialStatManifest},
|
inventory::item::{tool::AbilityMap, MaterialStatManifest},
|
||||||
ActiveAbilities, Beam, Body, CharacterActivity, CharacterState, Combo, Controller, Density,
|
ActiveAbilities, Beam, Body, CharacterActivity, CharacterState, Combo, Controller, Density,
|
||||||
Energy, Health, Inventory, InventoryManip, Mass, Melee, Ori, PhysicsState, Poise, Pos,
|
Energy, Health, Inventory, InventoryManip, Mass, Melee, Ori, PhysicsState, Poise, Pos,
|
||||||
Scale, SkillSet, Stance, StateUpdate, Stats, Vel,
|
Scale, SkillSet, Stance, StateUpdate, Stats, Vel, PreviousPhysCache,
|
||||||
},
|
},
|
||||||
event::{EventBus, LocalEvent, ServerEvent},
|
event::{EventBus, LocalEvent, ServerEvent},
|
||||||
link::Is,
|
link::Is,
|
||||||
@ -54,6 +54,7 @@ pub struct ReadData<'a> {
|
|||||||
terrain: ReadExpect<'a, TerrainGrid>,
|
terrain: ReadExpect<'a, TerrainGrid>,
|
||||||
inventories: ReadStorage<'a, Inventory>,
|
inventories: ReadStorage<'a, Inventory>,
|
||||||
stances: ReadStorage<'a, Stance>,
|
stances: ReadStorage<'a, Stance>,
|
||||||
|
previous_physics: ReadStorage<'a, PreviousPhysCache>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ## Character Behavior System
|
/// ## Character Behavior System
|
||||||
@ -120,7 +121,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
controller,
|
controller,
|
||||||
health,
|
health,
|
||||||
body,
|
body,
|
||||||
(physics, scale, stat, skill_set, active_abilities, is_rider),
|
(physics, scale, stat, skill_set, active_abilities, previous_physics, is_rider),
|
||||||
combo,
|
combo,
|
||||||
) in (
|
) in (
|
||||||
&read_data.entities,
|
&read_data.entities,
|
||||||
@ -143,6 +144,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
&read_data.stats,
|
&read_data.stats,
|
||||||
&read_data.skill_sets,
|
&read_data.skill_sets,
|
||||||
read_data.active_abilities.maybe(),
|
read_data.active_abilities.maybe(),
|
||||||
|
read_data.previous_physics.maybe(),
|
||||||
read_data.is_riders.maybe(),
|
read_data.is_riders.maybe(),
|
||||||
),
|
),
|
||||||
read_data.combos.maybe(),
|
read_data.combos.maybe(),
|
||||||
@ -210,6 +212,7 @@ impl<'a> System<'a> for Sys {
|
|||||||
mount_data: read_data.is_riders.get(entity),
|
mount_data: read_data.is_riders.get(entity),
|
||||||
volume_mount_data: read_data.is_volume_riders.get(entity),
|
volume_mount_data: read_data.is_volume_riders.get(entity),
|
||||||
stance: read_data.stances.get(entity),
|
stance: read_data.stances.get(entity),
|
||||||
|
previous_physics,
|
||||||
};
|
};
|
||||||
|
|
||||||
for action in actions {
|
for action in actions {
|
||||||
|
@ -218,6 +218,7 @@ impl<'a> PhysicsData<'a> {
|
|||||||
origins: None,
|
origins: None,
|
||||||
pos: None,
|
pos: None,
|
||||||
ori: Quaternion::identity(),
|
ori: Quaternion::identity(),
|
||||||
|
pos_interp: None,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -744,6 +745,9 @@ impl<'a> PhysicsData<'a> {
|
|||||||
// it did not work (investigate root cause?)
|
// it did not work (investigate root cause?)
|
||||||
previous_phys_cache.pos = Some(*pos);
|
previous_phys_cache.pos = Some(*pos);
|
||||||
previous_phys_cache.ori = ori.to_quat();
|
previous_phys_cache.ori = ori.to_quat();
|
||||||
|
previous_phys_cache.pos_interp = Some(Pos(
|
||||||
|
previous_phys_cache.pos_interp.unwrap_or(*pos).0 * 0.85 + pos.0 * 0.15,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
drop(guard);
|
drop(guard);
|
||||||
}
|
}
|
||||||
|
@ -109,6 +109,7 @@ impl<'a> From<&'a Body> for SkeletonAttr {
|
|||||||
Galleon => (0.0, 0.0, 0.0),
|
Galleon => (0.0, 0.0, 0.0),
|
||||||
Skiff => (0.0, 0.0, 0.0),
|
Skiff => (0.0, 0.0, 0.0),
|
||||||
Submarine => (0.0, 0.0, 0.0),
|
Submarine => (0.0, 0.0, 0.0),
|
||||||
|
Carriage => (0.0, 0.0, 0.0),
|
||||||
Volume => (0.0, 0.0, 0.0),
|
Volume => (0.0, 0.0, 0.0),
|
||||||
},
|
},
|
||||||
bone1: match body {
|
bone1: match body {
|
||||||
@ -118,6 +119,7 @@ impl<'a> From<&'a Body> for SkeletonAttr {
|
|||||||
Galleon => (0.0, 0.0, 0.0),
|
Galleon => (0.0, 0.0, 0.0),
|
||||||
Skiff => (0.0, 0.0, 0.0),
|
Skiff => (0.0, 0.0, 0.0),
|
||||||
Submarine => (0.0, -15.0, 3.5),
|
Submarine => (0.0, -15.0, 3.5),
|
||||||
|
Carriage => (0.0, 0.0, 0.0),
|
||||||
Volume => (0.0, 0.0, 0.0),
|
Volume => (0.0, 0.0, 0.0),
|
||||||
},
|
},
|
||||||
bone2: match body {
|
bone2: match body {
|
||||||
@ -127,6 +129,7 @@ impl<'a> From<&'a Body> for SkeletonAttr {
|
|||||||
Galleon => (0.0, 0.0, 0.0),
|
Galleon => (0.0, 0.0, 0.0),
|
||||||
Skiff => (0.0, 0.0, 0.0),
|
Skiff => (0.0, 0.0, 0.0),
|
||||||
Submarine => (0.0, 0.0, 0.0),
|
Submarine => (0.0, 0.0, 0.0),
|
||||||
|
Carriage => (0.0, 0.0, 0.0),
|
||||||
Volume => (0.0, 0.0, 0.0),
|
Volume => (0.0, 0.0, 0.0),
|
||||||
},
|
},
|
||||||
bone3: match body {
|
bone3: match body {
|
||||||
@ -136,6 +139,7 @@ impl<'a> From<&'a Body> for SkeletonAttr {
|
|||||||
Galleon => (0.0, 0.0, 0.0),
|
Galleon => (0.0, 0.0, 0.0),
|
||||||
Skiff => (0.0, 0.0, 0.0),
|
Skiff => (0.0, 0.0, 0.0),
|
||||||
Submarine => (0.0, -18.0, 3.5),
|
Submarine => (0.0, -18.0, 3.5),
|
||||||
|
Carriage => (0.0, 0.0, 0.0),
|
||||||
Volume => (0.0, 0.0, 0.0),
|
Volume => (0.0, 0.0, 0.0),
|
||||||
},
|
},
|
||||||
bone1_prop_trail_offset: match body {
|
bone1_prop_trail_offset: match body {
|
||||||
|
Loading…
Reference in New Issue
Block a user