1
+ use std:: sync:: Arc ;
2
+
1
3
use crate :: commands:: dispatcher:: InvalidTreeError ;
2
4
use crate :: commands:: dispatcher:: InvalidTreeError :: InvalidConsumptionError ;
3
5
use crate :: commands:: tree:: { ConsumedArgs , RawArgs } ;
4
6
use crate :: commands:: CommandSender ;
5
- use crate :: commands:: CommandSender :: Player ;
6
7
use crate :: server:: Server ;
7
8
8
9
/// todo: implement (so far only own name + @s/@p is implemented)
9
- pub fn consume_arg_player ( src : & CommandSender , args : & mut RawArgs ) -> Option < String > {
10
- let s = args. pop ( ) ?;
11
-
12
- match s {
13
- "@s" if src. is_player ( ) => Some ( s. into ( ) ) ,
14
- "@p" if src. is_player ( ) => Some ( s. into ( ) ) ,
15
- "@r" => None , // todo: implement random player target selector
16
- "@a" | "@e" => None , // todo: implement all players target selector
17
- _ => {
18
- // todo: implement any other player than sender
19
- if let Player ( player) = src {
20
- let profile = & player. gameprofile ;
21
- if profile. name == s {
22
- return Some ( s. into ( ) ) ;
23
- } ;
24
- } ;
25
- None
10
+ pub fn consume_arg_player (
11
+ src : & CommandSender ,
12
+ server : & Server ,
13
+ args : & mut RawArgs ,
14
+ ) -> Result < String , Option < String > > {
15
+ if let Some ( arg) = args. pop ( ) {
16
+ match arg {
17
+ "@s" => {
18
+ if src. is_player ( ) {
19
+ return Ok ( arg. into ( ) ) ;
20
+ } else {
21
+ return Err ( Some ( "You are not a Player" . into ( ) ) ) ;
22
+ }
23
+ }
24
+ "@p" if src. is_player ( ) => return Ok ( arg. into ( ) ) ,
25
+ "@r" => todo ! ( ) , // todo: implement random player target selector
26
+ "@a" | "@e" => todo ! ( ) , // todo: implement all players target selector
27
+ name => {
28
+ // todo: implement any other player than sender
29
+ for world in & server. worlds {
30
+ if world. get_player_by_name ( name) . is_some ( ) {
31
+ return Ok ( name. into ( ) ) ;
32
+ }
33
+ }
34
+ return Err ( Some ( format ! ( "Player not found: {}" , arg) ) ) ;
35
+ }
26
36
}
27
37
}
38
+ Err ( None )
28
39
}
29
40
30
41
/// todo: implement (so far only own name + @s/@p is implemented)
31
- pub fn parse_arg_player < ' a > (
32
- src : & ' a mut CommandSender ,
33
- _server : & Server ,
42
+ pub fn parse_arg_player (
43
+ src : & mut CommandSender ,
44
+ server : & Server ,
34
45
arg_name : & str ,
35
46
consumed_args : & ConsumedArgs ,
36
- ) -> Result < & ' a crate :: entity:: player:: Player , InvalidTreeError > {
47
+ ) -> Result < Arc < crate :: entity:: player:: Player > , InvalidTreeError > {
37
48
let s = consumed_args
38
49
. get ( arg_name)
39
50
. ok_or ( InvalidConsumptionError ( None ) ) ?
@@ -44,14 +55,12 @@ pub fn parse_arg_player<'a>(
44
55
"@p" if src. is_player ( ) => Ok ( src. as_mut_player ( ) . unwrap ( ) ) ,
45
56
"@r" => Err ( InvalidConsumptionError ( Some ( s. into ( ) ) ) ) , // todo: implement random player target selector
46
57
"@a" | "@e" => Err ( InvalidConsumptionError ( Some ( s. into ( ) ) ) ) , // todo: implement all players target selector
47
- _ => {
48
- // todo: implement any other player than sender
49
- if let Player ( player) = src {
50
- let profile = & player. gameprofile ;
51
- if profile. name == s {
58
+ name => {
59
+ for world in & server. worlds {
60
+ if let Some ( player) = world. get_player_by_name ( name) {
52
61
return Ok ( player) ;
53
- } ;
54
- } ;
62
+ }
63
+ }
55
64
Err ( InvalidConsumptionError ( Some ( s. into ( ) ) ) )
56
65
}
57
66
}
0 commit comments