Files
Pumpkin/pumpkin/src/command/args/time.rs
ChocoDev bb5033046b fix: offline player support for some command with usercache (#1793)
* add gameprofile that support offline player

* clippy

* bigass refactor select_players() and select_entities() + usercache.json

* formating

* enhance usercache.json

* better cursor on dispatch

* Update dependencies in Cargo.lock

Signed-off-by: ChocoDev <100467857+chocodev11@users.noreply.github.com>

* using chrono instead self-write

* remove unnecessary parse

* clippy

---------

Signed-off-by: ChocoDev <100467857+chocodev11@users.noreply.github.com>
Co-authored-by: chocodev11 <chocodev11@users.noreply.github.com>
2026-03-30 19:25:45 +02:00

78 lines
2.0 KiB
Rust

use pumpkin_protocol::java::client::play::{ArgumentType, SuggestionProviders};
use crate::command::{
CommandSender,
args::{
Arg, ArgumentConsumer, ConsumeResult, DefaultNameArgConsumer, FindArg,
GetClientSideArgParser,
},
dispatcher::CommandError,
tree::RawArgs,
};
use crate::server::Server;
pub struct TimeArgumentConsumer;
impl GetClientSideArgParser for TimeArgumentConsumer {
fn get_client_side_parser(&self) -> ArgumentType<'_> {
ArgumentType::Time { min: 0 }
}
fn get_client_side_suggestion_type_override(&self) -> Option<SuggestionProviders> {
None
}
}
impl ArgumentConsumer for TimeArgumentConsumer {
fn consume<'a, 'b>(
&'a self,
_sender: &'a CommandSender,
_server: &'a Server,
args: &'b mut RawArgs<'a>,
) -> ConsumeResult<'a> {
let s_opt: Option<&'a str> = args.pop().map(|arg| arg.value);
let result: Option<Arg<'a>> = s_opt.and_then(|s| {
let (num_str, unit) = s
.find(|c: char| c.is_alphabetic())
.map_or((s, "t"), |pos| (&s[..pos], &s[pos..]));
let number = num_str.parse::<f32>().ok()?; // Replaces .ok()?
if number < 0.0 {
return None;
}
let ticks = match unit {
"d" => number * 24000.0,
"s" => number * 20.0,
"t" => number,
_ => return None,
};
let ticks = ticks.round() as i32;
Some(Arg::Time(ticks))
});
Box::pin(async move { result })
}
}
impl DefaultNameArgConsumer for TimeArgumentConsumer {
fn default_name(&self) -> &'static str {
"time"
}
}
impl<'a> FindArg<'a> for TimeArgumentConsumer {
type Data = i32;
fn find_arg(args: &'a super::ConsumedArgs, name: &str) -> Result<Self::Data, CommandError> {
match args.get(name) {
Some(Arg::Time(ticks)) => Ok(*ticks),
_ => Err(CommandError::InvalidConsumption(Some(name.to_string()))),
}
}
}