Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
ziqian zhang
Grasscutter
Commits
ae2d1fe4
Commit
ae2d1fe4
authored
Jul 21, 2022
by
github-actions
Committed by
Melledy
Jul 21, 2022
Browse files
Fix whitespace [skip actions]
parent
510d564b
Changes
166
Hide whitespace changes
Inline
Side-by-side
src/main/java/emu/grasscutter/GameConstants.java
View file @
ae2d1fe4
...
...
@@ -6,29 +6,29 @@ import emu.grasscutter.utils.Position;
import
emu.grasscutter.utils.Utils
;
public
final
class
GameConstants
{
public
static
String
VERSION
=
"2.8.0"
;
public
static
final
int
MAX_TEAMS
=
4
;
public
static
final
int
MAIN_CHARACTER_MALE
=
10000005
;
public
static
final
int
MAIN_CHARACTER_FEMALE
=
10000007
;
public
static
final
Position
START_POSITION
=
new
Position
(
2747
,
194
,
-
1719
);
public
static
final
int
MAX_FRIENDS
=
45
;
public
static
final
int
MAX_FRIEND_REQUESTS
=
50
;
public
static
final
int
SERVER_CONSOLE_UID
=
99
;
// The UID of the server console's "player".
public
static
final
int
BATTLE_PASS_MAX_LEVEL
=
50
;
public
static
final
int
BATTLE_PASS_POINT_PER_LEVEL
=
1000
;
public
static
final
int
BATTLE_PASS_POINT_PER_WEEK
=
10000
;
public
static
final
int
BATTLE_PASS_LEVEL_PRICE
=
150
;
public
static
final
int
BATTLE_PASS_CURRENT_INDEX
=
2
;
// Default entity ability hashes.
public
static
final
String
[]
DEFAULT_ABILITY_STRINGS
=
{
"Avatar_DefaultAbility_VisionReplaceDieInvincible"
,
"Avatar_DefaultAbility_AvartarInShaderChange"
,
"Avatar_SprintBS_Invincible"
,
"Avatar_Freeze_Duration_Reducer"
,
"Avatar_Attack_ReviveEnergy"
,
"Avatar_Component_Initializer"
,
"Avatar_FallAnthem_Achievement_Listener"
};
public
static
final
int
[]
DEFAULT_ABILITY_HASHES
=
Arrays
.
stream
(
DEFAULT_ABILITY_STRINGS
).
mapToInt
(
Utils:
:
abilityHash
).
toArray
();
public
static
final
int
DEFAULT_ABILITY_NAME
=
Utils
.
abilityHash
(
"Default"
);
public
static
String
VERSION
=
"2.8.0"
;
public
static
final
int
MAX_TEAMS
=
4
;
public
static
final
int
MAIN_CHARACTER_MALE
=
10000005
;
public
static
final
int
MAIN_CHARACTER_FEMALE
=
10000007
;
public
static
final
Position
START_POSITION
=
new
Position
(
2747
,
194
,
-
1719
);
public
static
final
int
MAX_FRIENDS
=
45
;
public
static
final
int
MAX_FRIEND_REQUESTS
=
50
;
public
static
final
int
SERVER_CONSOLE_UID
=
99
;
// The UID of the server console's "player".
public
static
final
int
BATTLE_PASS_MAX_LEVEL
=
50
;
public
static
final
int
BATTLE_PASS_POINT_PER_LEVEL
=
1000
;
public
static
final
int
BATTLE_PASS_POINT_PER_WEEK
=
10000
;
public
static
final
int
BATTLE_PASS_LEVEL_PRICE
=
150
;
public
static
final
int
BATTLE_PASS_CURRENT_INDEX
=
2
;
// Default entity ability hashes.
public
static
final
String
[]
DEFAULT_ABILITY_STRINGS
=
{
"Avatar_DefaultAbility_VisionReplaceDieInvincible"
,
"Avatar_DefaultAbility_AvartarInShaderChange"
,
"Avatar_SprintBS_Invincible"
,
"Avatar_Freeze_Duration_Reducer"
,
"Avatar_Attack_ReviveEnergy"
,
"Avatar_Component_Initializer"
,
"Avatar_FallAnthem_Achievement_Listener"
};
public
static
final
int
[]
DEFAULT_ABILITY_HASHES
=
Arrays
.
stream
(
DEFAULT_ABILITY_STRINGS
).
mapToInt
(
Utils:
:
abilityHash
).
toArray
();
public
static
final
int
DEFAULT_ABILITY_NAME
=
Utils
.
abilityHash
(
"Default"
);
}
src/main/java/emu/grasscutter/Grasscutter.java
View file @
ae2d1fe4
...
...
@@ -217,7 +217,7 @@ public final class Grasscutter {
*/
private
static
void
onShutdown
()
{
// Disable all plugins.
if
(
pluginManager
!=
null
)
if
(
pluginManager
!=
null
)
pluginManager
.
disablePlugins
();
}
...
...
src/main/java/emu/grasscutter/auth/DefaultAuthentication.java
View file @
ae2d1fe4
...
...
@@ -21,7 +21,7 @@ public final class DefaultAuthentication implements AuthenticationSystem {
private
OAuthAuthenticator
oAuthAuthenticator
=
new
OAuthAuthentication
();
public
DefaultAuthentication
()
{
if
(
ACCOUNT
.
EXPERIMENTAL_RealPassword
)
{
if
(
ACCOUNT
.
EXPERIMENTAL_RealPassword
)
{
passwordAuthenticator
=
new
ExperimentalPasswordAuthenticator
();
}
else
{
passwordAuthenticator
=
new
PasswordAuthenticator
();
...
...
src/main/java/emu/grasscutter/command/CommandMap.java
View file @
ae2d1fe4
...
...
@@ -167,7 +167,7 @@ public final class CommandMap {
CommandHandler
.
sendTranslatedMessage
(
player
,
"commands.execution.clear_target"
);
return
true
;
}
// Sets default targetPlayer to the UID provided.
try
{
int
uid
=
Integer
.
parseInt
(
targetUid
);
...
...
@@ -237,7 +237,7 @@ public final class CommandMap {
Command
annotation
=
this
.
annotations
.
get
(
label
);
// Resolve targetPlayer
try
{
try
{
targetPlayer
=
getTargetPlayer
(
playerId
,
player
,
targetPlayer
,
args
);
}
catch
(
IllegalArgumentException
e
)
{
return
;
...
...
src/main/java/emu/grasscutter/command/commands/AccountCommand.java
View file @
ae2d1fe4
...
...
@@ -39,8 +39,8 @@ public final class AccountCommand implements CommandHandler {
int
uid
=
0
;
String
password
=
""
;
if
(
Configuration
.
ACCOUNT
.
EXPERIMENTAL_RealPassword
==
true
)
{
if
(
args
.
size
()
<
3
)
{
if
(
Configuration
.
ACCOUNT
.
EXPERIMENTAL_RealPassword
==
true
)
{
if
(
args
.
size
()
<
3
)
{
CommandHandler
.
sendMessage
(
null
,
"EXPERIMENTAL_RealPassword requires a password argument"
);
CommandHandler
.
sendMessage
(
null
,
"Usage: account create <username> <password> [uid]"
);
...
...
@@ -53,7 +53,7 @@ public final class AccountCommand implements CommandHandler {
uid
=
Integer
.
parseInt
(
args
.
get
(
3
));
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendMessage
(
null
,
translate
(
sender
,
"commands.account.invalid"
));
if
(
Configuration
.
ACCOUNT
.
EXPERIMENTAL_RealPassword
==
true
)
{
if
(
Configuration
.
ACCOUNT
.
EXPERIMENTAL_RealPassword
==
true
)
{
CommandHandler
.
sendMessage
(
null
,
"EXPERIMENTAL_RealPassword requires argument 2 to be a password, not a uid"
);
CommandHandler
.
sendMessage
(
null
,
"Usage: account create <username> <password> [uid]"
);
}
...
...
@@ -76,7 +76,7 @@ public final class AccountCommand implements CommandHandler {
CommandHandler
.
sendMessage
(
null
,
translate
(
sender
,
"commands.account.exists"
));
return
;
}
else
{
if
(
Configuration
.
ACCOUNT
.
EXPERIMENTAL_RealPassword
==
true
)
{
if
(
Configuration
.
ACCOUNT
.
EXPERIMENTAL_RealPassword
==
true
)
{
account
.
setPassword
(
BCrypt
.
withDefaults
().
hashToString
(
12
,
password
.
toCharArray
()));
}
account
.
addPermission
(
"*"
);
...
...
@@ -93,7 +93,7 @@ public final class AccountCommand implements CommandHandler {
CommandHandler
.
sendMessage
(
null
,
translate
(
sender
,
"commands.account.no_account"
));
return
;
}
// Get the player for the account.
// If that player is currently online, we kick them before proceeding with the deletion.
Player
player
=
Grasscutter
.
getGameServer
().
getPlayerByAccountId
(
toDelete
.
getId
());
...
...
@@ -106,12 +106,12 @@ public final class AccountCommand implements CommandHandler {
CommandHandler
.
sendMessage
(
null
,
translate
(
sender
,
"commands.account.delete"
));
return
;
case
"resetpass"
:
if
(
Configuration
.
ACCOUNT
.
EXPERIMENTAL_RealPassword
!=
true
)
{
if
(
Configuration
.
ACCOUNT
.
EXPERIMENTAL_RealPassword
!=
true
)
{
CommandHandler
.
sendMessage
(
null
,
"resetpass requires EXPERIMENTAL_RealPassword to be true."
);
return
;
}
if
(
args
.
size
()
!=
3
)
{
if
(
args
.
size
()
!=
3
)
{
CommandHandler
.
sendMessage
(
null
,
"Invalid Args"
);
CommandHandler
.
sendMessage
(
null
,
"Usage: account resetpass <username> <password>"
);
return
;
...
...
src/main/java/emu/grasscutter/command/commands/AnnounceCommand.java
View file @
ae2d1fe4
...
...
@@ -28,7 +28,7 @@ public final class AnnounceCommand implements CommandHandler {
return
;
}
switch
(
args
.
get
(
0
)){
switch
(
args
.
get
(
0
))
{
case
"tpl"
:
if
(
args
.
size
()
<
2
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.announce.command_usage"
);
...
...
@@ -37,7 +37,7 @@ public final class AnnounceCommand implements CommandHandler {
var
templateId
=
Integer
.
parseInt
(
args
.
get
(
1
));
var
tpl
=
manager
.
getAnnounceConfigItemMap
().
get
(
templateId
);
if
(
tpl
==
null
){
if
(
tpl
==
null
)
{
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.announce.not_found"
,
templateId
));
return
;
}
...
...
src/main/java/emu/grasscutter/command/commands/CoopCommand.java
View file @
ae2d1fe4
...
...
@@ -38,7 +38,7 @@ public final class CoopCommand implements CommandHandler {
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.coop.usage"
));
return
;
}
// There's no target==host check but this just places them in multiplayer in their own world which seems fine.
if
(
targetPlayer
.
isInMultiplayer
())
{
targetPlayer
.
getServer
().
getMultiplayerSystem
().
leaveCoop
(
targetPlayer
);
...
...
src/main/java/emu/grasscutter/command/commands/EnterDungeonCommand.java
View file @
ae2d1fe4
...
...
@@ -21,10 +21,10 @@ public final class EnterDungeonCommand implements CommandHandler {
try
{
int
dungeonId
=
Integer
.
parseInt
(
args
.
get
(
0
));
if
(
dungeonId
==
targetPlayer
.
getSceneId
())
{
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.enter_dungeon.in_dungeon_error"
));
return
;
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.enter_dungeon.in_dungeon_error"
));
return
;
}
boolean
result
=
targetPlayer
.
getServer
().
getDungeonSystem
().
enterDungeon
(
targetPlayer
.
getSession
().
getPlayer
(),
0
,
dungeonId
);
if
(!
result
)
{
...
...
src/main/java/emu/grasscutter/command/commands/GiveCommand.java
View file @
ae2d1fe4
...
...
@@ -257,7 +257,7 @@ public final class GiveCommand implements CommandHandler {
if
(
avatar
.
getAvatarId
()
==
GameConstants
.
MAIN_CHARACTER_MALE
)
{
avatar
.
setSkillDepotData
(
GameData
.
getAvatarSkillDepotDataMap
().
get
(
504
));
}
else
if
(
avatar
.
getAvatarId
()
==
GameConstants
.
MAIN_CHARACTER_FEMALE
)
{
else
if
(
avatar
.
getAvatarId
()
==
GameConstants
.
MAIN_CHARACTER_FEMALE
)
{
avatar
.
setSkillDepotData
(
GameData
.
getAvatarSkillDepotDataMap
().
get
(
704
));
}
...
...
@@ -352,11 +352,11 @@ public final class GiveCommand implements CommandHandler {
return
affixes
;
}
private
static
int
getAppendPropId
(
String
substatText
,
ItemData
itemData
)
throws
IllegalArgumentException
{
// If the given substat text is an integer, we just use that as the append prop ID.
try
{
return
Integer
.
parseInt
(
substatText
);
}
catch
(
NumberFormatException
ignored
)
{
private
static
int
getAppendPropId
(
String
substatText
,
ItemData
itemData
)
throws
IllegalArgumentException
{
// If the given substat text is an integer, we just use that as the append prop ID.
try
{
return
Integer
.
parseInt
(
substatText
);
}
catch
(
NumberFormatException
ignored
)
{
// If the argument was not an integer, we try to determine
// the append prop ID from the given text + artifact information.
// A substat string has the format `substat_tier`, with the
...
...
@@ -378,8 +378,8 @@ public final class GiveCommand implements CommandHandler {
substatTier
-=
1
;
// 1-indexed to 0-indexed
substatTier
=
Math
.
min
(
Math
.
max
(
0
,
substatTier
),
substats
.
size
()
-
1
);
return
substats
.
get
(
substatTier
);
}
}
}
}
private
static
void
parseRelicArgs
(
GiveItemParameters
param
,
List
<
String
>
args
)
throws
IllegalArgumentException
{
// Get the main stat from the arguments.
...
...
@@ -476,11 +476,11 @@ public final class GiveCommand implements CommandHandler {
10000-10008, 11411, 11506-11508, 12505, 12506, 12508, 12509,
13503, 13506, 14411, 14503, 14505, 14508, 15504-15506
"""
);
private
static
final
SparseSet
illegalRelicIds
=
new
SparseSet
(
"""
20001, 23300-23340, 23383-23385, 78310-78554, 99310-99554
"""
);
private
static
final
SparseSet
illegalItemIds
=
new
SparseSet
(
"""
100086, 100087, 100100-101000, 101106-101110, 101306, 101500-104000,
105001, 105004, 106000-107000, 107011, 108000, 109000-110000,
...
...
src/main/java/emu/grasscutter/command/commands/HelpCommand.java
View file @
ae2d1fe4
...
...
@@ -22,13 +22,13 @@ public final class HelpCommand implements CommandHandler {
}
}
builder
.
append
(
"\n\t"
).
append
(
translate
(
player
,
"commands.help.tip_need_permission"
));
if
(
annotation
.
permission
().
isEmpty
()
||
annotation
.
permission
().
isBlank
())
{
if
(
annotation
.
permission
().
isEmpty
()
||
annotation
.
permission
().
isBlank
())
{
builder
.
append
(
translate
(
player
,
"commands.help.tip_need_no_permission"
));
}
else
{
builder
.
append
(
annotation
.
permission
());
}
if
(!
annotation
.
permissionTargeted
().
isEmpty
()
&&
!
annotation
.
permissionTargeted
().
isBlank
())
{
if
(!
annotation
.
permissionTargeted
().
isEmpty
()
&&
!
annotation
.
permissionTargeted
().
isBlank
())
{
String
permissionTargeted
=
annotation
.
permissionTargeted
();
builder
.
append
(
" "
).
append
(
translate
(
player
,
"commands.help.tip_permission_targeted"
,
permissionTargeted
));
}
...
...
src/main/java/emu/grasscutter/command/commands/ReloadCommand.java
View file @
ae2d1fe4
...
...
@@ -15,13 +15,13 @@ public final class ReloadCommand implements CommandHandler {
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.reload.reload_start"
));
Grasscutter
.
loadConfig
();
Grasscutter
.
loadLanguage
();
Grasscutter
.
getGameServer
().
getGachaSystem
().
load
();
Grasscutter
.
getGameServer
().
getDropSystem
().
load
();
Grasscutter
.
getGameServer
().
getShopSystem
().
load
();
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.reload.reload_done"
));
}
}
src/main/java/emu/grasscutter/command/commands/SendMailCommand.java
View file @
ae2d1fe4
...
...
@@ -27,7 +27,7 @@ public final class SendMailCommand implements CommandHandler {
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
int
senderId
;
if
(
sender
!=
null
)
{
if
(
sender
!=
null
)
{
senderId
=
sender
.
getUid
();
}
else
{
senderId
=
-
1
;
...
...
@@ -162,7 +162,7 @@ public final class SendMailCommand implements CommandHandler {
}
private
String
getConstructionArgs
(
int
stage
,
Player
sender
)
{
return
switch
(
stage
)
{
return
switch
(
stage
)
{
case
0
->
translate
(
sender
,
"commands.sendMail.title"
);
case
1
->
translate
(
sender
,
"commands.sendMail.message"
);
case
2
->
translate
(
sender
,
"commands.sendMail.sender"
);
...
...
src/main/java/emu/grasscutter/command/commands/SetPropCommand.java
View file @
ae2d1fe4
package
emu.grasscutter.command.commands
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
emu.grasscutter.command.Command
;
import
emu.grasscutter.command.CommandHandler
;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.game.props.PlayerProperty
;
import
emu.grasscutter.game.tower.TowerLevelRecord
;
@Command
(
label
=
"setprop"
,
usage
=
"setprop|prop <prop> <value>"
,
aliases
=
{
"prop"
},
permission
=
"player.setprop"
,
permissionTargeted
=
"player.setprop.others"
,
description
=
"commands.setProp.description"
)
public
final
class
SetPropCommand
implements
CommandHandler
{
static
enum
PseudoProp
{
NONE
,
WORLD_LEVEL
,
TOWER_LEVEL
,
BP_LEVEL
,
GOD_MODE
,
NO_STAMINA
,
UNLIMITED_ENERGY
}
static
class
Prop
{
String
name
;
PlayerProperty
prop
;
PseudoProp
pseudoProp
;
public
Prop
(
PlayerProperty
prop
)
{
this
(
prop
.
toString
(),
prop
,
PseudoProp
.
NONE
);
}
public
Prop
(
String
name
)
{
this
(
name
,
PlayerProperty
.
PROP_NONE
,
PseudoProp
.
NONE
);
}
public
Prop
(
String
name
,
PseudoProp
pseudoProp
)
{
this
(
name
,
PlayerProperty
.
PROP_NONE
,
pseudoProp
);
}
public
Prop
(
String
name
,
PlayerProperty
prop
)
{
this
(
name
,
prop
,
PseudoProp
.
NONE
);
}
public
Prop
(
String
name
,
PlayerProperty
prop
,
PseudoProp
pseudoProp
)
{
this
.
name
=
name
;
this
.
prop
=
prop
;
this
.
pseudoProp
=
pseudoProp
;
}
}
Map
<
String
,
Prop
>
props
;
public
SetPropCommand
()
{
this
.
props
=
new
HashMap
<>();
// Full PlayerProperty enum that won't be advertised but can be used by devs
for
(
PlayerProperty
prop
:
PlayerProperty
.
values
())
{
String
name
=
prop
.
toString
().
substring
(
5
);
// PROP_EXP -> EXP
String
key
=
name
.
toLowerCase
();
// EXP -> exp
this
.
props
.
put
(
key
,
new
Prop
(
name
,
prop
));
}
// Add special props
Prop
worldlevel
=
new
Prop
(
"World Level"
,
PlayerProperty
.
PROP_PLAYER_WORLD_LEVEL
,
PseudoProp
.
WORLD_LEVEL
);
this
.
props
.
put
(
"worldlevel"
,
worldlevel
);
this
.
props
.
put
(
"wl"
,
worldlevel
);
Prop
abyss
=
new
Prop
(
"Tower Level"
,
PseudoProp
.
TOWER_LEVEL
);
this
.
props
.
put
(
"abyss"
,
abyss
);
this
.
props
.
put
(
"abyssfloor"
,
abyss
);
this
.
props
.
put
(
"ut"
,
abyss
);
this
.
props
.
put
(
"tower"
,
abyss
);
this
.
props
.
put
(
"towerlevel"
,
abyss
);
this
.
props
.
put
(
"unlocktower"
,
abyss
);
Prop
bplevel
=
new
Prop
(
"BP Level"
,
PseudoProp
.
BP_LEVEL
);
this
.
props
.
put
(
"bplevel"
,
bplevel
);
this
.
props
.
put
(
"bp"
,
bplevel
);
this
.
props
.
put
(
"battlepass"
,
bplevel
);
Prop
godmode
=
new
Prop
(
"godmode"
,
PseudoProp
.
GOD_MODE
);
this
.
props
.
put
(
"godmode"
,
godmode
);
this
.
props
.
put
(
"god"
,
godmode
);
Prop
nostamina
=
new
Prop
(
"nostamina"
,
PseudoProp
.
NO_STAMINA
);
this
.
props
.
put
(
"nostamina"
,
nostamina
);
this
.
props
.
put
(
"nostam"
,
nostamina
);
this
.
props
.
put
(
"ns"
,
nostamina
);
Prop
unlimitedenergy
=
new
Prop
(
"unlimitedenergy"
,
PseudoProp
.
UNLIMITED_ENERGY
);
this
.
props
.
put
(
"unlimitedenergy"
,
unlimitedenergy
);
this
.
props
.
put
(
"ue"
,
unlimitedenergy
);
}
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
args
.
size
()
!=
2
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.setProp.usage"
);
return
;
}
String
propStr
=
args
.
get
(
0
).
toLowerCase
();
String
valueStr
=
args
.
get
(
1
).
toLowerCase
();
int
value
;
if
(!
props
.
containsKey
(
propStr
))
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.setProp.usage"
);
return
;
}
try
{
value
=
switch
(
valueStr
.
toLowerCase
())
{
case
"on"
,
"true"
->
1
;
case
"off"
,
"false"
->
0
;
case
"toggle"
->
-
1
;
default
->
Integer
.
parseInt
(
valueStr
);
};
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.execution.argument_error"
);
return
;
}
boolean
success
=
false
;
Prop
prop
=
props
.
get
(
propStr
);
success
=
switch
(
prop
.
pseudoProp
)
{
case
WORLD_LEVEL
->
targetPlayer
.
setWorldLevel
(
value
);
case
BP_LEVEL
->
targetPlayer
.
getBattlePassManager
().
setLevel
(
value
);
case
TOWER_LEVEL
->
this
.
setTowerLevel
(
sender
,
targetPlayer
,
value
);
case
GOD_MODE
,
NO_STAMINA
,
UNLIMITED_ENERGY
->
this
.
setBool
(
sender
,
targetPlayer
,
prop
.
pseudoProp
,
value
);
default
->
targetPlayer
.
setProperty
(
prop
.
prop
,
value
);
};
if
(
success
)
{
if
(
targetPlayer
==
sender
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.generic.set_to"
,
prop
.
name
,
valueStr
);
}
else
{
String
uidStr
=
targetPlayer
.
getAccount
().
getId
();
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.generic.set_for_to"
,
prop
.
name
,
uidStr
,
valueStr
);
}
}
else
{
if
(
prop
.
prop
!=
PlayerProperty
.
PROP_NONE
)
{
// PseudoProps need to do their own error messages
String
min
=
Integer
.
toString
(
targetPlayer
.
getPropertyMin
(
prop
.
prop
));
String
max
=
Integer
.
toString
(
targetPlayer
.
getPropertyMax
(
prop
.
prop
));
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.generic.invalid.value_between"
,
prop
.
name
,
min
,
max
);
}
}
}
private
boolean
setTowerLevel
(
Player
sender
,
Player
targetPlayer
,
int
topFloor
)
{
List
<
Integer
>
floorIds
=
targetPlayer
.
getServer
().
getTowerSystem
().
getAllFloors
();
if
(
topFloor
<
0
||
topFloor
>
floorIds
.
size
())
{
String
min
=
Integer
.
toString
(
0
);
String
max
=
Integer
.
toString
(
floorIds
.
size
());
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.generic.invalid.value_between"
,
"Tower Level"
,
min
,
max
);
return
false
;
}
Map
<
Integer
,
TowerLevelRecord
>
recordMap
=
targetPlayer
.
getTowerManager
().
getRecordMap
();
// Add records for each unlocked floor
for
(
int
floor
:
floorIds
.
subList
(
0
,
topFloor
))
{
if
(!
recordMap
.
containsKey
(
floor
))
{
recordMap
.
put
(
floor
,
new
TowerLevelRecord
(
floor
));
}
}
// Remove records for each floor past our target
for
(
int
floor
:
floorIds
.
subList
(
topFloor
,
floorIds
.
size
()))
{
if
(
recordMap
.
containsKey
(
floor
))
{
recordMap
.
remove
(
floor
);
}
}
// Six stars required on Floor 8 to unlock Floor 9+
if
(
topFloor
>
8
)
{
recordMap
.
get
(
floorIds
.
get
(
7
)).
setLevelStars
(
0
,
6
);
// levelIds seem to start at 1 for Floor 1 Chamber 1, so this doesn't get shown at all
}
return
true
;
}
private
boolean
setBool
(
Player
sender
,
Player
targetPlayer
,
PseudoProp
pseudoProp
,
int
value
)
{
boolean
enabled
=
switch
(
pseudoProp
)
{
case
GOD_MODE
->
targetPlayer
.
inGodmode
();
case
NO_STAMINA
->
targetPlayer
.
getUnlimitedStamina
();
case
UNLIMITED_ENERGY
->
!
targetPlayer
.
getEnergyManager
().
getEnergyUsage
();
default
->
false
;
};
enabled
=
switch
(
value
)
{
case
-
1
->
!
enabled
;
case
0
->
false
;
default
->
true
;
};
switch
(
pseudoProp
)
{
case
GOD_MODE:
targetPlayer
.
setGodmode
(
enabled
);
break
;
case
NO_STAMINA:
targetPlayer
.
setUnlimitedStamina
(
enabled
);
break
;
case
UNLIMITED_ENERGY:
targetPlayer
.
getEnergyManager
().
setEnergyUsage
(!
enabled
);
break
;
default
:
return
false
;
}
return
true
;
}
}
package
emu.grasscutter.command.commands
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
emu.grasscutter.command.Command
;
import
emu.grasscutter.command.CommandHandler
;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.game.props.PlayerProperty
;
import
emu.grasscutter.game.tower.TowerLevelRecord
;
@Command
(
label
=
"setprop"
,
usage
=
"setprop|prop <prop> <value>"
,
aliases
=
{
"prop"
},
permission
=
"player.setprop"
,
permissionTargeted
=
"player.setprop.others"
,
description
=
"commands.setProp.description"
)
public
final
class
SetPropCommand
implements
CommandHandler
{
static
enum
PseudoProp
{
NONE
,
WORLD_LEVEL
,
TOWER_LEVEL
,
BP_LEVEL
,
GOD_MODE
,
NO_STAMINA
,
UNLIMITED_ENERGY
}
static
class
Prop
{
String
name
;
PlayerProperty
prop
;
PseudoProp
pseudoProp
;
public
Prop
(
PlayerProperty
prop
)
{
this
(
prop
.
toString
(),
prop
,
PseudoProp
.
NONE
);
}
public
Prop
(
String
name
)
{
this
(
name
,
PlayerProperty
.
PROP_NONE
,
PseudoProp
.
NONE
);
}
public
Prop
(
String
name
,
PseudoProp
pseudoProp
)
{
this
(
name
,
PlayerProperty
.
PROP_NONE
,
pseudoProp
);
}
public
Prop
(
String
name
,
PlayerProperty
prop
)
{
this
(
name
,
prop
,
PseudoProp
.
NONE
);
}
public
Prop
(
String
name
,
PlayerProperty
prop
,
PseudoProp
pseudoProp
)
{
this
.
name
=
name
;
this
.
prop
=
prop
;
this
.
pseudoProp
=
pseudoProp
;
}
}
Map
<
String
,
Prop
>
props
;
public
SetPropCommand
()
{
this
.
props
=
new
HashMap
<>();
// Full PlayerProperty enum that won't be advertised but can be used by devs
for
(
PlayerProperty
prop
:
PlayerProperty
.
values
())
{
String
name
=
prop
.
toString
().
substring
(
5
);
// PROP_EXP -> EXP
String
key
=
name
.
toLowerCase
();
// EXP -> exp
this
.
props
.
put
(
key
,
new
Prop
(
name
,
prop
));
}
// Add special props
Prop
worldlevel
=
new
Prop
(
"World Level"
,
PlayerProperty
.
PROP_PLAYER_WORLD_LEVEL
,
PseudoProp
.
WORLD_LEVEL
);
this
.
props
.
put
(
"worldlevel"
,
worldlevel
);
this
.
props
.
put
(
"wl"
,
worldlevel
);
Prop
abyss
=
new
Prop
(
"Tower Level"
,
PseudoProp
.
TOWER_LEVEL
);
this
.
props
.
put
(
"abyss"
,
abyss
);
this
.
props
.
put
(
"abyssfloor"
,
abyss
);
this
.
props
.
put
(
"ut"
,
abyss
);
this
.
props
.
put
(
"tower"
,
abyss
);
this
.
props
.
put
(
"towerlevel"
,
abyss
);
this
.
props
.
put
(
"unlocktower"
,
abyss
);
Prop
bplevel
=
new
Prop
(
"BP Level"
,
PseudoProp
.
BP_LEVEL
);
this
.
props
.
put
(
"bplevel"
,
bplevel
);
this
.
props
.
put
(
"bp"
,
bplevel
);
this
.
props
.
put
(
"battlepass"
,
bplevel
);
Prop
godmode
=
new
Prop
(
"godmode"
,
PseudoProp
.
GOD_MODE
);
this
.
props
.
put
(
"godmode"
,
godmode
);
this
.
props
.
put
(
"god"
,
godmode
);
Prop
nostamina
=
new
Prop
(
"nostamina"
,
PseudoProp
.
NO_STAMINA
);
this
.
props
.
put
(
"nostamina"
,
nostamina
);
this
.
props
.
put
(
"nostam"
,
nostamina
);
this
.
props
.
put
(
"ns"
,
nostamina
);
Prop
unlimitedenergy
=
new
Prop
(
"unlimitedenergy"
,
PseudoProp
.
UNLIMITED_ENERGY
);
this
.
props
.
put
(
"unlimitedenergy"
,
unlimitedenergy
);
this
.
props
.
put
(
"ue"
,
unlimitedenergy
);
}
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
args
.
size
()
!=
2
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.setProp.usage"
);
return
;
}
String
propStr
=
args
.
get
(
0
).
toLowerCase
();
String
valueStr
=
args
.
get
(
1
).
toLowerCase
();
int
value
;
if
(!
props
.
containsKey
(
propStr
))
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.setProp.usage"
);
return
;
}
try
{
value
=
switch
(
valueStr
.
toLowerCase
())
{
case
"on"
,
"true"
->
1
;
case
"off"
,
"false"
->
0
;
case
"toggle"
->
-
1
;
default
->
Integer
.
parseInt
(
valueStr
);
};
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.execution.argument_error"
);
return
;
}
boolean
success
=
false
;
Prop
prop
=
props
.
get
(
propStr
);
success
=
switch
(
prop
.
pseudoProp
)
{
case
WORLD_LEVEL
->
targetPlayer
.
setWorldLevel
(
value
);
case
BP_LEVEL
->
targetPlayer
.
getBattlePassManager
().
setLevel
(
value
);
case
TOWER_LEVEL
->
this
.
setTowerLevel
(
sender
,
targetPlayer
,
value
);
case
GOD_MODE
,
NO_STAMINA
,
UNLIMITED_ENERGY
->
this
.
setBool
(
sender
,
targetPlayer
,
prop
.
pseudoProp
,
value
);
default
->
targetPlayer
.
setProperty
(
prop
.
prop
,
value
);
};
if
(
success
)
{
if
(
targetPlayer
==
sender
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.generic.set_to"
,
prop
.
name
,
valueStr
);
}
else
{
String
uidStr
=
targetPlayer
.
getAccount
().
getId
();
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.generic.set_for_to"
,
prop
.
name
,
uidStr
,
valueStr
);
}
}
else
{
if
(
prop
.
prop
!=
PlayerProperty
.
PROP_NONE
)
{
// PseudoProps need to do their own error messages
String
min
=
Integer
.
toString
(
targetPlayer
.
getPropertyMin
(
prop
.
prop
));
String
max
=
Integer
.
toString
(
targetPlayer
.
getPropertyMax
(
prop
.
prop
));
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.generic.invalid.value_between"
,
prop
.
name
,
min
,
max
);
}
}
}
private
boolean
setTowerLevel
(
Player
sender
,
Player
targetPlayer
,
int
topFloor
)
{
List
<
Integer
>
floorIds
=
targetPlayer
.
getServer
().
getTowerSystem
().
getAllFloors
();
if
(
topFloor
<
0
||
topFloor
>
floorIds
.
size
())
{
String
min
=
Integer
.
toString
(
0
);
String
max
=
Integer
.
toString
(
floorIds
.
size
());
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.generic.invalid.value_between"
,
"Tower Level"
,
min
,
max
);
return
false
;
}
Map
<
Integer
,
TowerLevelRecord
>
recordMap
=
targetPlayer
.
getTowerManager
().
getRecordMap
();
// Add records for each unlocked floor
for
(
int
floor
:
floorIds
.
subList
(
0
,
topFloor
))
{
if
(!
recordMap
.
containsKey
(
floor
))
{
recordMap
.
put
(
floor
,
new
TowerLevelRecord
(
floor
));
}
}
// Remove records for each floor past our target
for
(
int
floor
:
floorIds
.
subList
(
topFloor
,
floorIds
.
size
()))
{
if
(
recordMap
.
containsKey
(
floor
))
{
recordMap
.
remove
(
floor
);
}
}
// Six stars required on Floor 8 to unlock Floor 9+
if
(
topFloor
>
8
)
{
recordMap
.
get
(
floorIds
.
get
(
7
)).
setLevelStars
(
0
,
6
);
// levelIds seem to start at 1 for Floor 1 Chamber 1, so this doesn't get shown at all
}
return
true
;
}
private
boolean
setBool
(
Player
sender
,
Player
targetPlayer
,
PseudoProp
pseudoProp
,
int
value
)
{
boolean
enabled
=
switch
(
pseudoProp
)
{
case
GOD_MODE
->
targetPlayer
.
inGodmode
();
case
NO_STAMINA
->
targetPlayer
.
getUnlimitedStamina
();
case
UNLIMITED_ENERGY
->
!
targetPlayer
.
getEnergyManager
().
getEnergyUsage
();
default
->
false
;
};
enabled
=
switch
(
value
)
{
case
-
1
->
!
enabled
;
case
0
->
false
;
default
->
true
;
};
switch
(
pseudoProp
)
{
case
GOD_MODE:
targetPlayer
.
setGodmode
(
enabled
);
break
;
case
NO_STAMINA:
targetPlayer
.
setUnlimitedStamina
(
enabled
);
break
;
case
UNLIMITED_ENERGY:
targetPlayer
.
getEnergyManager
().
setEnergyUsage
(!
enabled
);
break
;
default
:
return
false
;
}
return
true
;
}
}
src/main/java/emu/grasscutter/command/commands/SpawnCommand.java
View file @
ae2d1fe4
...
...
@@ -31,7 +31,7 @@ public final class SpawnCommand implements CommandHandler {
int
id
=
0
;
// This is just to shut up the linter, it's not a real default
int
amount
=
1
;
int
level
=
1
;
float
x
=
0
,
y
=
0
,
z
=
0
;
float
x
=
0
,
y
=
0
,
z
=
0
;
switch
(
args
.
size
())
{
case
6
:
try
{
...
...
@@ -64,7 +64,7 @@ public final class SpawnCommand implements CommandHandler {
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.spawn.usage"
));
return
;
}
MonsterData
monsterData
=
GameData
.
getMonsterDataMap
().
get
(
id
);
GadgetData
gadgetData
=
GameData
.
getGadgetDataMap
().
get
(
id
);
ItemData
itemData
=
GameData
.
getItemDataMap
().
get
(
id
);
...
...
@@ -72,21 +72,21 @@ public final class SpawnCommand implements CommandHandler {
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.generic.invalid.entityId"
));
return
;
}
Scene
scene
=
targetPlayer
.
getScene
();
if
(
scene
.
getEntities
().
size
()
+
amount
>
GAME_OPTIONS
.
sceneEntityLimit
)
{
amount
=
Math
.
max
(
Math
.
min
(
GAME_OPTIONS
.
sceneEntityLimit
-
scene
.
getEntities
().
size
(),
amount
),
0
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.spawn.limit_reached"
,
amount
));
if
(
amount
<=
0
)
{
return
;
}
amount
=
Math
.
max
(
Math
.
min
(
GAME_OPTIONS
.
sceneEntityLimit
-
scene
.
getEntities
().
size
(),
amount
),
0
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.spawn.limit_reached"
,
amount
));
if
(
amount
<=
0
)
{
return
;
}
}
double
maxRadius
=
Math
.
sqrt
(
amount
*
0.2
/
Math
.
PI
);
for
(
int
i
=
0
;
i
<
amount
;
i
++)
{
Position
pos
=
GetRandomPositionInCircle
(
targetPlayer
.
getPosition
(),
maxRadius
).
addY
(
3
);
if
(
x
!=
0
&&
y
!=
0
&&
z
!=
0
)
{
if
(
x
!=
0
&&
y
!=
0
&&
z
!=
0
)
{
pos
=
GetRandomPositionInCircle
(
new
Position
(
x
,
y
,
z
),
maxRadius
).
addY
(
3
);
}
GameEntity
entity
=
null
;
...
...
@@ -120,7 +120,7 @@ public final class SpawnCommand implements CommandHandler {
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.spawn.success"
,
Integer
.
toString
(
amount
),
Integer
.
toString
(
id
)));
}
private
Position
GetRandomPositionInCircle
(
Position
origin
,
double
radius
){
private
Position
GetRandomPositionInCircle
(
Position
origin
,
double
radius
)
{
Position
target
=
origin
.
clone
();
double
angle
=
Math
.
random
()
*
360
;
double
r
=
Math
.
sqrt
(
Math
.
random
()
*
radius
*
radius
);
...
...
src/main/java/emu/grasscutter/command/commands/TeamCommand.java
View file @
ae2d1fe4
package
emu.grasscutter.command.commands
;
import
emu.grasscutter.command.Command
;
import
emu.grasscutter.command.CommandHandler
;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.server.packet.send.PacketChangeMpTeamAvatarRsp
;
import
java.util.List
;
import
static
emu
.
grasscutter
.
config
.
Configuration
.*;
import
java.util.ArrayList
;
import
java.util.HashSet
;
@Command
(
label
=
"team"
,
usage
=
"team <add|remove|set> [avatarId,...] [index|first|last|index-index,...]"
,
permission
=
"player.team"
,
permissionTargeted
=
"player.team.others"
,
description
=
"commands.team.description"
)
public
final
class
TeamCommand
implements
CommandHandler
{
private
static
final
int
BASE_AVATARID
=
10000000
;
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
args
.
isEmpty
())
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.usage"
);
return
;
}
switch
(
args
.
get
(
0
))
{
case
"add"
:
if
(!
addCommand
(
sender
,
targetPlayer
,
args
))
return
;
break
;
case
"remove"
:
if
(!
removeCommand
(
sender
,
targetPlayer
,
args
))
return
;
break
;
case
"set"
:
if
(!
setCommand
(
sender
,
targetPlayer
,
args
))
return
;
break
;
default
:
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.invalid_usage"
);
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.usage"
);
return
;
}
targetPlayer
.
getTeamManager
().
updateTeamEntities
(
new
PacketChangeMpTeamAvatarRsp
(
targetPlayer
,
targetPlayer
.
getTeamManager
().
getCurrentTeamInfo
()));
}
private
boolean
addCommand
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
args
.
size
()
<
2
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.invalid_usage"
);
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.add_usage"
);
return
false
;
}
int
index
=
-
1
;
if
(
args
.
size
()
>
2
)
{
try
{
index
=
Integer
.
parseInt
(
args
.
get
(
2
))
-
1
;
if
(
index
<
0
)
index
=
0
;
}
catch
(
Exception
e
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.invalid_index"
);
return
false
;
}
}
var
avatarIds
=
args
.
get
(
1
).
split
(
","
);
var
currentTeamAvatars
=
targetPlayer
.
getTeamManager
().
getCurrentTeamInfo
().
getAvatars
();
if
(
currentTeamAvatars
.
size
()
+
avatarIds
.
length
>
GAME_OPTIONS
.
avatarLimits
.
singlePlayerTeam
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.add_too_much"
,
GAME_OPTIONS
.
avatarLimits
.
singlePlayerTeam
);
return
false
;
}
for
(
var
avatarId:
avatarIds
)
{
int
id
=
Integer
.
parseInt
(
avatarId
);
var
success
=
addAvatar
(
sender
,
targetPlayer
,
id
,
index
);
if
(
index
>
0
)
++
index
;
}
return
true
;
}
private
boolean
removeCommand
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
args
.
size
()
<
2
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.invalid_usage"
);
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.remove_usage"
);
return
false
;
}
var
currentTeamAvatars
=
targetPlayer
.
getTeamManager
().
getCurrentTeamInfo
().
getAvatars
();
var
avatarCount
=
currentTeamAvatars
.
size
();
var
metaIndexList
=
args
.
get
(
1
).
split
(
","
);
var
indexes
=
new
HashSet
<
Integer
>();
var
ignoreList
=
new
ArrayList
<
Integer
>();
for
(
var
metaIndex:
metaIndexList
)
{
// step 1: parse metaIndex to indexes
var
subIndexes
=
transformToIndexes
(
metaIndex
,
avatarCount
);
if
(
subIndexes
==
null
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.failed_to_parse_index"
,
metaIndex
);
continue
;
}
// step 2: get all of the avatar id through indexes
for
(
var
avatarIndex:
subIndexes
)
{
try
{
indexes
.
add
(
currentTeamAvatars
.
get
(
avatarIndex
-
1
));
}
catch
(
Exception
e
)
{
ignoreList
.
add
(
avatarIndex
);
continue
;
}
}
}
// step 3: check if user remove all of the avatar
if
(
indexes
.
size
()
>=
avatarCount
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.remove_too_much"
);
return
false
;
}
// step 4: hint user for ignore index
if
(!
ignoreList
.
isEmpty
())
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.ignore_index"
,
ignoreList
);
}
// step 5: remove
currentTeamAvatars
.
removeAll
(
indexes
);
return
true
;
}
private
boolean
setCommand
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
args
.
size
()
<
3
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.invalid_usage"
);
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.set_usage"
);
return
false
;
}
var
currentTeamAvatars
=
targetPlayer
.
getTeamManager
().
getCurrentTeamInfo
().
getAvatars
();
int
index
;
try
{
index
=
Integer
.
parseInt
(
args
.
get
(
1
))
-
1
;
if
(
index
<
0
)
index
=
0
;
}
catch
(
Exception
e
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.failed_to_parse_index"
,
args
.
get
(
1
));
return
false
;
}
if
(
index
+
1
>
currentTeamAvatars
.
size
())
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.index_out_of_range"
);
return
false
;
}
int
avatarId
;
try
{
avatarId
=
Integer
.
parseInt
(
args
.
get
(
2
));
}
catch
(
Exception
e
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.failed_parse_avatar_id"
,
args
.
get
(
2
));
return
false
;
}
if
(
avatarId
<
BASE_AVATARID
)
{
avatarId
+=
BASE_AVATARID
;
}
if
(
currentTeamAvatars
.
contains
(
avatarId
))
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.avatar_already_in_team"
,
avatarId
);
return
false
;
}
if
(!
targetPlayer
.
getAvatars
().
hasAvatar
(
avatarId
))
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.avatar_not_found"
,
avatarId
);
return
false
;
}
currentTeamAvatars
.
set
(
index
,
avatarId
);
return
true
;
}
private
boolean
addAvatar
(
Player
sender
,
Player
targetPlayer
,
int
avatarId
,
int
index
)
{
if
(
avatarId
<
BASE_AVATARID
)
{
avatarId
+=
BASE_AVATARID
;
}
var
currentTeamAvatars
=
targetPlayer
.
getTeamManager
().
getCurrentTeamInfo
().
getAvatars
();
if
(
currentTeamAvatars
.
contains
(
avatarId
))
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.avatar_already_in_team"
,
avatarId
);
return
false
;
}
if
(!
targetPlayer
.
getAvatars
().
hasAvatar
(
avatarId
))
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.avatar_not_found"
,
avatarId
);
return
false
;
}
if
(
index
<
0
)
{
currentTeamAvatars
.
add
(
avatarId
);
}
else
{
currentTeamAvatars
.
add
(
index
,
avatarId
);
}
return
true
;
}
private
List
<
Integer
>
transformToIndexes
(
String
metaIndexes
,
int
listLength
)
{
// step 1: check if metaIndexes is a special constants
if
(
metaIndexes
.
equals
(
"first"
))
{
return
List
.
of
(
1
);
}
else
if
(
metaIndexes
.
equals
(
"last"
))
{
return
List
.
of
(
listLength
);
}
// step 2: check if metaIndexes is a range
if
(
metaIndexes
.
contains
(
"-"
))
{
var
range
=
metaIndexes
.
split
(
"-"
);
if
(
range
.
length
<
2
)
{
return
null
;
}
int
min
,
max
;
try
{
min
=
switch
(
range
[
0
])
{
case
"first"
->
1
;
case
"last"
->
listLength
;
default
->
Integer
.
parseInt
(
range
[
0
]);
};
max
=
switch
(
range
[
1
])
{
case
"first"
->
1
;
case
"last"
->
listLength
;
default
->
Integer
.
parseInt
(
range
[
1
]);
};
}
catch
(
Exception
e
)
{
return
null
;
}
if
(
min
>
max
)
{
min
^=
max
;
max
^=
min
;
min
^=
max
;
}
var
indexes
=
new
ArrayList
<
Integer
>();
for
(
int
i
=
min
;
i
<=
max
;
++
i
)
{
indexes
.
add
(
i
);
}
return
indexes
;
}
// step 3: index is a value, simply return
try
{
int
index
=
Integer
.
parseInt
(
metaIndexes
);
return
List
.
of
(
index
);
}
catch
(
Exception
e
)
{
return
null
;
}
}
}
package
emu.grasscutter.command.commands
;
import
emu.grasscutter.command.Command
;
import
emu.grasscutter.command.CommandHandler
;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.server.packet.send.PacketChangeMpTeamAvatarRsp
;
import
java.util.List
;
import
static
emu
.
grasscutter
.
config
.
Configuration
.*;
import
java.util.ArrayList
;
import
java.util.HashSet
;
@Command
(
label
=
"team"
,
usage
=
"team <add|remove|set> [avatarId,...] [index|first|last|index-index,...]"
,
permission
=
"player.team"
,
permissionTargeted
=
"player.team.others"
,
description
=
"commands.team.description"
)
public
final
class
TeamCommand
implements
CommandHandler
{
private
static
final
int
BASE_AVATARID
=
10000000
;
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
args
.
isEmpty
())
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.usage"
);
return
;
}
switch
(
args
.
get
(
0
))
{
case
"add"
:
if
(!
addCommand
(
sender
,
targetPlayer
,
args
))
return
;
break
;
case
"remove"
:
if
(!
removeCommand
(
sender
,
targetPlayer
,
args
))
return
;
break
;
case
"set"
:
if
(!
setCommand
(
sender
,
targetPlayer
,
args
))
return
;
break
;
default
:
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.invalid_usage"
);
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.usage"
);
return
;
}
targetPlayer
.
getTeamManager
().
updateTeamEntities
(
new
PacketChangeMpTeamAvatarRsp
(
targetPlayer
,
targetPlayer
.
getTeamManager
().
getCurrentTeamInfo
()));
}
private
boolean
addCommand
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
args
.
size
()
<
2
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.invalid_usage"
);
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.add_usage"
);
return
false
;
}
int
index
=
-
1
;
if
(
args
.
size
()
>
2
)
{
try
{
index
=
Integer
.
parseInt
(
args
.
get
(
2
))
-
1
;
if
(
index
<
0
)
index
=
0
;
}
catch
(
Exception
e
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.invalid_index"
);
return
false
;
}
}
var
avatarIds
=
args
.
get
(
1
).
split
(
","
);
var
currentTeamAvatars
=
targetPlayer
.
getTeamManager
().
getCurrentTeamInfo
().
getAvatars
();
if
(
currentTeamAvatars
.
size
()
+
avatarIds
.
length
>
GAME_OPTIONS
.
avatarLimits
.
singlePlayerTeam
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.add_too_much"
,
GAME_OPTIONS
.
avatarLimits
.
singlePlayerTeam
);
return
false
;
}
for
(
var
avatarId:
avatarIds
)
{
int
id
=
Integer
.
parseInt
(
avatarId
);
var
success
=
addAvatar
(
sender
,
targetPlayer
,
id
,
index
);
if
(
index
>
0
)
++
index
;
}
return
true
;
}
private
boolean
removeCommand
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
args
.
size
()
<
2
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.invalid_usage"
);
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.remove_usage"
);
return
false
;
}
var
currentTeamAvatars
=
targetPlayer
.
getTeamManager
().
getCurrentTeamInfo
().
getAvatars
();
var
avatarCount
=
currentTeamAvatars
.
size
();
var
metaIndexList
=
args
.
get
(
1
).
split
(
","
);
var
indexes
=
new
HashSet
<
Integer
>();
var
ignoreList
=
new
ArrayList
<
Integer
>();
for
(
var
metaIndex:
metaIndexList
)
{
// step 1: parse metaIndex to indexes
var
subIndexes
=
transformToIndexes
(
metaIndex
,
avatarCount
);
if
(
subIndexes
==
null
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.failed_to_parse_index"
,
metaIndex
);
continue
;
}
// step 2: get all of the avatar id through indexes
for
(
var
avatarIndex:
subIndexes
)
{
try
{
indexes
.
add
(
currentTeamAvatars
.
get
(
avatarIndex
-
1
));
}
catch
(
Exception
e
)
{
ignoreList
.
add
(
avatarIndex
);
continue
;
}
}
}
// step 3: check if user remove all of the avatar
if
(
indexes
.
size
()
>=
avatarCount
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.remove_too_much"
);
return
false
;
}
// step 4: hint user for ignore index
if
(!
ignoreList
.
isEmpty
())
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.ignore_index"
,
ignoreList
);
}
// step 5: remove
currentTeamAvatars
.
removeAll
(
indexes
);
return
true
;
}
private
boolean
setCommand
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
args
.
size
()
<
3
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.invalid_usage"
);
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.set_usage"
);
return
false
;
}
var
currentTeamAvatars
=
targetPlayer
.
getTeamManager
().
getCurrentTeamInfo
().
getAvatars
();
int
index
;
try
{
index
=
Integer
.
parseInt
(
args
.
get
(
1
))
-
1
;
if
(
index
<
0
)
index
=
0
;
}
catch
(
Exception
e
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.failed_to_parse_index"
,
args
.
get
(
1
));
return
false
;
}
if
(
index
+
1
>
currentTeamAvatars
.
size
())
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.index_out_of_range"
);
return
false
;
}
int
avatarId
;
try
{
avatarId
=
Integer
.
parseInt
(
args
.
get
(
2
));
}
catch
(
Exception
e
)
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.failed_parse_avatar_id"
,
args
.
get
(
2
));
return
false
;
}
if
(
avatarId
<
BASE_AVATARID
)
{
avatarId
+=
BASE_AVATARID
;
}
if
(
currentTeamAvatars
.
contains
(
avatarId
))
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.avatar_already_in_team"
,
avatarId
);
return
false
;
}
if
(!
targetPlayer
.
getAvatars
().
hasAvatar
(
avatarId
))
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.avatar_not_found"
,
avatarId
);
return
false
;
}
currentTeamAvatars
.
set
(
index
,
avatarId
);
return
true
;
}
private
boolean
addAvatar
(
Player
sender
,
Player
targetPlayer
,
int
avatarId
,
int
index
)
{
if
(
avatarId
<
BASE_AVATARID
)
{
avatarId
+=
BASE_AVATARID
;
}
var
currentTeamAvatars
=
targetPlayer
.
getTeamManager
().
getCurrentTeamInfo
().
getAvatars
();
if
(
currentTeamAvatars
.
contains
(
avatarId
))
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.avatar_already_in_team"
,
avatarId
);
return
false
;
}
if
(!
targetPlayer
.
getAvatars
().
hasAvatar
(
avatarId
))
{
CommandHandler
.
sendTranslatedMessage
(
sender
,
"commands.team.avatar_not_found"
,
avatarId
);
return
false
;
}
if
(
index
<
0
)
{
currentTeamAvatars
.
add
(
avatarId
);
}
else
{
currentTeamAvatars
.
add
(
index
,
avatarId
);
}
return
true
;
}
private
List
<
Integer
>
transformToIndexes
(
String
metaIndexes
,
int
listLength
)
{
// step 1: check if metaIndexes is a special constants
if
(
metaIndexes
.
equals
(
"first"
))
{
return
List
.
of
(
1
);
}
else
if
(
metaIndexes
.
equals
(
"last"
))
{
return
List
.
of
(
listLength
);
}
// step 2: check if metaIndexes is a range
if
(
metaIndexes
.
contains
(
"-"
))
{
var
range
=
metaIndexes
.
split
(
"-"
);
if
(
range
.
length
<
2
)
{
return
null
;
}
int
min
,
max
;
try
{
min
=
switch
(
range
[
0
])
{
case
"first"
->
1
;
case
"last"
->
listLength
;
default
->
Integer
.
parseInt
(
range
[
0
]);
};
max
=
switch
(
range
[
1
])
{
case
"first"
->
1
;
case
"last"
->
listLength
;
default
->
Integer
.
parseInt
(
range
[
1
]);
};
}
catch
(
Exception
e
)
{
return
null
;
}
if
(
min
>
max
)
{
min
^=
max
;
max
^=
min
;
min
^=
max
;
}
var
indexes
=
new
ArrayList
<
Integer
>();
for
(
int
i
=
min
;
i
<=
max
;
++
i
)
{
indexes
.
add
(
i
);
}
return
indexes
;
}
// step 3: index is a value, simply return
try
{
int
index
=
Integer
.
parseInt
(
metaIndexes
);
return
List
.
of
(
index
);
}
catch
(
Exception
e
)
{
return
null
;
}
}
}
src/main/java/emu/grasscutter/command/commands/TeleportAllCommand.java
View file @
ae2d1fe4
...
...
@@ -19,7 +19,7 @@ public final class TeleportAllCommand implements CommandHandler {
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.teleportAll.error"
));
return
;
}
for
(
Player
player
:
targetPlayer
.
getWorld
().
getPlayers
())
{
if
(
player
.
equals
(
targetPlayer
))
continue
;
...
...
@@ -27,7 +27,7 @@ public final class TeleportAllCommand implements CommandHandler {
player
.
getWorld
().
transferPlayerToScene
(
player
,
targetPlayer
.
getSceneId
(),
pos
);
}
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.teleportAll.success"
));
}
}
src/main/java/emu/grasscutter/command/commands/TeleportCommand.java
View file @
ae2d1fe4
...
...
@@ -58,8 +58,8 @@ public final class TeleportCommand implements CommandHandler {
if
(!
result
)
{
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.teleport.exists_error"
));
}
else
{
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.teleport.success"
,
targetPlayer
.
getNickname
(),
Float
.
toString
(
x
),
Float
.
toString
(
y
),
CommandHandler
.
sendMessage
(
sender
,
translate
(
sender
,
"commands.teleport.success"
,
targetPlayer
.
getNickname
(),
Float
.
toString
(
x
),
Float
.
toString
(
y
),
Float
.
toString
(
z
),
Integer
.
toString
(
sceneId
))
);
}
...
...
src/main/java/emu/grasscutter/config/ConfigContainer.java
View file @
ae2d1fe4
...
...
@@ -28,7 +28,7 @@ public class ConfigContainer {
try
{
// Check if the server is using a legacy config.
JsonObject
configObject
=
Grasscutter
.
getGsonFactory
()
.
fromJson
(
new
FileReader
(
Grasscutter
.
configFile
),
JsonObject
.
class
);
if
(!
configObject
.
has
(
"version"
))
{
if
(!
configObject
.
has
(
"version"
))
{
Grasscutter
.
getLogger
().
info
(
"Updating legacy .."
);
Grasscutter
.
saveConfig
(
null
);
}
...
...
@@ -37,7 +37,7 @@ public class ConfigContainer {
var
existing
=
config
.
version
;
var
latest
=
version
();
if
(
existing
==
latest
)
if
(
existing
==
latest
)
return
;
// Create a new configuration instance.
...
...
@@ -135,20 +135,20 @@ public class ConfigContainer {
public
static
class
Game
{
public
String
bindAddress
=
"0.0.0.0"
;
public
int
bindPort
=
22102
;
/* This is the address used in the default region. */
public
String
accessAddress
=
"127.0.0.1"
;
/* This is the port used in the default region. */
public
int
accessPort
=
0
;
/* Entities within a certain range will be loaded for the player */
public
int
loadEntitiesForPlayerRange
=
100
;
public
boolean
enableScriptInBigWorld
=
false
;
public
boolean
enableConsole
=
true
;
/* Controls whether packets should be logged in console or not */
public
ServerDebugMode
logPackets
=
ServerDebugMode
.
NONE
;
public
GameOptions
gameOptions
=
new
GameOptions
();
public
JoinOptions
joinOptions
=
new
JoinOptions
();
public
ConsoleAccount
serverAccount
=
new
ConsoleAccount
();
...
...
@@ -160,7 +160,7 @@ public class ConfigContainer {
public
Region
[]
regions
=
{};
public
String
defaultName
=
"Grasscutter"
;
public
ServerDebugMode
logRequests
=
ServerDebugMode
.
NONE
;
}
...
...
@@ -276,4 +276,4 @@ public class ConfigContainer {
public String Ip = "
127.0
.
0.1
"
;
public
int
Port
=
22102
;
}
}
\ No newline at end of file
}
src/main/java/emu/grasscutter/config/Configuration.java
View file @
ae2d1fe4
...
...
@@ -9,19 +9,19 @@ import static emu.grasscutter.Grasscutter.config;
/**
* A data container for the server's configuration.
*
*
* Use `import static emu.grasscutter.Configuration.*;`
* to import all configuration constants.
*/
public
final
class
Configuration
extends
ConfigContainer
{
/*
* Constants
*/
// 'c' is short for 'config' and makes code look 'cleaner'.
public
static
final
ConfigContainer
c
=
config
;
public
static
final
Locale
LANGUAGE
=
config
.
language
.
language
;
public
static
final
Locale
FALLBACK_LANGUAGE
=
config
.
language
.
fallback
;
public
static
final
String
DOCUMENT_LANGUAGE
=
config
.
language
.
document
;
...
...
@@ -30,22 +30,22 @@ public final class Configuration extends ConfigContainer {
private
static
final
String
PLUGINS_FOLDER
=
config
.
folderStructure
.
plugins
;
private
static
final
String
SCRIPTS_FOLDER
=
config
.
folderStructure
.
scripts
;
private
static
final
String
PACKETS_FOLDER
=
config
.
folderStructure
.
packets
;
public
static
final
Server
SERVER
=
config
.
server
;
public
static
final
Database
DATABASE
=
config
.
databaseInfo
;
public
static
final
Account
ACCOUNT
=
config
.
account
;
public
static
final
HTTP
HTTP_INFO
=
config
.
server
.
http
;
public
static
final
Game
GAME_INFO
=
config
.
server
.
game
;
public
static
final
Dispatch
DISPATCH_INFO
=
config
.
server
.
dispatch
;
public
static
final
Encryption
HTTP_ENCRYPTION
=
config
.
server
.
http
.
encryption
;
public
static
final
Policies
HTTP_POLICIES
=
config
.
server
.
http
.
policies
;
public
static
final
Files
HTTP_STATIC_FILES
=
config
.
server
.
http
.
files
;
public
static
final
GameOptions
GAME_OPTIONS
=
config
.
server
.
game
.
gameOptions
;
public
static
final
GameOptions
.
InventoryLimits
INVENTORY_LIMITS
=
config
.
server
.
game
.
gameOptions
.
inventoryLimits
;
/*
* Utilities
*/
...
...
@@ -56,11 +56,11 @@ public final class Configuration extends ConfigContainer {
public
static
String
DATA
(
String
path
)
{
return
Paths
.
get
(
DATA_FOLDER
,
path
).
toString
();
}
public
static
String
RESOURCE
(
String
path
)
{
return
Paths
.
get
(
RESOURCES_FOLDER
,
path
).
toString
();
}
public
static
String
PLUGIN
()
{
return
PLUGINS_FOLDER
;
}
...
...
src/main/java/emu/grasscutter/data/DataLoader.java
View file @
ae2d1fe4
...
...
@@ -29,7 +29,7 @@ public class DataLoader {
public
static
InputStream
load
(
String
resourcePath
)
throws
FileNotFoundException
{
return
load
(
resourcePath
,
true
);
}
/**
* Creates an input stream reader for a data file. If the file isn't found within the /data directory then it will fallback to the default within the jar resources
*
...
...
Prev
1
2
3
4
5
…
9
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment