mirror of
https://codeberg.org/icewind/vbsp.git
synced 2026-06-03 10:44:07 +02:00
prepare for release
This commit is contained in:
parent
adf79d70a1
commit
472d2106aa
8 changed files with 86 additions and 708 deletions
45
Cargo.lock
generated
45
Cargo.lock
generated
|
|
@ -899,10 +899,40 @@ dependencies = [
|
|||
"serde",
|
||||
"static_assertions",
|
||||
"thiserror 2.0.11",
|
||||
"vdf-reader",
|
||||
"vbsp-entities-tf2",
|
||||
"vdf-reader 0.3.0",
|
||||
"zip-lzma",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "vbsp"
|
||||
version = "0.7.0"
|
||||
source = "git+https://github.com/krakow10/vbsp?rev=06ac1fdd29618db154a81fbc4ceb3cfe558d2671#06ac1fdd29618db154a81fbc4ceb3cfe558d2671"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"arrayvec",
|
||||
"binrw",
|
||||
"bitflags",
|
||||
"bv",
|
||||
"cgmath",
|
||||
"itertools 0.14.0",
|
||||
"lzma-rs",
|
||||
"num_enum",
|
||||
"serde",
|
||||
"static_assertions",
|
||||
"thiserror 2.0.11",
|
||||
"vdf-reader 0.2.0",
|
||||
"zip-lzma",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "vbsp-entities-tf2"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"vbsp 0.7.0 (git+https://github.com/krakow10/vbsp?rev=06ac1fdd29618db154a81fbc4ceb3cfe558d2671)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "vdf-reader"
|
||||
version = "0.2.0"
|
||||
|
|
@ -916,6 +946,19 @@ dependencies = [
|
|||
"thiserror 1.0.69",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "vdf-reader"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4c92e6cbd97e3aefd917c537080b085a4cb926461dddf98daab9a370972ffdfe"
|
||||
dependencies = [
|
||||
"logos",
|
||||
"miette",
|
||||
"parse-display",
|
||||
"serde",
|
||||
"thiserror 2.0.11",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.9.5"
|
||||
|
|
|
|||
11
Cargo.toml
11
Cargo.toml
|
|
@ -25,24 +25,17 @@ zip = { package = "zip-lzma", version = "0.6.3", default-features = false, featu
|
|||
itertools = "0.14.0"
|
||||
ahash = "0.8.11"
|
||||
serde = "1.0.218"
|
||||
vdf-reader = "0.2.0"
|
||||
vdf-reader = "0.3.0"
|
||||
|
||||
[dev-dependencies]
|
||||
obj = "0.10"
|
||||
main_error = "0.1.2"
|
||||
criterion = "0.5.1"
|
||||
vbsp-entities-tf2 = { version = "0.1.0-egg", path = "../rust/vbsp-entities/tf2" }
|
||||
|
||||
[profile.dev]
|
||||
opt-level = 2
|
||||
|
||||
[features]
|
||||
default = ["basic"]
|
||||
basic = []
|
||||
|
||||
[[bench]]
|
||||
name = "bench"
|
||||
harness = false
|
||||
|
||||
[[example]]
|
||||
name = "parse"
|
||||
required-features = ["basic"]
|
||||
|
|
|
|||
|
|
@ -1,13 +1,10 @@
|
|||
#[allow(unused_imports)]
|
||||
use std::ops::Deref;
|
||||
|
||||
fn main() -> Result<(), vbsp::BspError> {
|
||||
let mut args = std::env::args();
|
||||
let _ = args.next();
|
||||
let data = std::fs::read(args.next().expect("No demo file provided"))?;
|
||||
let bsp = vbsp::Bsp::read(&data)?;
|
||||
for prop in bsp.entities.iter() {
|
||||
match prop.parse::<vbsp::basic::Entity>() {
|
||||
match prop.parse::<vbsp::GenericEntity>() {
|
||||
Ok(prop) => {
|
||||
println!("{:#?}", prop)
|
||||
}
|
||||
|
|
|
|||
20
examples/parse_tf_entities.rs
Normal file
20
examples/parse_tf_entities.rs
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
use vbsp_entities_tf2::Entity;
|
||||
|
||||
fn main() -> Result<(), vbsp::BspError> {
|
||||
let mut args = std::env::args();
|
||||
let _ = args.next();
|
||||
let data = std::fs::read(args.next().expect("No demo file provided"))?;
|
||||
let bsp = vbsp::Bsp::read(&data)?;
|
||||
for prop in bsp.entities.iter() {
|
||||
match prop.parse::<Entity>() {
|
||||
Ok(prop) => {
|
||||
println!("{:#?}", prop)
|
||||
}
|
||||
Err(e) => {
|
||||
println!("Failed parsing {}: {:#}", prop.as_str(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
18
flake.lock
generated
18
flake.lock
generated
|
|
@ -2,11 +2,11 @@
|
|||
"nodes": {
|
||||
"crane": {
|
||||
"locked": {
|
||||
"lastModified": 1733688869,
|
||||
"narHash": "sha256-KrhxxFj1CjESDrL5+u/zsVH0K+Ik9tvoac/oFPoxSB8=",
|
||||
"lastModified": 1739936662,
|
||||
"narHash": "sha256-x4syUjNUuRblR07nDPeLDP7DpphaBVbUaSoeZkFbGSk=",
|
||||
"owner": "ipetkov",
|
||||
"repo": "crane",
|
||||
"rev": "604637106e420ad99907cae401e13ab6b452e7d9",
|
||||
"rev": "19de14aaeb869287647d9461cbd389187d8ecdb7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -44,11 +44,11 @@
|
|||
"rust-overlay": "rust-overlay"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1735052218,
|
||||
"narHash": "sha256-I30wh6G8fSUO4EseexxiDXcxyUhXR6C8BvEeKn6xyfE=",
|
||||
"lastModified": 1740783063,
|
||||
"narHash": "sha256-nJ/tvNBWFNJtwtNG/KsqtVq4p3aitkEb1pRW0qHvmsk=",
|
||||
"owner": "icewind1991",
|
||||
"repo": "mill-scale",
|
||||
"rev": "7e45bb598ff63a8416ee3c26743b20644563bd93",
|
||||
"rev": "591ea924cfd3cd7932b385341fb0aad0a935bb46",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -88,11 +88,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1733884434,
|
||||
"narHash": "sha256-8GXR9kC07dyOIshAyfZhG11xfvBRSZzYghnZ2weOKJU=",
|
||||
"lastModified": 1740277845,
|
||||
"narHash": "sha256-NNU0CdiaSbAeZ8tpDG4aFi9qtcdlItRvk8Xns9oBrVU=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "d0483df44ddf0fd1985f564abccbe568e020ddf2",
|
||||
"rev": "f933070c29f9c1c5457447a51903f27f76ebb519",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
|
|||
|
|
@ -2,14 +2,13 @@ use crate::error::EntityParseError;
|
|||
use crate::{Angles, Vector};
|
||||
use serde::de::{Error, Unexpected};
|
||||
use serde::{Deserialize, Deserializer};
|
||||
use std::collections::HashMap;
|
||||
use std::fmt;
|
||||
use std::fmt::Debug;
|
||||
use std::str::FromStr;
|
||||
use vdf_reader::entry::Entry;
|
||||
use vdf_reader::VdfError;
|
||||
|
||||
#[cfg(feature = "basic")]
|
||||
pub mod basic;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Entities {
|
||||
pub entities: String,
|
||||
|
|
@ -367,3 +366,11 @@ impl serde::de::Visitor<'_> for BoolVisitor {
|
|||
pub fn deserialize_bool<'de, D: Deserializer<'de>>(deserializer: D) -> Result<bool, D::Error> {
|
||||
deserializer.deserialize_any(BoolVisitor)
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
pub struct GenericEntity {
|
||||
#[serde(rename = "classname")]
|
||||
pub class: String,
|
||||
#[serde(flatten)]
|
||||
pub data: HashMap<String, Entry>,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,656 +0,0 @@
|
|||
use crate::deserialize_bool;
|
||||
use crate::{Angles, Color, LightColor, Negated, Vector};
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
#[non_exhaustive]
|
||||
#[serde(tag = "classname")]
|
||||
pub enum Entity<'a> {
|
||||
#[serde(rename = "point_spotlight")]
|
||||
SpotLight(SpotLight),
|
||||
#[serde(rename = "light")]
|
||||
Light(Light),
|
||||
#[serde(rename = "light_spot")]
|
||||
LightSpot(LightSpot),
|
||||
#[serde(rename = "prop_dynamic")]
|
||||
#[serde(borrow)]
|
||||
PropDynamic(PropDynamic<'a>),
|
||||
#[serde(rename = "prop_dynamic_override")]
|
||||
#[serde(borrow)]
|
||||
PropDynamicOverride(PropDynamicOverride<'a>),
|
||||
#[serde(rename = "prop_physics_multiplayer")]
|
||||
#[serde(borrow)]
|
||||
PropPhysics(PropDynamic<'a>),
|
||||
#[serde(rename = "env_sprite")]
|
||||
#[serde(borrow)]
|
||||
EnvSprite(EnvSprite<'a>),
|
||||
#[serde(rename = "info_player_teamspawn")]
|
||||
#[serde(borrow)]
|
||||
Spawn(Spawn<'a>),
|
||||
#[serde(rename = "func_regenerate")]
|
||||
#[serde(borrow)]
|
||||
Regenerate(Regenerate<'a>),
|
||||
#[serde(rename = "func_respawnroom")]
|
||||
RespawnRoom(RespawnRoom<'a>),
|
||||
#[serde(rename = "func_door")]
|
||||
Door(Door<'a>),
|
||||
#[serde(rename = "worldspawn")]
|
||||
WorldSpawn(WorldSpawn<'a>),
|
||||
#[serde(rename = "info_observer_point")]
|
||||
#[serde(borrow)]
|
||||
ObserverPoint(ObserverPoint<'a>),
|
||||
#[serde(rename = "func_brush")]
|
||||
#[serde(borrow)]
|
||||
Brush(BrushEntity<'a>),
|
||||
#[serde(rename = "func_illusionary")]
|
||||
#[serde(borrow)]
|
||||
BrushIllusionary(BrushEntity<'a>),
|
||||
#[serde(rename = "func_wall")]
|
||||
#[serde(borrow)]
|
||||
BrushWall(BrushEntity<'a>),
|
||||
#[serde(rename = "func_wall_toggle")]
|
||||
#[serde(borrow)]
|
||||
BrushWallToggle(BrushEntity<'a>),
|
||||
#[serde(rename = "item_ammopack_small")]
|
||||
AmmoPackSmall(AmmoPack),
|
||||
#[serde(rename = "item_ammopack_medium")]
|
||||
AmmoPackMedium(AmmoPack),
|
||||
#[serde(rename = "item_ammopack_full")]
|
||||
HealthPackFull(HealthPack),
|
||||
#[serde(rename = "item_healthkit_small")]
|
||||
HealthPackSmall(HealthPack),
|
||||
#[serde(rename = "item_healthkit_medium")]
|
||||
HealthPackMedium(HealthPack),
|
||||
#[serde(rename = "item_healthkit_full")]
|
||||
AmmoPackFull(AmmoPack),
|
||||
#[serde(rename = "env_lightglow")]
|
||||
LightGlow(LightGlow),
|
||||
#[serde(rename = "trigger_multiple")]
|
||||
#[serde(borrow)]
|
||||
TriggerMultiple(TriggerMultiple<'a>),
|
||||
#[serde(rename = "logic_relay")]
|
||||
LogicRelay(LogicRelay<'a>),
|
||||
#[serde(rename = "filter_activator_tfteam")]
|
||||
#[serde(borrow)]
|
||||
FilterActivatorTeam(FilterActivatorTeam<'a>),
|
||||
#[serde(rename = "logic_auto")]
|
||||
LogicAuto(LogicAuto<'a>),
|
||||
#[serde(rename = "func_dustmotes")]
|
||||
DustMotes(DustMotes<'a>),
|
||||
#[serde(rename = "sky_camera")]
|
||||
SkyCamera(SkyCamera),
|
||||
#[serde(rename = "path_track")]
|
||||
PathTrack(PathTrack<'a>),
|
||||
#[serde(rename = "env_soundscape_proxy")]
|
||||
#[serde(borrow)]
|
||||
SoundScapeProxy(SoundScapeProxy<'a>),
|
||||
#[serde(rename = "func_respawnroomvisualizer")]
|
||||
#[serde(borrow)]
|
||||
RespawnVisualizer(RespawnVisualizer<'a>),
|
||||
#[serde(rename = "info_particle_system")]
|
||||
#[serde(borrow)]
|
||||
ParticleSystem(ParticleSystem<'a>),
|
||||
#[serde(rename = "team_control_point")]
|
||||
#[serde(borrow)]
|
||||
TeamControlPoint(TeamControlPoint<'a>),
|
||||
#[serde(rename = "func_areaportal")]
|
||||
AreaPortal(AreaPortal),
|
||||
#[serde(rename = "game_text")]
|
||||
#[serde(borrow)]
|
||||
GameText(GameText<'a>),
|
||||
#[serde(rename = "keyframe_rope")]
|
||||
#[serde(borrow)]
|
||||
RopeKeyFrame(RopeKeyFrame<'a>),
|
||||
#[serde(rename = "move_rope")]
|
||||
RopeMove(RopeMove<'a>),
|
||||
#[serde(rename = "tf_gamerules")]
|
||||
#[serde(borrow)]
|
||||
GameRules(GameRules<'a>),
|
||||
#[serde(rename = "tf_logic_koth")]
|
||||
KothLogic(KothLogic),
|
||||
#[serde(rename = "ambient_generic")]
|
||||
#[serde(borrow)]
|
||||
AmbientGeneric(AmbientGeneric<'a>),
|
||||
#[serde(rename = "logic_case")]
|
||||
#[serde(borrow)]
|
||||
LogicCase(LogicCase<'a>),
|
||||
#[serde(rename = "func_occluder")]
|
||||
#[serde(borrow)]
|
||||
Occluder(Occluder<'a>),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct Light {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "_light")]
|
||||
pub light: LightColor,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct SpotLight {
|
||||
pub origin: Vector,
|
||||
pub angles: Angles,
|
||||
#[serde(rename = "rendercolor")]
|
||||
pub color: Color,
|
||||
#[serde(rename = "spotlightwidth")]
|
||||
pub cone: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct LightSpot {
|
||||
pub origin: Vector,
|
||||
pub angles: Angles,
|
||||
#[serde(rename = "_light")]
|
||||
pub light: LightColor,
|
||||
#[serde(rename = "_cone")]
|
||||
pub cone: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PropDynamic<'a> {
|
||||
pub angles: Angles,
|
||||
#[serde(rename = "disablereceiveshadows", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub disable_receive_shadows: bool,
|
||||
#[serde(rename = "disableshadows", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub disable_shadows: bool,
|
||||
#[serde(rename = "modelscale")]
|
||||
pub scale: f32,
|
||||
pub model: &'a str,
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "rendercolor")]
|
||||
pub color: Color,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub name: Option<&'a str>,
|
||||
#[serde(rename = "parentname", default)]
|
||||
pub parent: Option<&'a str>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PropDynamicOverride<'a> {
|
||||
pub angles: Angles,
|
||||
#[serde(rename = "disablereceiveshadows", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub disable_receive_shadows: bool,
|
||||
#[serde(rename = "disableshadows", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub disable_shadows: bool,
|
||||
#[serde(rename = "modelscale")]
|
||||
pub scale: f32,
|
||||
pub model: &'a str,
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "rendercolor")]
|
||||
pub color: Color,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub name: Option<&'a str>,
|
||||
#[serde(rename = "parentname", default)]
|
||||
pub parent: Option<&'a str>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct EnvSprite<'a> {
|
||||
pub origin: Vector,
|
||||
pub scale: f32,
|
||||
pub model: &'a str,
|
||||
#[serde(rename = "rendercolor")]
|
||||
pub color: Color,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct Spawn<'a> {
|
||||
pub origin: Vector,
|
||||
pub angles: Angles,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub target: Option<&'a str>,
|
||||
#[serde(rename = "controlpoint", default)]
|
||||
pub control_point: Option<&'a str>,
|
||||
#[serde(rename = "startdisabled", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub start_disabled: bool,
|
||||
#[serde(rename = "teamnum")]
|
||||
pub team: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct RespawnRoom<'a> {
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub target: Option<&'a str>,
|
||||
pub model: &'a str,
|
||||
#[serde(rename = "startdisabled", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub start_disabled: bool,
|
||||
#[serde(rename = "teamnum")]
|
||||
pub team: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct Regenerate<'a> {
|
||||
#[serde(rename = "associatedmodel")]
|
||||
pub associated_model: &'a str,
|
||||
pub model: &'a str,
|
||||
#[serde(rename = "teamnum")]
|
||||
pub team: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct Door<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub target: &'a str,
|
||||
pub speed: f32,
|
||||
#[serde(rename = "forceclosed", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub force_closed: bool,
|
||||
#[serde(rename = "movedir")]
|
||||
pub move_direction: Vector,
|
||||
pub model: &'a str,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct AmmoPack {
|
||||
pub origin: Vector,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct HealthPack {
|
||||
pub origin: Vector,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct WorldSpawn<'a> {
|
||||
#[serde(rename = "world_mins")]
|
||||
pub min: Vector,
|
||||
#[serde(rename = "world_maxs")]
|
||||
pub max: Vector,
|
||||
#[serde(rename = "detailvbsp")]
|
||||
pub detail_vbsp: &'a str,
|
||||
#[serde(rename = "detailmaterial")]
|
||||
pub detail_material: &'a str,
|
||||
#[serde(default)]
|
||||
pub comment: Option<&'a str>,
|
||||
#[serde(rename = "skyname")]
|
||||
pub skybox: &'a str,
|
||||
#[serde(rename = "mapversion")]
|
||||
pub version: u32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct ObserverPoint<'a> {
|
||||
#[serde(rename = "startdisabled", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub start_disabled: bool,
|
||||
pub angles: Angles,
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub target: Option<&'a str>,
|
||||
#[serde(rename = "parentname", default)]
|
||||
pub parent: Option<&'a str>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct BrushEntity<'a> {
|
||||
pub model: &'a str,
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "startdisabled", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub start_disabled: bool,
|
||||
#[serde(rename = "rendercolor")]
|
||||
pub color: Color,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct LightGlow {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "verticalglowsize")]
|
||||
pub vertical_size: u32,
|
||||
#[serde(rename = "horizontalhlowsize")]
|
||||
pub horizontal_size: u32,
|
||||
#[serde(rename = "startdisabled", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub start_disabled: bool,
|
||||
#[serde(rename = "rendercolor")]
|
||||
pub color: Color,
|
||||
#[serde(rename = "mindist")]
|
||||
pub min_distance: u32,
|
||||
#[serde(rename = "maxdist")]
|
||||
pub max_distance: u32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct TriggerMultiple<'a> {
|
||||
pub model: &'a str,
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "onstarttouch", default)]
|
||||
pub start_touch: Option<&'a str>,
|
||||
#[serde(rename = "onstarttouchall", default)]
|
||||
pub start_touch_all: Option<&'a str>,
|
||||
#[serde(rename = "onendtouch", default)]
|
||||
pub end_touch: Option<&'a str>,
|
||||
#[serde(rename = "onendtouchall", default)]
|
||||
pub end_touch_all: Option<&'a str>,
|
||||
#[serde(rename = "onnottouching", default)]
|
||||
pub not_touching: Option<&'a str>,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub target_name: Option<&'a str>,
|
||||
#[serde(rename = "filtername", default)]
|
||||
pub filter: Option<&'a str>,
|
||||
pub wait: Option<u32>,
|
||||
#[serde(rename = "startdisabled", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub start_disabled: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct FilterActivatorTeam<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub target_name: Option<&'a str>,
|
||||
#[serde(rename = "negated", default)]
|
||||
pub negated: Option<Negated>,
|
||||
#[serde(rename = "teamnum", default)]
|
||||
pub team: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct LogicRelay<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub target_name: Option<&'a str>,
|
||||
#[serde(rename = "ontrigger", default)]
|
||||
pub on_trigger: Option<&'a str>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct LogicAuto<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "onmapspawn", default)]
|
||||
pub on_map_spawn: Option<&'a str>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct DustMotes<'a> {
|
||||
#[serde(default)]
|
||||
pub origin: Vector,
|
||||
pub model: &'a str,
|
||||
#[serde(rename = "startdisabled", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub start_disabled: bool,
|
||||
#[serde(rename = "color")]
|
||||
pub color: Color,
|
||||
#[serde(rename = "spawnrate")]
|
||||
pub spawn_rate: u32,
|
||||
#[serde(rename = "sizemin")]
|
||||
pub size_min: u32,
|
||||
#[serde(rename = "sizemax")]
|
||||
pub size_max: u32,
|
||||
#[serde(rename = "alpha")]
|
||||
pub alpha: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct SkyCamera {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "fogenable")]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub fog: bool,
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub use_angles: bool,
|
||||
#[serde(rename = "fogstart")]
|
||||
pub fog_start: f32,
|
||||
#[serde(rename = "fogend")]
|
||||
pub fog_end: f32,
|
||||
pub angles: Angles,
|
||||
#[serde(rename = "fogdir")]
|
||||
pub direction: Vector,
|
||||
pub scale: u32,
|
||||
#[serde(rename = "fogcolor")]
|
||||
pub color: Color,
|
||||
#[serde(rename = "fogcolor2", default)]
|
||||
pub color2: Option<Color>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct PathTrack<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(default)]
|
||||
pub target: Option<&'a str>,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub target_name: Option<&'a str>,
|
||||
#[serde(rename = "orientationtype", default)]
|
||||
pub orientation_type: u8,
|
||||
pub angles: Angles,
|
||||
pub radius: f32,
|
||||
pub speed: f32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct SoundScapeProxy<'a> {
|
||||
pub origin: Vector,
|
||||
pub radius: f32,
|
||||
#[serde(rename = "mainsoundscapename")]
|
||||
pub main_name: &'a str,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct RespawnVisualizer<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "respawnroomname")]
|
||||
pub room_name: &'a str,
|
||||
#[serde(rename = "rendercolor")]
|
||||
pub color: Color,
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub solid_to_enemies: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct ParticleSystem<'a> {
|
||||
pub origin: Vector,
|
||||
pub angles: Angles,
|
||||
#[serde(rename = "targetname")]
|
||||
pub target_name: Option<&'a str>,
|
||||
pub effect_name: &'a str,
|
||||
#[serde(default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub start_active: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct TeamControlPoint<'a> {
|
||||
pub origin: Vector,
|
||||
pub angles: Angles,
|
||||
#[serde(rename = "targetname")]
|
||||
pub target_name: &'a str,
|
||||
pub point_warn_sound: &'a str,
|
||||
pub team_model_0: &'a str,
|
||||
pub team_model_2: &'a str,
|
||||
pub team_model_3: &'a str,
|
||||
pub team_icon_0: &'a str,
|
||||
pub team_icon_2: &'a str,
|
||||
pub team_icon_3: &'a str,
|
||||
#[serde(default)]
|
||||
pub point_default_owner: u8,
|
||||
#[serde(rename = "startdisabled", default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub start_disabled: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct AreaPortal {
|
||||
#[serde(rename = "portalversion")]
|
||||
pub version: u8,
|
||||
#[serde(rename = "portalnumber")]
|
||||
pub number: u8,
|
||||
#[serde(rename = "startopen")]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub start_open: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct GameText<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub target_name: Option<&'a str>,
|
||||
pub message: &'a str,
|
||||
pub color: Color,
|
||||
#[serde(rename = "fadein")]
|
||||
pub fade_in: f32,
|
||||
#[serde(rename = "fadeout")]
|
||||
pub fade_out: f32,
|
||||
pub x: f32,
|
||||
pub y: f32,
|
||||
#[serde(rename = "holdtime")]
|
||||
pub hold_time: f32,
|
||||
#[serde(rename = "fxtime")]
|
||||
pub fx_time: f32,
|
||||
pub channel: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct RopeKeyFrame<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub target_name: Option<&'a str>,
|
||||
#[serde(rename = "ropematerial")]
|
||||
pub material: &'a str,
|
||||
#[serde(rename = "dangling")]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub dangling: bool,
|
||||
#[serde(rename = "barbed")]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub barbed: bool,
|
||||
#[serde(rename = "breakable")]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub breakable: bool,
|
||||
#[serde(rename = "texturescale")]
|
||||
pub texture_scale: f32,
|
||||
#[serde(rename = "collide")]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub collide: bool,
|
||||
#[serde(rename = "width")]
|
||||
pub width: f32,
|
||||
#[serde(rename = "slack")]
|
||||
pub slack: f32,
|
||||
#[serde(rename = "movespeed")]
|
||||
pub move_speed: f32,
|
||||
#[serde(rename = "subdiv")]
|
||||
pub sub_div: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct RopeMove<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "ropematerial")]
|
||||
pub material: &'a str,
|
||||
#[serde(rename = "texturescale")]
|
||||
pub texture_scale: f32,
|
||||
#[serde(rename = "slack")]
|
||||
pub slack: f32,
|
||||
#[serde(rename = "width")]
|
||||
pub width: f32,
|
||||
#[serde(rename = "dangling")]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub dangling: bool,
|
||||
#[serde(rename = "barbed")]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub barbed: bool,
|
||||
#[serde(rename = "breakable")]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub breakable: bool,
|
||||
#[serde(rename = "positioninterpolator")]
|
||||
pub interpolator: u8,
|
||||
#[serde(rename = "movespeed")]
|
||||
pub move_speed: f32,
|
||||
#[serde(rename = "type")]
|
||||
pub ty: u8,
|
||||
#[serde(rename = "nextkey")]
|
||||
pub next_key: &'a str,
|
||||
#[serde(rename = "subdiv")]
|
||||
pub sub_div: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct GameRules<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "targetname", default)]
|
||||
pub target_name: Option<&'a str>,
|
||||
#[serde(default)]
|
||||
#[serde(deserialize_with = "deserialize_bool")]
|
||||
pub ctf_overtime: bool,
|
||||
#[serde(default)]
|
||||
pub hud_type: u32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub struct KothLogic {
|
||||
pub origin: Vector,
|
||||
pub unlock_point: u32,
|
||||
pub timer_length: u32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
pub struct AmbientGeneric<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "volstart", default)]
|
||||
pub volume_start: f32,
|
||||
#[serde(rename = "spin_up", default)]
|
||||
pub spin_up: f32,
|
||||
#[serde(rename = "spin_down", default)]
|
||||
pub spin_down: f32,
|
||||
#[serde(rename = "spawn_flags", default)]
|
||||
pub spawn_flags: u32,
|
||||
#[serde(rename = "radius", default)]
|
||||
pub radius: f32,
|
||||
#[serde(rename = "preset", default)]
|
||||
pub preset: u32,
|
||||
#[serde(rename = "pitch_start", default)]
|
||||
pub pitch_start: f32,
|
||||
#[serde(rename = "pitch", default)]
|
||||
pub pitch: f32,
|
||||
pub message: &'a str,
|
||||
#[serde(rename = "lfo_type", default)]
|
||||
pub lfo_type: u32,
|
||||
#[serde(rename = "lfo_rate", default)]
|
||||
pub lfo_rate: u32,
|
||||
#[serde(rename = "lfo_mod_vol", default)]
|
||||
pub lfo_mod_vol: f32,
|
||||
#[serde(rename = "lfomodpitch", default)]
|
||||
pub lfo_mod_pitch: f32,
|
||||
#[serde(rename = "health", default)]
|
||||
pub health: u8,
|
||||
#[serde(rename = "fadeoutsec", default)]
|
||||
pub fade_out_secs: f32,
|
||||
#[serde(rename = "fadeinsec", default)]
|
||||
pub fade_in_secs: f32,
|
||||
#[serde(rename = "cspinup", default)]
|
||||
pub c_spin_up: f32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
pub struct LogicCase<'a> {
|
||||
pub origin: Vector,
|
||||
#[serde(rename = "targetname")]
|
||||
pub target_name: Option<&'a str>,
|
||||
#[serde(rename = "oncase01")]
|
||||
pub oncase_01: Option<&'a str>,
|
||||
#[serde(rename = "oncase02")]
|
||||
pub oncase_02: Option<&'a str>,
|
||||
#[serde(rename = "oncase03")]
|
||||
pub oncase_03: Option<&'a str>,
|
||||
#[serde(rename = "oncase04")]
|
||||
pub oncase_04: Option<&'a str>,
|
||||
#[serde(rename = "oncase05")]
|
||||
pub oncase_05: Option<&'a str>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
pub struct Occluder<'a> {
|
||||
#[serde(rename = "occludernumber", default)]
|
||||
pub occluder_number: u32,
|
||||
pub model: &'a str,
|
||||
#[serde(rename = "startactive", deserialize_with = "deserialize_bool")]
|
||||
pub start_active: bool,
|
||||
}
|
||||
|
|
@ -21,29 +21,3 @@ impl<'a> Handle<'a, StaticPropLump> {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "basic")]
|
||||
impl<'a> crate::basic::PropDynamic<'a> {
|
||||
pub fn as_prop_placement(&self) -> PropPlacement<'a> {
|
||||
PropPlacement {
|
||||
model: self.model,
|
||||
rotation: self.angles.as_quaternion(),
|
||||
scale: self.scale,
|
||||
origin: self.origin,
|
||||
skin: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "basic")]
|
||||
impl<'a> crate::basic::PropDynamicOverride<'a> {
|
||||
pub fn as_prop_placement(&self) -> PropPlacement<'a> {
|
||||
PropPlacement {
|
||||
model: self.model,
|
||||
rotation: self.angles.as_quaternion(),
|
||||
scale: self.scale,
|
||||
origin: self.origin,
|
||||
skin: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue