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
65861c3c
Commit
65861c3c
authored
May 08, 2022
by
Akka
Committed by
GitHub
May 08, 2022
Browse files
Merge pull request #7 from Grasscutters/development
Development
parents
c2d2a37f
176f3e91
Changes
105
Hide whitespace changes
Inline
Side-by-side
src/main/java/emu/grasscutter/command/commands/SetWorldLevelCommand.java
View file @
65861c3c
...
...
@@ -7,27 +7,28 @@ import emu.grasscutter.game.player.Player;
import
java.util.List
;
import
static
emu
.
grasscutter
.
utils
.
Language
.
translate
;
@Command
(
label
=
"setworldlevel"
,
usage
=
"setworldlevel <level>"
,
description
=
"Sets your world level (Relog to see proper effects)"
,
aliases
=
{
"setworldlvl"
},
permission
=
"player.setworldlevel"
)
aliases
=
{
"setworldlvl"
},
permission
=
"player.setworldlevel"
,
description
=
"commands.setWorldLevel.description"
)
public
final
class
SetWorldLevelCommand
implements
CommandHandler
{
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
targetPlayer
==
null
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Target_needed
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.execution.need_target"
)
);
return
;
}
if
(
args
.
size
()
<
1
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
S
etWorldLevel
_
usage
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.s
etWorldLevel
.
usage
"
)
);
return
;
}
try
{
int
level
=
Integer
.
parseInt
(
args
.
get
(
0
));
if
(
level
>
8
||
level
<
0
)
{
CommandHandler
.
sendMessage
(
sender
,
G
ra
sscutter
.
getLanguage
().
SetWorldLevel_world_level_must_between_0_and_8
);
CommandHandler
.
sendMessage
(
sender
,
t
ra
nslate
(
"commands.setWorldLevel.value_error"
)
);
return
;
}
...
...
@@ -35,9 +36,9 @@ public final class SetWorldLevelCommand implements CommandHandler {
targetPlayer
.
getWorld
().
setWorldLevel
(
level
);
targetPlayer
.
setWorldLevel
(
level
);
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
SetWorldLevel_set_world_level
.
replace
(
"{level}
"
,
Integer
.
toString
(
level
)));
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.setWorldLevel.success
"
,
Integer
.
toString
(
level
)));
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendMessage
(
null
,
Grasscutter
.
getLanguage
().
S
etWorldLevel
_
invalid_world_level
);
CommandHandler
.
sendMessage
(
null
,
translate
(
"commands.s
etWorldLevel
.
invalid_world_level
"
)
);
}
}
}
src/main/java/emu/grasscutter/command/commands/SpawnCommand.java
View file @
65861c3c
...
...
@@ -20,14 +20,15 @@ import javax.swing.text.html.parser.Entity;
import
java.util.List
;
import
java.util.Random
;
@Command
(
label
=
"spawn"
,
usage
=
"spawn <entityId> [amount] [level(monster only)]"
,
description
=
"Spawns an entity near you"
,
permission
=
"server.spawn"
)
import
static
emu
.
grasscutter
.
utils
.
Language
.
translate
;
@Command
(
label
=
"spawn"
,
usage
=
"spawn <entityId> [amount] [level(monster only)]"
,
permission
=
"server.spawn"
,
description
=
"commands.spawn.description"
)
public
final
class
SpawnCommand
implements
CommandHandler
{
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
targetPlayer
==
null
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Target_needed
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.execution.need_target"
)
);
return
;
}
...
...
@@ -39,23 +40,23 @@ public final class SpawnCommand implements CommandHandler {
try
{
level
=
Integer
.
parseInt
(
args
.
get
(
2
));
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendMessage
(
sender
,
G
ra
sscutter
.
getLanguage
().
Invalid_arguments
);
CommandHandler
.
sendMessage
(
sender
,
t
ra
nslate
(
"commands.execution.argument_error"
)
);
}
// Fallthrough
case
2
:
try
{
amount
=
Integer
.
parseInt
(
args
.
get
(
1
));
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendMessage
(
sender
,
G
ra
sscutter
.
getLanguage
().
Invalid_
amount
);
CommandHandler
.
sendMessage
(
sender
,
t
ra
nslate
(
"commands.generic.error.
amount
"
)
);
}
// Fallthrough
case
1
:
try
{
id
=
Integer
.
parseInt
(
args
.
get
(
0
));
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendMessage
(
sender
,
G
ra
sscutter
.
getLanguage
().
Invalid_
entity
_id
);
CommandHandler
.
sendMessage
(
sender
,
t
ra
nslate
(
"commands.generic.error.
entity
Id"
)
);
}
break
;
default
:
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
S
pawn
_
usage
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.s
pawn
.
usage
"
)
);
return
;
}
...
...
@@ -63,7 +64,7 @@ public final class SpawnCommand implements CommandHandler {
GadgetData
gadgetData
=
GameData
.
getGadgetDataMap
().
get
(
id
);
ItemData
itemData
=
GameData
.
getItemDataMap
().
get
(
id
);
if
(
monsterData
==
null
&&
gadgetData
==
null
&&
itemData
==
null
)
{
CommandHandler
.
sendMessage
(
sender
,
G
ra
sscutter
.
getLanguage
().
Invalid_
entity
_id
);
CommandHandler
.
sendMessage
(
sender
,
t
ra
nslate
(
"commands.generic.error.
entity
Id"
)
);
return
;
}
Scene
scene
=
targetPlayer
.
getScene
();
...
...
@@ -99,7 +100,7 @@ public final class SpawnCommand implements CommandHandler {
scene
.
addEntity
(
entity
);
}
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Spawn_message
.
replace
(
"{amount}
"
,
Integer
.
toString
(
amount
)
).
replace
(
"{id}"
,
Integer
.
toString
(
id
)));
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.spawn.success
"
,
Integer
.
toString
(
amount
),
Integer
.
toString
(
id
)));
}
private
Position
GetRandomPositionInCircle
(
Position
origin
,
double
radius
){
...
...
src/main/java/emu/grasscutter/command/commands/StopCommand.java
View file @
65861c3c
...
...
@@ -7,17 +7,18 @@ import emu.grasscutter.game.player.Player;
import
java.util.List
;
@Command
(
label
=
"stop"
,
usage
=
"stop"
,
description
=
"Stops the server"
,
permission
=
"server.stop"
)
import
static
emu
.
grasscutter
.
utils
.
Language
.
translate
;
@Command
(
label
=
"stop"
,
usage
=
"stop"
,
permission
=
"server.stop"
,
description
=
"commands.stop.description"
)
public
final
class
StopCommand
implements
CommandHandler
{
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
CommandHandler
.
sendMessage
(
null
,
Grasscutter
.
getLanguage
().
Stop_message
);
CommandHandler
.
sendMessage
(
null
,
translate
(
"commands.stop.success"
)
);
for
(
Player
p
:
Grasscutter
.
getGameServer
().
getPlayers
().
values
())
{
CommandHandler
.
sendMessage
(
p
,
Grasscutter
.
getLanguage
().
Stop_message
);
CommandHandler
.
sendMessage
(
p
,
translate
(
"commands.stop.success"
)
);
}
System
.
exit
(
1
);
System
.
exit
(
1
000
);
}
}
src/main/java/emu/grasscutter/command/commands/TalentCommand.java
View file @
65861c3c
...
...
@@ -12,13 +12,14 @@ import emu.grasscutter.server.packet.send.PacketAvatarSkillUpgradeRsp;
import
java.util.List
;
@Command
(
label
=
"talent"
,
usage
=
"talent <talentID> <value>"
,
description
=
"Set talent level for your current active character"
,
permission
=
"player.settalent"
)
import
static
emu
.
grasscutter
.
utils
.
Language
.
translate
;
@Command
(
label
=
"talent"
,
usage
=
"talent <talentID> <value>"
,
permission
=
"player.settalent"
,
description
=
"commands.talent.description"
)
public
final
class
TalentCommand
implements
CommandHandler
{
private
void
setTalentLevel
(
Player
sender
,
Player
player
,
Avatar
avatar
,
int
talentId
,
int
talentLevel
)
{
int
oldLevel
=
avatar
.
getSkillLevelMap
().
get
(
talentId
);
if
(
talentLevel
<
0
||
talentLevel
>
15
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
T
alent
_
lower_16
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.t
alent
.
lower_16
"
)
);
return
;
}
...
...
@@ -30,29 +31,29 @@ public final class TalentCommand implements CommandHandler {
player
.
sendPacket
(
new
PacketAvatarSkillChangeNotify
(
avatar
,
talentId
,
oldLevel
,
talentLevel
));
player
.
sendPacket
(
new
PacketAvatarSkillUpgradeRsp
(
avatar
,
talentId
,
oldLevel
,
talentLevel
));
String
successMessage
=
Grasscutter
.
getLanguage
().
T
alent
_
set_id
.
replace
(
"{id}"
,
Integer
.
toString
(
talentId
))
;
String
successMessage
=
"commands.t
alent
.
set_id
"
;
AvatarSkillDepotData
depot
=
avatar
.
getData
().
getSkillDepot
();
if
(
talentId
==
depot
.
getSkills
().
get
(
0
))
{
successMessage
=
Grasscutter
.
getLanguage
().
T
alent
_
set_atk
;
successMessage
=
"commands.t
alent
.
set_atk
"
;
}
else
if
(
talentId
==
depot
.
getSkills
().
get
(
1
))
{
successMessage
=
Grasscutter
.
getLanguage
().
T
alent
_
set_e
;
successMessage
=
"commands.t
alent
.
set_e
"
;
}
else
if
(
talentId
==
depot
.
getEnergySkill
())
{
successMessage
=
Grasscutter
.
getLanguage
().
T
alent
_
set_q
;
successMessage
=
"commands.t
alent
.
set_q
"
;
}
CommandHandler
.
sendMessage
(
sender
,
successMessage
.
replace
(
"{level}"
,
Integer
.
toString
(
talentLevel
))
)
;
CommandHandler
.
sendMessage
(
sender
,
translate
(
successMessage
,
talentLevel
));
}
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
targetPlayer
==
null
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Target_needed
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.execution.need_target"
)
);
return
;
}
if
(
args
.
size
()
<
1
){
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
T
alent
_
usage_1
);
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
T
alent
_
usage_2
);
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
T
alent
_
usage_3
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.t
alent
.
usage_1
"
)
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.t
alent
.
usage_2
"
)
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.t
alent
.
usage_3
"
)
);
return
;
}
...
...
@@ -60,66 +61,54 @@ public final class TalentCommand implements CommandHandler {
Avatar
avatar
=
entity
.
getAvatar
();
String
cmdSwitch
=
args
.
get
(
0
);
switch
(
cmdSwitch
)
{
default
:
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Talent_usage_1
);
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Talent_usage_2
);
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Talent_usage_3
);
return
;
case
"set"
:
if
(
args
.
size
()
<
3
){
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Talent_usage_1
);
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Talent_usage_3
);
default
->
{
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.talent.usage_1"
));
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.talent.usage_2"
));
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.talent.usage_3"
));
return
;
}
case
"set"
->
{
if
(
args
.
size
()
<
3
)
{
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.talent.usage_1"
));
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.talent.usage_3"
));
return
;
}
try
{
int
skillId
=
Integer
.
parseInt
(
args
.
get
(
1
));
int
newLevel
=
Integer
.
parseInt
(
args
.
get
(
2
));
setTalentLevel
(
sender
,
targetPlayer
,
avatar
,
skillId
,
newLevel
);
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
T
alent
_
invalid_skill_id
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.t
alent
.
invalid_skill_id
"
)
);
return
;
}
break
;
case
"n"
:
case
"e"
:
case
"q"
:
if
(
args
.
size
()
<
2
){
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Talent_usage_2
);
}
case
"n"
,
"e"
,
"q"
->
{
if
(
args
.
size
()
<
2
)
{
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.talent.usage_2"
));
return
;
}
AvatarSkillDepotData
SkillDepot
=
avatar
.
getData
().
getSkillDepot
();
int
skillId
;
switch
(
cmdSwitch
)
{
default
:
skillId
=
SkillDepot
.
getSkills
().
get
(
0
);
break
;
case
"e"
:
skillId
=
SkillDepot
.
getSkills
().
get
(
1
);
break
;
case
"q"
:
skillId
=
SkillDepot
.
getEnergySkill
();
break
;
}
int
skillId
=
switch
(
cmdSwitch
)
{
default
->
SkillDepot
.
getSkills
().
get
(
0
);
case
"e"
->
SkillDepot
.
getSkills
().
get
(
1
);
case
"q"
->
SkillDepot
.
getEnergySkill
();
};
try
{
int
newLevel
=
Integer
.
parseInt
(
args
.
get
(
1
));
setTalentLevel
(
sender
,
targetPlayer
,
avatar
,
skillId
,
newLevel
);
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendMessage
(
sender
,
G
ra
sscutter
.
getLanguage
().
T
alent
_
invalid_
talent_
level
);
CommandHandler
.
sendMessage
(
sender
,
t
ra
nslate
(
"commands.t
alent
.
invalid_level
"
)
);
return
;
}
break
;
case
"getid"
:
}
case
"getid"
->
{
int
skillIdNorAtk
=
avatar
.
getData
().
getSkillDepot
().
getSkills
().
get
(
0
);
int
skillIdE
=
avatar
.
getData
().
getSkillDepot
().
getSkills
().
get
(
1
);
int
skillIdQ
=
avatar
.
getData
().
getSkillDepot
().
getEnergySkill
();
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Talent_normal_attack_id
.
replace
(
"{id}"
,
Integer
.
toString
(
skillIdNorAtk
)));
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Talent_e_skill_id
.
replace
(
"{id}"
,
Integer
.
toString
(
skillIdE
)));
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Talent_q_skill_id
.
replace
(
"{id}"
,
Integer
.
toString
(
skillIdQ
)));
break
;
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.talent.normal_attack_id"
,
Integer
.
toString
(
skillIdNorAtk
)));
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.talent.e_skill_id"
,
Integer
.
toString
(
skillIdE
)));
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.talent.q_skill_id"
,
Integer
.
toString
(
skillIdQ
)));
}
}
}
}
src/main/java/emu/grasscutter/command/commands/TeleportAllCommand.java
View file @
65861c3c
...
...
@@ -8,18 +8,20 @@ import emu.grasscutter.utils.Position;
import
java.util.List
;
@Command
(
label
=
"tpall"
,
usage
=
"tpall"
,
description
=
"Teleports all players in your world to your position"
,
permission
=
"player.tpall"
)
import
static
emu
.
grasscutter
.
utils
.
Language
.
translate
;
@Command
(
label
=
"tpall"
,
usage
=
"tpall"
,
permission
=
"player.tpall"
,
description
=
"commands.teleportAll.description"
)
public
final
class
TeleportAllCommand
implements
CommandHandler
{
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
targetPlayer
==
null
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Target_needed
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.execution.need_target"
)
);
return
;
}
if
(!
targetPlayer
.
getWorld
().
isMultiplayer
())
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
T
eleportAll
_message
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.t
eleportAll
.error"
)
);
return
;
}
...
...
@@ -30,5 +32,7 @@ public final class TeleportAllCommand implements CommandHandler {
player
.
getWorld
().
transferPlayerToScene
(
player
,
targetPlayer
.
getSceneId
(),
pos
);
}
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.teleportAll.success"
));
}
}
src/main/java/emu/grasscutter/command/commands/TeleportCommand.java
View file @
65861c3c
...
...
@@ -8,8 +8,9 @@ import emu.grasscutter.utils.Position;
import
java.util.List
;
@Command
(
label
=
"teleport"
,
usage
=
"teleport <x> <y> <z> [scene id]"
,
aliases
=
{
"tp"
},
description
=
"Change the player's position."
,
permission
=
"player.teleport"
)
import
static
emu
.
grasscutter
.
utils
.
Language
.
translate
;
@Command
(
label
=
"teleport"
,
usage
=
"teleport <x> <y> <z> [scene id]"
,
aliases
=
{
"tp"
},
permission
=
"player.teleport"
,
description
=
"commands.teleport.description"
)
public
final
class
TeleportCommand
implements
CommandHandler
{
private
float
parseRelative
(
String
input
,
Float
current
)
{
// TODO: Maybe this will be useful elsewhere later
...
...
@@ -26,7 +27,7 @@ public final class TeleportCommand implements CommandHandler {
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
targetPlayer
==
null
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Target_needed
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.execution.need_target"
)
);
return
;
}
...
...
@@ -41,7 +42,7 @@ public final class TeleportCommand implements CommandHandler {
try
{
sceneId
=
Integer
.
parseInt
(
args
.
get
(
3
));
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendMessage
(
sender
,
G
ra
sscutter
.
getLanguage
().
Invalid_arguments
);
CommandHandler
.
sendMessage
(
sender
,
t
ra
nslate
(
"commands.execution.argument_error"
)
);
}
// Fallthrough
case
3
:
try
{
...
...
@@ -49,20 +50,23 @@ public final class TeleportCommand implements CommandHandler {
y
=
parseRelative
(
args
.
get
(
1
),
y
);
z
=
parseRelative
(
args
.
get
(
2
),
z
);
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
T
eleport
_
invalid_position
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.t
eleport
.
invalid_position
"
)
);
}
break
;
default
:
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
T
eleport
_
usage
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.t
eleport
.
usage
"
)
);
return
;
}
Position
target_pos
=
new
Position
(
x
,
y
,
z
);
boolean
result
=
targetPlayer
.
getWorld
().
transferPlayerToScene
(
targetPlayer
,
sceneId
,
target_pos
);
if
(!
result
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
T
eleport
_
invalid_position
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.t
eleport
.
invalid_position
"
)
);
}
else
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Teleport_message
.
replace
(
"{name}"
,
targetPlayer
.
getNickname
()).
replace
(
"{x}"
,
Float
.
toString
(
x
)).
replace
(
"{y}"
,
Float
.
toString
(
y
)).
replace
(
"{z}"
,
Float
.
toString
(
z
)).
replace
(
"{id}"
,
Integer
.
toString
(
sceneId
)));
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.teleport.success"
,
targetPlayer
.
getNickname
(),
Float
.
toString
(
x
),
Float
.
toString
(
y
),
Float
.
toString
(
z
),
Integer
.
toString
(
sceneId
))
);
}
}
...
...
src/main/java/emu/grasscutter/command/commands/WeatherCommand.java
View file @
65861c3c
...
...
@@ -9,14 +9,15 @@ import emu.grasscutter.server.packet.send.PacketSceneAreaWeatherNotify;
import
java.util.List
;
@Command
(
label
=
"weather"
,
usage
=
"weather <weatherId> [climateId]"
,
description
=
"Changes the weather."
,
aliases
=
{
"w"
},
permission
=
"player.weather"
)
import
static
emu
.
grasscutter
.
utils
.
Language
.
translate
;
@Command
(
label
=
"weather"
,
usage
=
"weather <weatherId> [climateId]"
,
aliases
=
{
"w"
},
permission
=
"player.weather"
,
description
=
"commands.weather.description"
)
public
final
class
WeatherCommand
implements
CommandHandler
{
@Override
public
void
execute
(
Player
sender
,
Player
targetPlayer
,
List
<
String
>
args
)
{
if
(
targetPlayer
==
null
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Target_needed
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.execution.need_target"
)
);
return
;
}
...
...
@@ -27,17 +28,17 @@ public final class WeatherCommand implements CommandHandler {
try
{
climateId
=
Integer
.
parseInt
(
args
.
get
(
1
));
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
W
eather
_
invalid_id
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.w
eather
.
invalid_id
"
)
);
}
case
1
:
try
{
weatherId
=
Integer
.
parseInt
(
args
.
get
(
0
));
}
catch
(
NumberFormatException
ignored
)
{
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
W
eather
_
invalid_id
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.w
eather
.
invalid_id
"
)
);
}
break
;
default
:
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
W
eather
_
usage
);
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.w
eather
.
usage
"
)
);
return
;
}
...
...
@@ -46,7 +47,6 @@ public final class WeatherCommand implements CommandHandler {
targetPlayer
.
getScene
().
setWeather
(
weatherId
);
targetPlayer
.
getScene
().
setClimate
(
climate
);
targetPlayer
.
getScene
().
broadcastPacket
(
new
PacketSceneAreaWeatherNotify
(
targetPlayer
));
CommandHandler
.
sendMessage
(
sender
,
Grasscutter
.
getLanguage
().
Weather_message
.
replace
(
"{weatherId}"
,
Integer
.
toString
(
weatherId
)).
replace
(
"{climateId}"
,
Integer
.
toString
(
climateId
)));
CommandHandler
.
sendMessage
(
sender
,
translate
(
"commands.weather.success"
,
Integer
.
toString
(
weatherId
),
Integer
.
toString
(
climateId
)));
}
}
src/main/java/emu/grasscutter/data/ResourceLoader.java
View file @
65861c3c
...
...
@@ -7,6 +7,7 @@ import java.util.Map.Entry;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
import
com.google.gson.Gson
;
import
emu.grasscutter.utils.Utils
;
import
org.reflections.Reflections
;
...
...
@@ -120,14 +121,15 @@ public class ResourceLoader {
@SuppressWarnings
({
"rawtypes"
,
"unchecked"
})
protected
static
void
loadFromResource
(
Class
<?>
c
,
String
fileName
,
Int2ObjectMap
map
)
throws
Exception
{
try
(
FileReader
fileReader
=
new
FileReader
(
Grasscutter
.
getConfig
().
RESOURCE_FOLDER
+
"ExcelBinOutput/"
+
fileName
))
{
List
list
=
Grasscutter
.
getGsonFactory
().
fromJson
(
fileReader
,
TypeToken
.
getParameterized
(
Collection
.
class
,
c
).
getType
());
for
(
Object
o
:
list
)
{
GameResource
res
=
(
GameResource
)
o
;
res
.
onLoad
();
map
.
put
(
res
.
getId
(),
res
);
}
FileReader
fileReader
=
new
FileReader
(
Grasscutter
.
getConfig
().
RESOURCE_FOLDER
+
"ExcelBinOutput/"
+
fileName
);
Gson
gson
=
Grasscutter
.
getGsonFactory
();
List
list
=
gson
.
fromJson
(
fileReader
,
List
.
class
);
for
(
Object
o
:
list
)
{
Map
<
String
,
Object
>
tempMap
=
Utils
.
switchPropertiesUpperLowerCase
((
Map
<
String
,
Object
>)
o
,
c
);
GameResource
res
=
gson
.
fromJson
(
gson
.
toJson
(
tempMap
),
TypeToken
.
get
(
c
).
getType
());
res
.
onLoad
();
map
.
put
(
res
.
getId
(),
res
);
}
}
...
...
src/main/java/emu/grasscutter/game/entity/EntityMonster.java
View file @
65861c3c
...
...
@@ -117,6 +117,7 @@ public class EntityMonster extends GameEntity {
this
.
getScene
().
getDeadSpawnedEntities
().
add
(
getSpawnEntry
());
}
if
(
getScene
().
getScriptManager
().
isInit
()
&&
this
.
getGroupId
()
>
0
)
{
getScene
().
getScriptManager
().
onMonsterDie
();
getScene
().
getScriptManager
().
callEvent
(
EventType
.
EVENT_ANY_MONSTER_DIE
,
null
);
}
if
(
getScene
().
getChallenge
()
!=
null
&&
getScene
().
getChallenge
().
getGroup
().
id
==
this
.
getGroupId
())
{
...
...
src/main/java/emu/grasscutter/game/expedition/ExpeditionInfo.java
0 → 100644
View file @
65861c3c
package
emu.grasscutter.game.expedition
;
import
dev.morphia.annotations.Entity
;
@Entity
public
class
ExpeditionInfo
{
public
int
getState
()
{
return
state
;
}
public
void
setState
(
int
state
)
{
this
.
state
=
state
;
}
public
int
getExpId
()
{
return
expId
;
}
public
void
setExpId
(
int
expId
)
{
this
.
expId
=
expId
;
}
public
int
getHourTime
()
{
return
hourTime
;
}
public
void
setHourTime
(
int
hourTime
)
{
this
.
hourTime
=
hourTime
;
}
public
int
getStartTime
()
{
return
startTime
;
}
public
void
setStartTime
(
int
startTime
)
{
this
.
startTime
=
startTime
;
}
private
int
state
;
private
int
expId
;
private
int
hourTime
;
private
int
startTime
;
}
src/main/java/emu/grasscutter/game/expedition/ExpeditionManager.java
0 → 100644
View file @
65861c3c
package
emu.grasscutter.game.expedition
;
import
com.google.gson.reflect.TypeToken
;
import
emu.grasscutter.Grasscutter
;
import
emu.grasscutter.server.game.GameServer
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectMap
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
;
import
java.io.FileReader
;
import
java.util.Collection
;
import
java.util.List
;
public
class
ExpeditionManager
{
public
GameServer
getGameServer
()
{
return
gameServer
;
}
private
final
GameServer
gameServer
;
public
Int2ObjectMap
<
List
<
ExpeditionRewardDataList
>>
getExpeditionRewardDataList
()
{
return
expeditionRewardData
;
}
private
final
Int2ObjectMap
<
List
<
ExpeditionRewardDataList
>>
expeditionRewardData
;
public
ExpeditionManager
(
GameServer
gameServer
)
{
this
.
gameServer
=
gameServer
;
this
.
expeditionRewardData
=
new
Int2ObjectOpenHashMap
<>();
this
.
load
();
}
public
synchronized
void
load
()
{
try
(
FileReader
fileReader
=
new
FileReader
(
Grasscutter
.
getConfig
().
DATA_FOLDER
+
"ExpeditionReward.json"
))
{
getExpeditionRewardDataList
().
clear
();
List
<
ExpeditionRewardInfo
>
banners
=
Grasscutter
.
getGsonFactory
().
fromJson
(
fileReader
,
TypeToken
.
getParameterized
(
Collection
.
class
,
ExpeditionRewardInfo
.
class
).
getType
());
if
(
banners
.
size
()
>
0
)
{
for
(
ExpeditionRewardInfo
di
:
banners
)
{
getExpeditionRewardDataList
().
put
(
di
.
getExpId
(),
di
.
getExpeditionRewardDataList
());
}
Grasscutter
.
getLogger
().
info
(
"Expedition reward successfully loaded."
);
}
else
{
Grasscutter
.
getLogger
().
error
(
"Unable to load expedition reward. Expedition reward size is 0."
);
}
}
catch
(
Exception
e
)
{
Grasscutter
.
getLogger
().
error
(
"Unable to load expedition reward."
,
e
);
}
}
}
src/main/java/emu/grasscutter/game/expedition/ExpeditionRewardData.java
0 → 100644
View file @
65861c3c
package
emu.grasscutter.game.expedition
;
public
class
ExpeditionRewardData
{
private
int
itemId
;
private
int
minCount
;
private
int
maxCount
;
public
int
getItemId
()
{
return
itemId
;
}
public
int
getMinCount
()
{
return
minCount
;
}
public
int
getMaxCount
()
{
return
maxCount
;
}
}
src/main/java/emu/grasscutter/game/expedition/ExpeditionRewardDataList.java
0 → 100644
View file @
65861c3c
package
emu.grasscutter.game.expedition
;
import
java.util.List
;
public
class
ExpeditionRewardDataList
{
public
int
getHourTime
()
{
return
hourTime
;
}
public
List
<
ExpeditionRewardData
>
getExpeditionRewardData
()
{
return
expeditionRewardData
;
}
private
int
hourTime
;
private
List
<
ExpeditionRewardData
>
expeditionRewardData
;
}
src/main/java/emu/grasscutter/game/expedition/ExpeditionRewardInfo.java
0 → 100644
View file @
65861c3c
package
emu.grasscutter.game.expedition
;
import
java.util.List
;
public
class
ExpeditionRewardInfo
{
public
int
getExpId
()
{
return
expId
;
}
public
List
<
ExpeditionRewardDataList
>
getExpeditionRewardDataList
()
{
return
expeditionRewardDataList
;
}
private
int
expId
;
private
List
<
ExpeditionRewardDataList
>
expeditionRewardDataList
;
}
src/main/java/emu/grasscutter/game/gacha/GachaBanner.java
View file @
65861c3c
...
...
@@ -96,7 +96,7 @@ public class GachaBanner {
return
toProto
(
""
);
}
public
GachaInfo
toProto
(
String
sessionKey
)
{
String
record
=
"http
s
://"
String
record
=
"http
"
+
(
Grasscutter
.
getConfig
().
getDispatchOptions
().
FrontHTTPS
?
"s"
:
""
)
+
"
://"
+
(
Grasscutter
.
getConfig
().
getDispatchOptions
().
PublicIp
.
isEmpty
()
?
Grasscutter
.
getConfig
().
getDispatchOptions
().
Ip
:
Grasscutter
.
getConfig
().
getDispatchOptions
().
PublicIp
)
...
...
src/main/java/emu/grasscutter/game/managers/MovementManager/MovementManager.java
deleted
100644 → 0
View file @
c2d2a37f
package
emu.grasscutter.game.managers.MovementManager
;
import
emu.grasscutter.Grasscutter
;
import
emu.grasscutter.game.entity.EntityAvatar
;
import
emu.grasscutter.game.entity.GameEntity
;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.game.props.FightProperty
;
import
emu.grasscutter.game.props.LifeState
;
import
emu.grasscutter.game.props.PlayerProperty
;
import
emu.grasscutter.net.proto.EntityMoveInfoOuterClass
;
import
emu.grasscutter.net.proto.MotionInfoOuterClass.MotionInfo
;
import
emu.grasscutter.net.proto.MotionStateOuterClass.MotionState
;
import
emu.grasscutter.net.proto.PlayerDieTypeOuterClass.PlayerDieType
;
import
emu.grasscutter.net.proto.VectorOuterClass
;
import
emu.grasscutter.server.game.GameSession
;
import
emu.grasscutter.server.packet.send.*
;
import
emu.grasscutter.utils.Position
;
import
org.jetbrains.annotations.NotNull
;
import
java.lang.Math
;
import
java.util.*
;
public
class
MovementManager
{
public
HashMap
<
String
,
HashSet
<
MotionState
>>
MotionStatesCategorized
=
new
HashMap
<>();
private
enum
Consumption
{
None
(
0
),
// consume
CLIMB_START
(-
500
),
CLIMBING
(-
150
),
CLIMB_JUMP
(-
2500
),
DASH
(-
1800
),
SPRINT
(-
360
),
FLY
(-
60
),
SWIM_DASH_START
(-
200
),
SWIM_DASH
(-
200
),
SWIMMING
(-
80
),
// restore
STANDBY
(
500
),
RUN
(
500
),
WALK
(
500
),
STANDBY_MOVE
(
500
),
POWERED_FLY
(
500
);
public
final
int
amount
;
Consumption
(
int
amount
)
{
this
.
amount
=
amount
;
}
}
private
MotionState
previousState
=
MotionState
.
MOTION_STANDBY
;
private
MotionState
currentState
=
MotionState
.
MOTION_STANDBY
;
private
Position
previousCoordinates
=
new
Position
(
0
,
0
,
0
);
private
Position
currentCoordinates
=
new
Position
(
0
,
0
,
0
);
private
final
Player
player
;
private
float
landSpeed
=
0
;
private
Timer
movementManagerTickTimer
;
private
GameSession
cachedSession
=
null
;
private
GameEntity
cachedEntity
=
null
;
private
int
staminaRecoverDelay
=
0
;
public
MovementManager
(
Player
player
)
{
previousCoordinates
.
add
(
new
Position
(
0
,
0
,
0
));
this
.
player
=
player
;
MotionStatesCategorized
.
put
(
"SWIM"
,
new
HashSet
<>(
Arrays
.
asList
(
MotionState
.
MOTION_SWIM_MOVE
,
MotionState
.
MOTION_SWIM_IDLE
,
MotionState
.
MOTION_SWIM_DASH
,
MotionState
.
MOTION_SWIM_JUMP
)));
MotionStatesCategorized
.
put
(
"STANDBY"
,
new
HashSet
<>(
Arrays
.
asList
(
MotionState
.
MOTION_STANDBY
,
MotionState
.
MOTION_STANDBY_MOVE
,
MotionState
.
MOTION_DANGER_STANDBY
,
MotionState
.
MOTION_DANGER_STANDBY_MOVE
,
MotionState
.
MOTION_LADDER_TO_STANDBY
,
MotionState
.
MOTION_JUMP_UP_WALL_FOR_STANDBY
)));
MotionStatesCategorized
.
put
(
"CLIMB"
,
new
HashSet
<>(
Arrays
.
asList
(
MotionState
.
MOTION_CLIMB
,
MotionState
.
MOTION_CLIMB_JUMP
,
MotionState
.
MOTION_STANDBY_TO_CLIMB
,
MotionState
.
MOTION_LADDER_IDLE
,
MotionState
.
MOTION_LADDER_MOVE
,
MotionState
.
MOTION_LADDER_SLIP
,
MotionState
.
MOTION_STANDBY_TO_LADDER
)));
MotionStatesCategorized
.
put
(
"FLY"
,
new
HashSet
<>(
Arrays
.
asList
(
MotionState
.
MOTION_FLY
,
MotionState
.
MOTION_FLY_IDLE
,
MotionState
.
MOTION_FLY_SLOW
,
MotionState
.
MOTION_FLY_FAST
,
MotionState
.
MOTION_POWERED_FLY
)));
MotionStatesCategorized
.
put
(
"RUN"
,
new
HashSet
<>(
Arrays
.
asList
(
MotionState
.
MOTION_DASH
,
MotionState
.
MOTION_DANGER_DASH
,
MotionState
.
MOTION_DASH_BEFORE_SHAKE
,
MotionState
.
MOTION_RUN
,
MotionState
.
MOTION_DANGER_RUN
,
MotionState
.
MOTION_WALK
,
MotionState
.
MOTION_DANGER_WALK
)));
}
public
void
handle
(
GameSession
session
,
EntityMoveInfoOuterClass
.
EntityMoveInfo
moveInfo
,
GameEntity
entity
)
{
if
(
movementManagerTickTimer
==
null
)
{
movementManagerTickTimer
=
new
Timer
();
movementManagerTickTimer
.
scheduleAtFixedRate
(
new
MotionManagerTick
(),
0
,
200
);
}
// cache info for later use in tick
cachedSession
=
session
;
cachedEntity
=
entity
;
MotionInfo
motionInfo
=
moveInfo
.
getMotionInfo
();
moveEntity
(
entity
,
moveInfo
);
VectorOuterClass
.
Vector
posVector
=
motionInfo
.
getPos
();
Position
newPos
=
new
Position
(
posVector
.
getX
(),
posVector
.
getY
(),
posVector
.
getZ
());;
if
(
newPos
.
getX
()
!=
0
&&
newPos
.
getY
()
!=
0
&&
newPos
.
getZ
()
!=
0
)
{
currentCoordinates
=
newPos
;
}
currentState
=
motionInfo
.
getState
();
Grasscutter
.
getLogger
().
debug
(
""
+
currentState
);
handleFallOnGround
(
motionInfo
);
}
public
void
resetTimer
()
{
movementManagerTickTimer
.
cancel
();
movementManagerTickTimer
=
null
;
}
private
void
moveEntity
(
GameEntity
entity
,
EntityMoveInfoOuterClass
.
EntityMoveInfo
moveInfo
)
{
entity
.
getPosition
().
set
(
moveInfo
.
getMotionInfo
().
getPos
());
entity
.
getRotation
().
set
(
moveInfo
.
getMotionInfo
().
getRot
());
entity
.
setLastMoveSceneTimeMs
(
moveInfo
.
getSceneTime
());
entity
.
setLastMoveReliableSeq
(
moveInfo
.
getReliableSeq
());
entity
.
setMotionState
(
moveInfo
.
getMotionInfo
().
getState
());
}
private
boolean
isPlayerMoving
()
{
float
diffX
=
currentCoordinates
.
getX
()
-
previousCoordinates
.
getX
();
float
diffY
=
currentCoordinates
.
getY
()
-
previousCoordinates
.
getY
();
float
diffZ
=
currentCoordinates
.
getZ
()
-
previousCoordinates
.
getZ
();
// Grasscutter.getLogger().debug("isPlayerMoving: " + previousCoordinates + ", " + currentCoordinates + ", " + diffX + ", " + diffY + ", " + diffZ);
return
Math
.
abs
(
diffX
)
>
0.2
||
Math
.
abs
(
diffY
)
>
0.1
||
Math
.
abs
(
diffZ
)
>
0.2
;
}
private
int
getCurrentStamina
()
{
return
player
.
getProperty
(
PlayerProperty
.
PROP_CUR_PERSIST_STAMINA
);
}
private
int
getMaximumStamina
()
{
return
player
.
getProperty
(
PlayerProperty
.
PROP_MAX_STAMINA
);
}
// Returns new stamina
public
int
updateStamina
(
GameSession
session
,
int
amount
)
{
int
currentStamina
=
session
.
getPlayer
().
getProperty
(
PlayerProperty
.
PROP_CUR_PERSIST_STAMINA
);
if
(
amount
==
0
)
{
return
currentStamina
;
}
int
playerMaxStamina
=
session
.
getPlayer
().
getProperty
(
PlayerProperty
.
PROP_MAX_STAMINA
);
int
newStamina
=
currentStamina
+
amount
;
if
(
newStamina
<
0
)
{
newStamina
=
0
;
}
if
(
newStamina
>
playerMaxStamina
)
{
newStamina
=
playerMaxStamina
;
}
session
.
getPlayer
().
setProperty
(
PlayerProperty
.
PROP_CUR_PERSIST_STAMINA
,
newStamina
);
return
newStamina
;
}
private
void
handleFallOnGround
(
@NotNull
MotionInfo
motionInfo
)
{
MotionState
state
=
motionInfo
.
getState
();
// land speed and fall on ground event arrive in different packets
// cache land speed
if
(
state
==
MotionState
.
MOTION_LAND_SPEED
)
{
landSpeed
=
motionInfo
.
getSpeed
().
getY
();
}
if
(
state
==
MotionState
.
MOTION_FALL_ON_GROUND
)
{
float
currentHP
=
cachedEntity
.
getFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
);
float
maxHP
=
cachedEntity
.
getFightProperty
(
FightProperty
.
FIGHT_PROP_MAX_HP
);
float
damage
=
0
;
// Grasscutter.getLogger().debug("LandSpeed: " + landSpeed);
if
(
landSpeed
<
-
23.5
)
{
damage
=
(
float
)(
maxHP
*
0.33
);
}
if
(
landSpeed
<
-
25
)
{
damage
=
(
float
)(
maxHP
*
0.5
);
}
if
(
landSpeed
<
-
26.5
)
{
damage
=
(
float
)(
maxHP
*
0.66
);
}
if
(
landSpeed
<
-
28
)
{
damage
=
(
maxHP
*
1
);
}
float
newHP
=
currentHP
-
damage
;
if
(
newHP
<
0
)
{
newHP
=
0
;
}
// Grasscutter.getLogger().debug("Max: " + maxHP + "\tCurr: " + currentHP + "\tDamage: " + damage + "\tnewHP: " + newHP);
cachedEntity
.
setFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
,
newHP
);
cachedEntity
.
getWorld
().
broadcastPacket
(
new
PacketEntityFightPropUpdateNotify
(
cachedEntity
,
FightProperty
.
FIGHT_PROP_CUR_HP
));
if
(
newHP
==
0
)
{
killAvatar
(
cachedSession
,
cachedEntity
,
PlayerDieType
.
PLAYER_DIE_FALL
);
}
landSpeed
=
0
;
}
}
private
void
handleDrowning
()
{
int
stamina
=
getCurrentStamina
();
if
(
stamina
<
10
)
{
boolean
isSwimming
=
MotionStatesCategorized
.
get
(
"SWIM"
).
contains
(
currentState
);
Grasscutter
.
getLogger
().
debug
(
player
.
getProperty
(
PlayerProperty
.
PROP_CUR_PERSIST_STAMINA
)
+
"/"
+
player
.
getProperty
(
PlayerProperty
.
PROP_MAX_STAMINA
)
+
"\t"
+
currentState
+
"\t"
+
isSwimming
);
if
(
isSwimming
&&
currentState
!=
MotionState
.
MOTION_SWIM_IDLE
)
{
killAvatar
(
cachedSession
,
cachedEntity
,
PlayerDieType
.
PLAYER_DIE_DRAWN
);
}
}
}
public
void
killAvatar
(
GameSession
session
,
GameEntity
entity
,
PlayerDieType
dieType
)
{
cachedSession
.
send
(
new
PacketAvatarLifeStateChangeNotify
(
cachedSession
.
getPlayer
().
getTeamManager
().
getCurrentAvatarEntity
().
getAvatar
(),
LifeState
.
LIFE_DEAD
,
dieType
));
cachedSession
.
send
(
new
PacketLifeStateChangeNotify
(
cachedEntity
,
LifeState
.
LIFE_DEAD
,
dieType
));
cachedEntity
.
setFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
,
0
);
cachedEntity
.
getWorld
().
broadcastPacket
(
new
PacketEntityFightPropUpdateNotify
(
cachedEntity
,
FightProperty
.
FIGHT_PROP_CUR_HP
));
entity
.
getWorld
().
broadcastPacket
(
new
PacketLifeStateChangeNotify
(
0
,
entity
,
LifeState
.
LIFE_DEAD
));
session
.
getPlayer
().
getScene
().
removeEntity
(
entity
);
((
EntityAvatar
)
entity
).
onDeath
(
dieType
,
0
);
}
private
class
MotionManagerTick
extends
TimerTask
{
public
void
run
()
{
if
(
Grasscutter
.
getConfig
().
OpenStamina
)
{
boolean
moving
=
isPlayerMoving
();
if
(
moving
||
(
getCurrentStamina
()
<
getMaximumStamina
()))
{
Grasscutter
.
getLogger
().
debug
(
"Player moving: "
+
moving
+
", stamina full: "
+
(
getCurrentStamina
()
>=
getMaximumStamina
())
+
", recalculate stamina"
);
Consumption
consumption
=
Consumption
.
None
;
// TODO: refactor these conditions.
if
(
MotionStatesCategorized
.
get
(
"CLIMB"
).
contains
(
currentState
))
{
if
(
currentState
==
MotionState
.
MOTION_CLIMB
)
{
// CLIMB
if
(
previousState
!=
MotionState
.
MOTION_CLIMB
&&
previousState
!=
MotionState
.
MOTION_CLIMB_JUMP
)
{
consumption
=
Consumption
.
CLIMB_START
;
}
else
{
consumption
=
Consumption
.
CLIMBING
;
}
}
if
(
currentState
==
MotionState
.
MOTION_CLIMB_JUMP
)
{
if
(
previousState
!=
MotionState
.
MOTION_CLIMB_JUMP
)
{
consumption
=
Consumption
.
CLIMB_JUMP
;
}
}
if
(
currentState
==
MotionState
.
MOTION_JUMP
)
{
if
(
previousState
==
MotionState
.
MOTION_CLIMB
)
{
consumption
=
Consumption
.
CLIMB_JUMP
;
}
}
}
else
if
(
MotionStatesCategorized
.
get
(
"SWIM"
).
contains
((
currentState
)))
{
// SWIM
if
(
currentState
==
MotionState
.
MOTION_SWIM_MOVE
)
{
consumption
=
Consumption
.
SWIMMING
;
}
if
(
currentState
==
MotionState
.
MOTION_SWIM_DASH
)
{
if
(
previousState
!=
MotionState
.
MOTION_SWIM_DASH
)
{
consumption
=
Consumption
.
SWIM_DASH_START
;
}
else
{
consumption
=
Consumption
.
SWIM_DASH
;
}
}
}
else
if
(
MotionStatesCategorized
.
get
(
"RUN"
).
contains
(
currentState
))
{
// RUN, DASH and WALK
// DASH
if
(
currentState
==
MotionState
.
MOTION_DASH
)
{
if
(
previousState
==
MotionState
.
MOTION_DASH
)
{
consumption
=
Consumption
.
SPRINT
;
}
else
{
// cost more to start dashing
consumption
=
Consumption
.
DASH
;
}
}
// RUN
if
(
currentState
==
MotionState
.
MOTION_RUN
)
{
consumption
=
Consumption
.
RUN
;
}
// WALK
if
(
currentState
==
MotionState
.
MOTION_WALK
)
{
consumption
=
Consumption
.
WALK
;
}
}
else
if
(
MotionStatesCategorized
.
get
(
"FLY"
).
contains
(
currentState
))
{
// FLY
consumption
=
Consumption
.
FLY
;
// POWERED_FLY, e.g. wind tunnel
if
(
currentState
==
MotionState
.
MOTION_POWERED_FLY
)
{
consumption
=
Consumption
.
POWERED_FLY
;
}
}
else
if
(
MotionStatesCategorized
.
get
(
"STANDBY"
).
contains
(
currentState
))
{
// STAND
if
(
currentState
==
MotionState
.
MOTION_STANDBY
)
{
consumption
=
Consumption
.
STANDBY
;
}
if
(
currentState
==
MotionState
.
MOTION_STANDBY_MOVE
)
{
consumption
=
Consumption
.
STANDBY_MOVE
;
}
}
// tick triggered
handleDrowning
();
if
(
cachedSession
!=
null
)
{
if
(
consumption
.
amount
<
0
)
{
staminaRecoverDelay
=
0
;
}
if
(
consumption
.
amount
>
0
)
{
if
(
staminaRecoverDelay
<
5
)
{
staminaRecoverDelay
++;
consumption
=
Consumption
.
None
;
}
}
int
newStamina
=
updateStamina
(
cachedSession
,
consumption
.
amount
);
cachedSession
.
send
(
new
PacketPlayerPropNotify
(
player
,
PlayerProperty
.
PROP_CUR_PERSIST_STAMINA
));
Grasscutter
.
getLogger
().
debug
(
player
.
getProperty
(
PlayerProperty
.
PROP_CUR_PERSIST_STAMINA
)
+
"/"
+
player
.
getProperty
(
PlayerProperty
.
PROP_MAX_STAMINA
)
+
"\t"
+
currentState
+
"\t"
+
"isMoving: "
+
isPlayerMoving
()
+
"\t"
+
consumption
+
"("
+
consumption
.
amount
+
")"
);
}
}
}
previousState
=
currentState
;
previousCoordinates
=
new
Position
(
currentCoordinates
.
getX
(),
currentCoordinates
.
getY
(),
currentCoordinates
.
getZ
());;
}
}
}
src/main/java/emu/grasscutter/game/managers/SotSManager
/SotSManager
.java
→
src/main/java/emu/grasscutter/game/managers/SotSManager.java
View file @
65861c3c
package
emu.grasscutter.game.managers
.SotSManager
;
package
emu.grasscutter.game.managers
;
import
emu.grasscutter.Grasscutter
;
import
emu.grasscutter.game.avatar.Avatar
;
import
emu.grasscutter.game.entity.EntityAvatar
;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.game.props.FightProperty
;
import
emu.grasscutter.game.props.PlayerProperty
;
...
...
@@ -14,6 +15,8 @@ import emu.grasscutter.server.packet.send.PacketEntityFightPropChangeReasonNotif
import
emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify
;
import
java.util.List
;
import
java.util.Timer
;
import
java.util.TimerTask
;
// Statue of the Seven Manager
public
class
SotSManager
{
...
...
@@ -21,6 +24,9 @@ public class SotSManager {
// NOTE: Spring volume balance *1 = fight prop HP *100
private
final
Player
player
;
private
Timer
autoRecoverTimer
;
public
final
static
int
GlobalMaximumSpringVolume
=
8500000
;
public
SotSManager
(
Player
player
)
{
this
.
player
=
player
;
...
...
@@ -46,26 +52,44 @@ public class SotSManager {
public
void
autoRevive
(
GameSession
session
)
{
player
.
getTeamManager
().
getActiveTeam
().
forEach
(
entity
->
{
boolean
isAlive
=
entity
.
isAlive
();
float
currentHP
=
entity
.
getAvatar
().
getFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
);
float
maxHP
=
entity
.
getAvatar
().
getFightProperty
(
FightProperty
.
FIGHT_PROP_MAX_HP
);
// Grasscutter.getLogger().debug("" + entity.getAvatar().getAvatarData().getName() + "\t" + currentHP + "/" + maxHP + "\t" + (isAlive ? "ALIVE":"DEAD"));
float
newHP
=
(
float
)(
maxHP
*
0.3
);
if
(
currentHP
<
newHP
)
{
updateAvatarCurHP
(
session
,
entity
,
newHP
);
}
if
(!
isAlive
)
{
float
maxHP
=
entity
.
getAvatar
().
getFightProperty
(
FightProperty
.
FIGHT_PROP_MAX_HP
);
float
newHP
=
(
float
)(
maxHP
*
0.3
);
entity
.
setFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
,
newHP
);
entity
.
getWorld
().
broadcastPacket
(
new
PacketAvatarLifeStateChangeNotify
(
entity
.
getAvatar
()));
}
});
}
public
void
scheduleAutoRecover
(
GameSession
session
)
{
// TODO: play audio effects? possibly client side? - client automatically plays.
// delay 2.5 seconds
new
Thread
(()
->
{
try
{
Thread
.
sleep
(
2500
);
autoRecover
(
session
);
}
catch
(
Exception
e
)
{
Grasscutter
.
getLogger
().
error
(
e
.
getMessage
());
}
}).
start
();
if
(
autoRecoverTimer
==
null
)
{
autoRecoverTimer
=
new
Timer
();
autoRecoverTimer
.
schedule
(
new
AutoRecoverTimerTick
(
session
),
2500
);
}
}
public
void
cancelAutoRecover
()
{
if
(
autoRecoverTimer
!=
null
)
{
autoRecoverTimer
.
cancel
();
autoRecoverTimer
=
null
;
}
}
private
class
AutoRecoverTimerTick
extends
TimerTask
{
private
GameSession
session
;
public
AutoRecoverTimerTick
(
GameSession
session
)
{
this
.
session
=
session
;
}
public
void
run
()
{
autoRecover
(
session
);
cancelAutoRecover
();
}
}
public
void
refillSpringVolume
()
{
...
...
@@ -124,24 +148,27 @@ public class SotSManager {
float
newHP
=
currentHP
+
needSV
/
100
;
// convert SV to HP
// TODO: Figure out why client shows current HP instead of added HP.
// Say an avatar had 12000 and now has 14000, it should show "2000".
// The client always show "+14000" which is incorrect.
entity
.
setFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
,
newHP
);
session
.
send
(
new
PacketEntityFightPropChangeReasonNotify
(
entity
,
FightProperty
.
FIGHT_PROP_CUR_HP
,
newHP
,
List
.
of
(
3
),
PropChangeReasonOuterClass
.
PropChangeReason
.
PROP_CHANGE_STATUE_RECOVER
,
ChangeHpReasonOuterClass
.
ChangeHpReason
.
ChangeHpAddStatue
));
session
.
send
(
new
PacketEntityFightPropUpdateNotify
(
entity
,
FightProperty
.
FIGHT_PROP_CUR_HP
));
Avatar
avatar
=
entity
.
getAvatar
();
avatar
.
setCurrentHp
(
newHP
);
session
.
send
(
new
PacketAvatarFightPropUpdateNotify
(
avatar
,
FightProperty
.
FIGHT_PROP_CUR_HP
));
player
.
save
();
updateAvatarCurHP
(
session
,
entity
,
newHP
);
}
});
}
}
private
void
updateAvatarCurHP
(
GameSession
session
,
EntityAvatar
entity
,
float
newHP
)
{
// TODO: Figure out why client shows current HP instead of added HP.
// Say an avatar had 12000 and now has 14000, it should show "2000".
// The client always show "+14000" which is incorrect.
entity
.
setFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
,
newHP
);
session
.
send
(
new
PacketEntityFightPropChangeReasonNotify
(
entity
,
FightProperty
.
FIGHT_PROP_CUR_HP
,
newHP
,
List
.
of
(
3
),
PropChangeReasonOuterClass
.
PropChangeReason
.
PROP_CHANGE_STATUE_RECOVER
,
ChangeHpReasonOuterClass
.
ChangeHpReason
.
ChangeHpAddStatue
));
session
.
send
(
new
PacketEntityFightPropUpdateNotify
(
entity
,
FightProperty
.
FIGHT_PROP_CUR_HP
));
Avatar
avatar
=
entity
.
getAvatar
();
avatar
.
setCurrentHp
(
newHP
);
session
.
send
(
new
PacketAvatarFightPropUpdateNotify
(
avatar
,
FightProperty
.
FIGHT_PROP_CUR_HP
));
player
.
save
();
}
}
src/main/java/emu/grasscutter/game/managers/StaminaManager/AfterUpdateStaminaListener.java
0 → 100644
View file @
65861c3c
package
emu.grasscutter.game.managers.StaminaManager
;
public
interface
AfterUpdateStaminaListener
{
/**
* onBeforeUpdateStamina() will be called before StaminaManager attempt to update the player's current stamina.
* This gives listeners a chance to intercept this update.
*
* @param reason Why updating stamina.
* @param newStamina New Stamina value.
*/
void
onAfterUpdateStamina
(
String
reason
,
int
newStamina
);
}
src/main/java/emu/grasscutter/game/managers/StaminaManager/BeforeUpdateStaminaListener.java
0 → 100644
View file @
65861c3c
package
emu.grasscutter.game.managers.StaminaManager
;
public
interface
BeforeUpdateStaminaListener
{
/**
* onBeforeUpdateStamina() will be called before StaminaManager attempt to update the player's current stamina.
* This gives listeners a chance to intercept this update.
* @param reason Why updating stamina.
* @param newStamina New ABSOLUTE stamina value.
* @return true if you want to cancel this update, otherwise false.
*/
int
onBeforeUpdateStamina
(
String
reason
,
int
newStamina
);
/**
* onBeforeUpdateStamina() will be called before StaminaManager attempt to update the player's current stamina.
* This gives listeners a chance to intercept this update.
* @param reason Why updating stamina.
* @param consumption ConsumptionType and RELATIVE stamina change amount.
* @return true if you want to cancel this update, otherwise false.
*/
Consumption
onBeforeUpdateStamina
(
String
reason
,
Consumption
consumption
);
}
\ No newline at end of file
src/main/java/emu/grasscutter/game/managers/StaminaManager/Consumption.java
0 → 100644
View file @
65861c3c
package
emu.grasscutter.game.managers.StaminaManager
;
public
class
Consumption
{
public
ConsumptionType
consumptionType
;
public
int
amount
;
public
Consumption
(
ConsumptionType
ct
,
int
a
)
{
consumptionType
=
ct
;
amount
=
a
;
}
public
Consumption
(
ConsumptionType
ct
)
{
this
(
ct
,
ct
.
amount
);
}
}
Prev
1
2
3
4
5
6
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