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
30c7bb94
Commit
30c7bb94
authored
Jun 17, 2022
by
Melledy
Browse files
Merge branch 'dev-world-scripts' of
https://github.com/Grasscutters/Grasscutter
into development
parents
8e6aa50c
5a3e9bc3
Changes
79
Hide whitespace changes
Inline
Side-by-side
build.gradle
View file @
30c7bb94
...
...
@@ -86,6 +86,9 @@ dependencies {
implementation
group:
'org.luaj'
,
name:
'luaj-jse'
,
version:
'3.0.1'
implementation
group:
'com.esotericsoftware'
,
name
:
'reflectasm'
,
version:
'1.11.9'
implementation
group:
'com.github.davidmoten'
,
name
:
'rtree-multi'
,
version:
'0.1'
protobuf
files
(
'proto/'
)
compileOnly
'org.projectlombok:lombok:1.18.24'
...
...
src/main/java/emu/grasscutter/data/GameData.java
View file @
30c7bb94
...
...
@@ -24,8 +24,8 @@ public class GameData {
private
static
final
Map
<
String
,
OpenConfigEntry
>
openConfigEntries
=
new
HashMap
<>();
private
static
final
Map
<
String
,
ScenePointEntry
>
scenePointEntries
=
new
HashMap
<>();
private
static
final
Int2ObjectMap
<
MainQuestData
>
mainQuestData
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
HomeworldDefaultSaveData
>
homeworldDefaultSaveData
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
SceneNpcBornData
>
npcBornData
=
new
Int2ObjectOpenHashMap
<>();
// ExcelConfigs
private
static
final
Int2ObjectMap
<
PlayerLevelData
>
playerLevelDataMap
=
new
Int2ObjectOpenHashMap
<>();
...
...
@@ -83,12 +83,14 @@ public class GameData {
private
static
final
Int2ObjectMap
<
ShopGoodsData
>
shopGoodsDataMap
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
CombineData
>
combineDataMap
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
RewardPreviewData
>
rewardPreviewDataMap
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
GatherData
>
gatherDataMap
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
TowerFloorData
>
towerFloorDataMap
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
TowerLevelData
>
towerLevelDataMap
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
TowerScheduleData
>
towerScheduleDataMap
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
ForgeData
>
forgeDataMap
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
HomeWorldLevelData
>
homeWorldLevelDataMap
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
FurnitureMakeConfigData
>
furnitureMakeConfigDataMap
=
new
Int2ObjectOpenHashMap
<>();
private
static
final
Int2ObjectMap
<
InvestigationMonsterData
>
investigationMonsterDataMap
=
new
Int2ObjectOpenHashMap
<>();
// Cache
private
static
Map
<
Integer
,
List
<
Integer
>>
fetters
=
new
HashMap
<>();
...
...
@@ -140,9 +142,15 @@ public class GameData {
public
static
Int2ObjectMap
<
MainQuestData
>
getMainQuestDataMap
()
{
return
mainQuestData
;
}
public
static
Int2ObjectMap
<
HomeworldDefaultSaveData
>
getHomeworldDefaultSaveData
()
{
return
homeworldDefaultSaveData
;
}
public
static
Int2ObjectMap
<
SceneNpcBornData
>
getSceneNpcBornData
()
{
return
npcBornData
;
}
public
static
Int2ObjectMap
<
AvatarData
>
getAvatarDataMap
()
{
return
avatarDataMap
;
}
...
...
@@ -365,9 +373,11 @@ public class GameData {
public
static
Int2ObjectMap
<
TowerFloorData
>
getTowerFloorDataMap
(){
return
towerFloorDataMap
;
}
public
static
Int2ObjectMap
<
TowerLevelData
>
getTowerLevelDataMap
(){
return
towerLevelDataMap
;
}
public
static
Int2ObjectMap
<
TowerScheduleData
>
getTowerScheduleDataMap
(){
return
towerScheduleDataMap
;
}
...
...
@@ -379,10 +389,20 @@ public class GameData {
public
static
Int2ObjectMap
<
ForgeData
>
getForgeDataMap
()
{
return
forgeDataMap
;
}
public
static
Int2ObjectMap
<
HomeWorldLevelData
>
getHomeWorldLevelDataMap
()
{
return
homeWorldLevelDataMap
;
}
public
static
Int2ObjectMap
<
FurnitureMakeConfigData
>
getFurnitureMakeConfigDataMap
()
{
return
furnitureMakeConfigDataMap
;
}
public
static
Int2ObjectMap
<
GatherData
>
getGatherDataMap
()
{
return
gatherDataMap
;
}
public
static
Int2ObjectMap
<
InvestigationMonsterData
>
getInvestigationMonsterDataMap
()
{
return
investigationMonsterDataMap
;
}
}
src/main/java/emu/grasscutter/data/ResourceLoader.java
View file @
30c7bb94
...
...
@@ -10,6 +10,7 @@ import java.util.regex.Pattern;
import
com.google.gson.Gson
;
import
emu.grasscutter.data.binout.*
;
import
emu.grasscutter.scripts.SceneIndexManager
;
import
emu.grasscutter.utils.Utils
;
import
lombok.SneakyThrows
;
import
org.reflections.Reflections
;
...
...
@@ -64,10 +65,9 @@ public class ResourceLoader {
loadQuests
();
// Load scene points - must be done AFTER resources are loaded
loadScenePoints
();
// Load default home layout
loadHomeworldDefaultSaveData
();
loadNpcBornData
();
}
public
static
void
loadResources
()
{
...
...
@@ -416,6 +416,27 @@ public class ResourceLoader {
Grasscutter
.
getLogger
().
info
(
"Loaded "
+
GameData
.
getHomeworldDefaultSaveData
().
size
()
+
" HomeworldDefaultSaveDatas."
);
}
@SneakyThrows
private
static
void
loadNpcBornData
(){
var
folder
=
Files
.
list
(
Path
.
of
(
RESOURCE
(
"BinOutput/Scene/SceneNpcBorn"
))).
toList
();
for
(
var
file
:
folder
){
if
(
file
.
toFile
().
isDirectory
()){
continue
;
}
var
data
=
Grasscutter
.
getGsonFactory
().
fromJson
(
Files
.
readString
(
file
),
SceneNpcBornData
.
class
);
if
(
data
.
getBornPosList
()
==
null
||
data
.
getBornPosList
().
size
()
==
0
){
continue
;
}
data
.
setIndex
(
SceneIndexManager
.
buildIndex
(
3
,
data
.
getBornPosList
(),
item
->
item
.
getPos
().
toPoint
()));
GameData
.
getSceneNpcBornData
().
put
(
data
.
getSceneId
(),
data
);
}
Grasscutter
.
getLogger
().
info
(
"Loaded "
+
GameData
.
getSceneNpcBornData
().
size
()
+
" SceneNpcBornDatas."
);
}
// BinOutput configs
public
static
class
AvatarConfig
{
...
...
src/main/java/emu/grasscutter/data/binout/SceneNpcBornData.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.data.custom
;
import
com.github.davidmoten.rtreemulti.RTree
;
import
com.github.davidmoten.rtreemulti.geometry.Geometry
;
import
emu.grasscutter.scripts.data.SceneGroup
;
import
lombok.AccessLevel
;
import
lombok.Data
;
import
lombok.experimental.FieldDefaults
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
@Data
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
SceneNpcBornData
{
int
sceneId
;
List
<
SceneNpcBornEntry
>
bornPosList
;
/**
* Spatial Index For NPC
*/
transient
RTree
<
SceneNpcBornEntry
,
Geometry
>
index
;
/**
* npc groups
*/
transient
Map
<
Integer
,
SceneGroup
>
groups
=
new
ConcurrentHashMap
<>();
}
src/main/java/emu/grasscutter/data/binout/SceneNpcBornEntry.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.data.custom
;
import
emu.grasscutter.utils.Position
;
import
lombok.AccessLevel
;
import
lombok.Data
;
import
lombok.experimental.FieldDefaults
;
import
java.util.List
;
@Data
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
SceneNpcBornEntry
{
int
id
;
int
configId
;
Position
pos
;
Position
rot
;
int
groupId
;
List
<
Integer
>
suiteIdList
;
}
src/main/java/emu/grasscutter/data/excels/GatherData.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.data.def
;
import
emu.grasscutter.data.GameResource
;
import
emu.grasscutter.data.ResourceType
;
@ResourceType
(
name
=
"GatherExcelConfigData.json"
)
public
class
GatherData
extends
GameResource
{
private
int
PointType
;
private
int
Id
;
private
int
GadgetId
;
private
int
ItemId
;
private
int
Cd
;
// Probably hours
private
boolean
IsForbidGuest
;
private
boolean
InitDisableInteract
;
@Override
public
int
getId
()
{
return
this
.
PointType
;
}
public
int
getGatherId
()
{
return
Id
;
}
public
int
getGadgetId
()
{
return
GadgetId
;
}
public
int
getItemId
()
{
return
ItemId
;
}
public
int
getCd
()
{
return
Cd
;
}
public
boolean
isForbidGuest
()
{
return
IsForbidGuest
;
}
public
boolean
initDisableInteract
()
{
return
InitDisableInteract
;
}
@Override
public
void
onLoad
()
{
}
}
src/main/java/emu/grasscutter/data/excels/InvestigationMonsterData.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.data.def
;
import
emu.grasscutter.data.GameResource
;
import
emu.grasscutter.data.ResourceType
;
import
lombok.Data
;
import
java.util.List
;
@ResourceType
(
name
=
"InvestigationMonsterConfigData.json"
)
@Data
public
class
InvestigationMonsterData
extends
GameResource
{
private
int
Id
;
private
int
CityId
;
private
List
<
Integer
>
MonsterIdList
;
private
List
<
Integer
>
GroupIdList
;
private
int
RewardPreviewId
;
private
String
MapMarkCreateType
;
private
String
MonsterCategory
;
@Override
public
int
getId
()
{
return
this
.
Id
;
}
@Override
public
void
onLoad
()
{
super
.
onLoad
();
}
}
src/main/java/emu/grasscutter/game/dungeons/DungeonChallenge.java
→
src/main/java/emu/grasscutter/game/dungeons/
challenge/
DungeonChallenge.java
View file @
30c7bb94
package
emu.grasscutter.game.dungeons
;
package
emu.grasscutter.game.dungeons
.challenge
;
import
emu.grasscutter.data.common.ItemParamData
;
import
emu.grasscutter.data.
excels
.DungeonData
;
import
emu.grasscutter.game.
entity.EntityMonst
er
;
import
emu.grasscutter.data.
def
.DungeonData
;
import
emu.grasscutter.game.
dungeons.challenge.trigger.ChallengeTrigg
er
;
import
emu.grasscutter.game.inventory.GameItem
;
import
emu.grasscutter.game.inventory.ItemType
;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.game.props.ActionReason
;
import
emu.grasscutter.game.world.Scene
;
import
emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq
;
import
emu.grasscutter.scripts.constants.EventType
;
import
emu.grasscutter.scripts.data.SceneGroup
;
import
emu.grasscutter.scripts.data.ScriptArgs
;
import
emu.grasscutter.server.packet.send.PacketChallengeDataNotify
;
import
emu.grasscutter.server.packet.send.PacketDungeonChallengeBeginNotify
;
import
emu.grasscutter.server.packet.send.PacketDungeonChallengeFinishNotify
;
import
emu.grasscutter.server.packet.send.PacketGadgetAutoPickDropInfoNotify
;
import
it.unimi.dsi.fastutil.ints.IntOpenHashSet
;
import
it.unimi.dsi.fastutil.ints.IntSet
;
...
...
@@ -22,79 +17,23 @@ import it.unimi.dsi.fastutil.ints.IntSet;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
DungeonChallenge
{
private
final
Scene
scene
;
private
final
SceneGroup
group
;
private
int
challengeIndex
;
private
int
challengeId
;
private
boolean
success
;
private
boolean
progress
;
public
class
DungeonChallenge
extends
WorldChallenge
{
/**
* has more challenge
*/
private
boolean
stage
;
private
int
score
;
private
int
objective
=
0
;
private
IntSet
rewardedPlayers
;
public
DungeonChallenge
(
Scene
scene
,
SceneGroup
group
,
int
challengeId
,
int
challengeIndex
,
int
objective
)
{
this
.
scene
=
scene
;
this
.
group
=
group
;
this
.
challengeId
=
challengeId
;
this
.
challengeIndex
=
challengeIndex
;
this
.
objective
=
objective
;
public
DungeonChallenge
(
Scene
scene
,
SceneGroup
group
,
int
challengeId
,
int
challengeIndex
,
List
<
Integer
>
paramList
,
int
timeLimit
,
int
goal
,
List
<
ChallengeTrigger
>
challengeTriggers
)
{
super
(
scene
,
group
,
challengeId
,
challengeIndex
,
paramList
,
timeLimit
,
goal
,
challengeTriggers
)
;
this
.
setRewardedPlayers
(
new
IntOpenHashSet
());
}
public
Scene
getScene
()
{
return
scene
;
}
public
SceneGroup
getGroup
()
{
return
group
;
}
public
int
getChallengeIndex
()
{
return
challengeIndex
;
}
public
void
setChallengeIndex
(
int
challengeIndex
)
{
this
.
challengeIndex
=
challengeIndex
;
}
public
int
getChallengeId
()
{
return
challengeId
;
}
public
void
setChallengeId
(
int
challengeId
)
{
this
.
challengeId
=
challengeId
;
}
public
int
getObjective
()
{
return
objective
;
}
public
void
setObjective
(
int
objective
)
{
this
.
objective
=
objective
;
}
public
boolean
isSuccess
()
{
return
success
;
}
public
void
setSuccess
(
boolean
isSuccess
)
{
this
.
success
=
isSuccess
;
}
public
boolean
inProgress
()
{
return
progress
;
}
public
int
getScore
()
{
return
score
;
}
public
boolean
isStage
()
{
return
stage
;
}
...
...
@@ -103,10 +42,6 @@ public class DungeonChallenge {
this
.
stage
=
stage
;
}
public
int
getTimeLimit
()
{
return
600
;
}
public
IntSet
getRewardedPlayers
()
{
return
rewardedPlayers
;
}
...
...
@@ -115,60 +50,25 @@ public class DungeonChallenge {
this
.
rewardedPlayers
=
rewardedPlayers
;
}
public
void
start
()
{
this
.
progress
=
true
;
getScene
().
broadcastPacket
(
new
PacketDungeonChallengeBeginNotify
(
this
));
}
public
void
finish
()
{
this
.
progress
=
false
;
getScene
().
broadcastPacket
(
new
PacketDungeonChallengeFinishNotify
(
this
));
@Override
public
void
done
()
{
super
.
done
();
if
(
this
.
isSuccess
())
{
// Call success script event
this
.
getScene
().
getScriptManager
().
callEvent
(
EventType
.
EVENT_CHALLENGE_SUCCESS
,
null
);
// Settle
settle
();
}
else
{
this
.
getScene
().
getScriptManager
().
callEvent
(
EventType
.
EVENT_CHALLENGE_FAIL
,
null
);
}
}
private
void
settle
()
{
getScene
().
getDungeonSettleObservers
().
forEach
(
o
->
o
.
onDungeonSettle
(
getScene
()));
if
(!
stage
){
getScene
().
getScriptManager
().
callEvent
(
EventType
.
EVENT_DUNGEON_SETTLE
,
new
ScriptArgs
(
this
.
isSuccess
()
?
1
:
0
));
}
}
public
void
onMonsterDie
(
EntityMonster
entity
)
{
score
=
getScore
()
+
1
;
getScene
().
broadcastPacket
(
new
PacketChallengeDataNotify
(
this
,
1
,
getScore
()));
if
(
getScore
()
>=
getObjective
()
&&
this
.
progress
)
{
this
.
setSuccess
(
true
);
finish
();
getScene
().
getDungeonSettleObservers
().
forEach
(
o
->
o
.
onDungeonSettle
(
getScene
()));
getScene
().
getScriptManager
().
callEvent
(
EventType
.
EVENT_DUNGEON_SETTLE
,
new
ScriptArgs
(
this
.
isSuccess
()
?
1
:
0
));
}
}
private
List
<
GameItem
>
rollRewards
()
{
List
<
GameItem
>
rewards
=
new
ArrayList
<>();
for
(
ItemParamData
param
:
getScene
().
getDungeonData
().
getRewardPreview
().
getPreviewItems
())
{
rewards
.
add
(
new
GameItem
(
param
.
getId
(),
Math
.
max
(
param
.
getCount
(),
1
)));
}
return
rewards
;
}
public
void
getStatueDrops
(
Player
player
,
GadgetInteractReq
request
)
{
public
void
getStatueDrops
(
Player
player
)
{
DungeonData
dungeonData
=
getScene
().
getDungeonData
();
int
resinCost
=
dungeonData
.
getStatueCostCount
()
!=
0
?
dungeonData
.
getStatueCostCount
()
:
20
;
if
(!
isSuccess
()
||
dungeonData
==
null
||
dungeonData
.
getRewardPreview
()
==
null
||
dungeonData
.
getRewardPreview
().
getPreviewItems
().
length
==
0
)
{
return
;
}
...
...
@@ -178,43 +78,11 @@ public class DungeonChallenge {
return
;
}
// Get rewards.
List
<
GameItem
>
rewards
=
new
ArrayList
<>();
if
(
request
.
getIsUseCondenseResin
())
{
// Check if condensed resin is usable here.
// For this, we use the following logic for now:
// The normal resin cost of the dungeon has to be 20.
if
(
resinCost
!=
20
)
{
return
;
}
// Make sure the player has condensed resin.
GameItem
condensedResin
=
player
.
getInventory
().
getInventoryTab
(
ItemType
.
ITEM_MATERIAL
).
getItemById
(
220007
);
if
(
condensedResin
==
null
||
condensedResin
.
getCount
()
<=
0
)
{
return
;
}
// Deduct.
player
.
getInventory
().
removeItem
(
condensedResin
,
1
);
// Roll rewards, twice (because condensed).
rewards
.
addAll
(
this
.
rollRewards
());
rewards
.
addAll
(
this
.
rollRewards
());
}
else
{
// If the player used regular resin, try to deduct.
// Stop if insufficient resin.
boolean
success
=
player
.
getResinManager
().
useResin
(
resinCost
);
if
(!
success
)
{
return
;
}
// Roll rewards.
rewards
.
addAll
(
this
.
rollRewards
());
for
(
ItemParamData
param
:
getScene
().
getDungeonData
().
getRewardPreview
().
getPreviewItems
())
{
rewards
.
add
(
new
GameItem
(
param
.
getId
(),
Math
.
max
(
param
.
getCount
(),
1
)));
}
// Add rewards to player and send notification.
player
.
getInventory
().
addItems
(
rewards
,
ActionReason
.
DungeonStatueDrop
);
player
.
sendPacket
(
new
PacketGadgetAutoPickDropInfoNotify
(
rewards
));
...
...
src/main/java/emu/grasscutter/game/dungeons/challenge/WorldChallenge.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge
;
import
emu.grasscutter.Grasscutter
;
import
emu.grasscutter.game.dungeons.challenge.trigger.ChallengeTrigger
;
import
emu.grasscutter.game.entity.EntityGadget
;
import
emu.grasscutter.game.entity.EntityMonster
;
import
emu.grasscutter.game.world.Scene
;
import
emu.grasscutter.scripts.constants.EventType
;
import
emu.grasscutter.scripts.data.SceneGroup
;
import
emu.grasscutter.scripts.data.ScriptArgs
;
import
emu.grasscutter.server.packet.send.PacketDungeonChallengeBeginNotify
;
import
emu.grasscutter.server.packet.send.PacketDungeonChallengeFinishNotify
;
import
lombok.Getter
;
import
lombok.Setter
;
import
java.util.List
;
import
java.util.concurrent.atomic.AtomicInteger
;
@Getter
@Setter
public
class
WorldChallenge
{
private
final
Scene
scene
;
private
final
SceneGroup
group
;
private
final
int
challengeId
;
private
final
int
challengeIndex
;
private
final
List
<
Integer
>
paramList
;
private
final
int
timeLimit
;
private
final
List
<
ChallengeTrigger
>
challengeTriggers
;
private
boolean
progress
;
private
boolean
success
;
private
long
startedAt
;
private
int
finishedTime
;
private
final
int
goal
;
private
final
AtomicInteger
score
;
public
WorldChallenge
(
Scene
scene
,
SceneGroup
group
,
int
challengeId
,
int
challengeIndex
,
List
<
Integer
>
paramList
,
int
timeLimit
,
int
goal
,
List
<
ChallengeTrigger
>
challengeTriggers
){
this
.
scene
=
scene
;
this
.
group
=
group
;
this
.
challengeId
=
challengeId
;
this
.
challengeIndex
=
challengeIndex
;
this
.
paramList
=
paramList
;
this
.
timeLimit
=
timeLimit
;
this
.
challengeTriggers
=
challengeTriggers
;
this
.
goal
=
goal
;
this
.
score
=
new
AtomicInteger
(
0
);
}
public
boolean
inProgress
(){
return
this
.
progress
;
}
public
void
onCheckTimeOut
(){
if
(!
inProgress
()){
return
;
}
if
(
timeLimit
<=
0
){
return
;
}
challengeTriggers
.
forEach
(
t
->
t
.
onCheckTimeout
(
this
));
}
public
void
start
(){
if
(
inProgress
()){
Grasscutter
.
getLogger
().
info
(
"Could not start a in progress challenge."
);
return
;
}
this
.
progress
=
true
;
this
.
startedAt
=
System
.
currentTimeMillis
();
getScene
().
broadcastPacket
(
new
PacketDungeonChallengeBeginNotify
(
this
));
challengeTriggers
.
forEach
(
t
->
t
.
onBegin
(
this
));
}
public
void
done
(){
if
(!
inProgress
()){
return
;
}
finish
(
true
);
this
.
getScene
().
getScriptManager
().
callEvent
(
EventType
.
EVENT_CHALLENGE_SUCCESS
,
// TODO record the time in PARAM2 and used in action
new
ScriptArgs
().
setParam2
(
finishedTime
));
challengeTriggers
.
forEach
(
t
->
t
.
onFinish
(
this
));
}
public
void
fail
(){
if
(!
inProgress
()){
return
;
}
finish
(
false
);
this
.
getScene
().
getScriptManager
().
callEvent
(
EventType
.
EVENT_CHALLENGE_FAIL
,
null
);
challengeTriggers
.
forEach
(
t
->
t
.
onFinish
(
this
));
}
private
void
finish
(
boolean
success
){
this
.
progress
=
false
;
this
.
success
=
success
;
this
.
finishedTime
=
(
int
)((
System
.
currentTimeMillis
()
-
this
.
startedAt
)
/
1000L
);
getScene
().
broadcastPacket
(
new
PacketDungeonChallengeFinishNotify
(
this
));
}
public
int
increaseScore
(){
return
score
.
incrementAndGet
();
}
public
void
onMonsterDeath
(
EntityMonster
monster
){
if
(!
inProgress
()){
return
;
}
if
(
monster
.
getGroupId
()
!=
getGroup
().
id
){
return
;
}
this
.
challengeTriggers
.
forEach
(
t
->
t
.
onMonsterDeath
(
this
,
monster
));
}
public
void
onGadgetDeath
(
EntityGadget
gadget
){
if
(!
inProgress
()){
return
;
}
if
(
gadget
.
getGroupId
()
!=
getGroup
().
id
){
return
;
}
this
.
challengeTriggers
.
forEach
(
t
->
t
.
onGadgetDeath
(
this
,
gadget
));
}
public
void
onGadgetDamage
(
EntityGadget
gadget
){
if
(!
inProgress
()){
return
;
}
if
(
gadget
.
getGroupId
()
!=
getGroup
().
id
){
return
;
}
this
.
challengeTriggers
.
forEach
(
t
->
t
.
onGadgetDamage
(
this
,
gadget
));
}
}
src/main/java/emu/grasscutter/game/dungeons/challenge/factory/ChallengeFactory.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge.factory
;
import
emu.grasscutter.game.dungeons.challenge.WorldChallenge
;
import
emu.grasscutter.game.world.Scene
;
import
emu.grasscutter.scripts.data.SceneGroup
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
ChallengeFactory
{
private
static
final
List
<
ChallengeFactoryHandler
>
challengeFactoryHandlers
=
new
ArrayList
<>();
static
{
challengeFactoryHandlers
.
add
(
new
DungeonChallengeFactoryHandler
());
challengeFactoryHandlers
.
add
(
new
DungeonGuardChallengeFactoryHandler
());
challengeFactoryHandlers
.
add
(
new
KillGadgetChallengeFactoryHandler
());
challengeFactoryHandlers
.
add
(
new
KillMonsterChallengeFactoryHandler
());
}
public
static
WorldChallenge
getChallenge
(
int
param1
,
int
param2
,
int
param3
,
int
param4
,
int
param5
,
int
param6
,
Scene
scene
,
SceneGroup
group
){
for
(
var
handler
:
challengeFactoryHandlers
){
if
(!
handler
.
isThisType
(
param1
,
param2
,
param3
,
param4
,
param5
,
param6
,
scene
,
group
)){
continue
;
}
return
handler
.
build
(
param1
,
param2
,
param3
,
param4
,
param5
,
param6
,
scene
,
group
);
}
return
null
;
}
}
src/main/java/emu/grasscutter/game/dungeons/challenge/factory/ChallengeFactoryHandler.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge.factory
;
import
emu.grasscutter.game.dungeons.challenge.WorldChallenge
;
import
emu.grasscutter.game.world.Scene
;
import
emu.grasscutter.scripts.data.SceneGroup
;
public
interface
ChallengeFactoryHandler
{
boolean
isThisType
(
int
challengeIndex
,
int
challengeId
,
int
param3
,
int
param4
,
int
param5
,
int
param6
,
Scene
scene
,
SceneGroup
group
);
WorldChallenge
build
(
int
challengeIndex
,
int
challengeId
,
int
param3
,
int
param4
,
int
param5
,
int
param6
,
Scene
scene
,
SceneGroup
group
);
}
src/main/java/emu/grasscutter/game/dungeons/challenge/factory/DungeonChallengeFactoryHandler.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge.factory
;
import
emu.grasscutter.game.dungeons.challenge.DungeonChallenge
;
import
emu.grasscutter.game.dungeons.challenge.trigger.InTimeTrigger
;
import
emu.grasscutter.game.dungeons.challenge.trigger.KillMonsterTrigger
;
import
emu.grasscutter.game.props.SceneType
;
import
emu.grasscutter.game.world.Scene
;
import
emu.grasscutter.game.dungeons.challenge.WorldChallenge
;
import
emu.grasscutter.scripts.data.SceneGroup
;
import
java.util.List
;
public
class
DungeonChallengeFactoryHandler
implements
ChallengeFactoryHandler
{
@Override
public
boolean
isThisType
(
int
challengeIndex
,
int
challengeId
,
int
param3
,
int
param4
,
int
param5
,
int
param6
,
Scene
scene
,
SceneGroup
group
)
{
// ActiveChallenge with 1,1000,300,233101003,15,0
return
scene
.
getSceneType
()
==
SceneType
.
SCENE_DUNGEON
&&
param4
==
group
.
id
;
}
@Override
public
WorldChallenge
build
(
int
challengeIndex
,
int
challengeId
,
int
param3
,
int
param4
,
int
param5
,
int
param6
,
Scene
scene
,
SceneGroup
group
)
{
var
realGroup
=
scene
.
getScriptManager
().
getGroupById
(
param4
);
return
new
DungeonChallenge
(
scene
,
realGroup
,
challengeId
,
// Id
challengeIndex
,
// Index
List
.
of
(
param5
,
param3
),
param3
,
// Limit
param5
,
// Goal
List
.
of
(
new
InTimeTrigger
(),
new
KillMonsterTrigger
()));
}
}
src/main/java/emu/grasscutter/game/dungeons/challenge/factory/DungeonGuardChallengeFactoryHandler.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge.factory
;
import
emu.grasscutter.game.dungeons.challenge.DungeonChallenge
;
import
emu.grasscutter.game.dungeons.challenge.WorldChallenge
;
import
emu.grasscutter.game.dungeons.challenge.trigger.GuardTrigger
;
import
emu.grasscutter.game.dungeons.challenge.trigger.InTimeTrigger
;
import
emu.grasscutter.game.dungeons.challenge.trigger.KillMonsterTrigger
;
import
emu.grasscutter.game.props.SceneType
;
import
emu.grasscutter.game.world.Scene
;
import
emu.grasscutter.scripts.data.SceneGroup
;
import
java.util.List
;
public
class
DungeonGuardChallengeFactoryHandler
implements
ChallengeFactoryHandler
{
@Override
public
boolean
isThisType
(
int
challengeIndex
,
int
challengeId
,
int
param3
,
int
param4
,
int
param5
,
int
param6
,
Scene
scene
,
SceneGroup
group
)
{
// ActiveChallenge with 1,188,234101003,12,3030,0
return
scene
.
getSceneType
()
==
SceneType
.
SCENE_DUNGEON
&&
param3
==
group
.
id
;
}
@Override
public
WorldChallenge
build
(
int
challengeIndex
,
int
challengeId
,
int
param3
,
int
param4
,
int
param5
,
int
param6
,
Scene
scene
,
SceneGroup
group
)
{
var
realGroup
=
scene
.
getScriptManager
().
getGroupById
(
param3
);
return
new
DungeonChallenge
(
scene
,
realGroup
,
challengeId
,
// Id
challengeIndex
,
// Index
List
.
of
(
param4
,
0
),
0
,
// Limit
param5
,
// Goal
List
.
of
(
new
GuardTrigger
()));
}
}
src/main/java/emu/grasscutter/game/dungeons/challenge/factory/KillGadgetChallengeFactoryHandler.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge.factory
;
import
emu.grasscutter.game.dungeons.challenge.WorldChallenge
;
import
emu.grasscutter.game.dungeons.challenge.factory.ChallengeFactoryHandler
;
import
emu.grasscutter.game.dungeons.challenge.trigger.InTimeTrigger
;
import
emu.grasscutter.game.dungeons.challenge.trigger.KillGadgetTrigger
;
import
emu.grasscutter.game.world.Scene
;
import
emu.grasscutter.scripts.data.SceneGroup
;
import
java.util.List
;
public
class
KillGadgetChallengeFactoryHandler
implements
ChallengeFactoryHandler
{
@Override
public
boolean
isThisType
(
int
challengeIndex
,
int
challengeId
,
int
param3
,
int
param4
,
int
param5
,
int
param6
,
Scene
scene
,
SceneGroup
group
)
{
// kill gadgets(explosive barrel) in time
// ActiveChallenge with 56,201,20,2,201,4
// open chest in time
// ActiveChallenge with 666,202,30,7,202,1
return
challengeId
==
201
||
challengeId
==
202
;
}
@Override
public
WorldChallenge
build
(
int
challengeIndex
,
int
challengeId
,
int
param3
,
int
param4
,
int
param5
,
int
param6
,
Scene
scene
,
SceneGroup
group
)
{
return
new
WorldChallenge
(
scene
,
group
,
challengeId
,
// Id
challengeIndex
,
// Index
List
.
of
(
param3
,
param6
,
0
),
param3
,
// Limit
param6
,
// Goal
List
.
of
(
new
InTimeTrigger
(),
new
KillGadgetTrigger
())
);
}
}
src/main/java/emu/grasscutter/game/dungeons/challenge/factory/KillMonsterChallengeFactoryHandler.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge.factory
;
import
emu.grasscutter.game.dungeons.challenge.WorldChallenge
;
import
emu.grasscutter.game.dungeons.challenge.trigger.InTimeTrigger
;
import
emu.grasscutter.game.dungeons.challenge.trigger.KillMonsterTrigger
;
import
emu.grasscutter.game.world.Scene
;
import
emu.grasscutter.scripts.data.SceneGroup
;
import
java.util.List
;
public
class
KillMonsterChallengeFactoryHandler
implements
ChallengeFactoryHandler
{
@Override
public
boolean
isThisType
(
int
challengeIndex
,
int
challengeId
,
int
param3
,
int
param4
,
int
param5
,
int
param6
,
Scene
scene
,
SceneGroup
group
)
{
// ActiveChallenge with 180,180,45,133108061,1,0
return
challengeId
==
180
;
}
@Override
public
WorldChallenge
build
(
int
challengeIndex
,
int
challengeId
,
int
param3
,
int
param4
,
int
param5
,
int
param6
,
Scene
scene
,
SceneGroup
group
)
{
var
realGroup
=
scene
.
getScriptManager
().
getGroupById
(
param4
);
return
new
WorldChallenge
(
scene
,
realGroup
,
challengeId
,
// Id
challengeIndex
,
// Index
List
.
of
(
param5
,
param3
),
param3
,
// Limit
param5
,
// Goal
List
.
of
(
new
KillMonsterTrigger
(),
new
InTimeTrigger
())
);
}
}
src/main/java/emu/grasscutter/game/dungeons/challenge/trigger/ChallengeTrigger.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge.trigger
;
import
emu.grasscutter.game.dungeons.challenge.WorldChallenge
;
import
emu.grasscutter.game.entity.EntityGadget
;
import
emu.grasscutter.game.entity.EntityMonster
;
public
abstract
class
ChallengeTrigger
{
public
void
onBegin
(
WorldChallenge
challenge
){}
public
void
onFinish
(
WorldChallenge
challenge
){}
public
void
onMonsterDeath
(
WorldChallenge
challenge
,
EntityMonster
monster
){}
public
void
onGadgetDeath
(
WorldChallenge
challenge
,
EntityGadget
gadget
){}
public
void
onCheckTimeout
(
WorldChallenge
challenge
){}
public
void
onGadgetDamage
(
WorldChallenge
challenge
,
EntityGadget
gadget
){}
}
src/main/java/emu/grasscutter/game/dungeons/challenge/trigger/GuardTrigger.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge.trigger
;
import
emu.grasscutter.game.dungeons.challenge.WorldChallenge
;
import
emu.grasscutter.game.entity.EntityGadget
;
import
emu.grasscutter.game.entity.EntityMonster
;
import
emu.grasscutter.game.props.FightProperty
;
import
emu.grasscutter.server.packet.send.PacketChallengeDataNotify
;
public
class
GuardTrigger
extends
KillMonsterTrigger
{
@Override
public
void
onBegin
(
WorldChallenge
challenge
)
{
super
.
onBegin
(
challenge
);
challenge
.
getScene
().
broadcastPacket
(
new
PacketChallengeDataNotify
(
challenge
,
2
,
100
));
}
@Override
public
void
onGadgetDamage
(
WorldChallenge
challenge
,
EntityGadget
gadget
)
{
var
curHp
=
gadget
.
getFightProperties
().
get
(
FightProperty
.
FIGHT_PROP_CUR_HP
.
getId
());
var
maxHp
=
gadget
.
getFightProperties
().
get
(
FightProperty
.
FIGHT_PROP_BASE_HP
.
getId
());
int
percent
=
(
int
)
(
curHp
/
maxHp
);
challenge
.
getScene
().
broadcastPacket
(
new
PacketChallengeDataNotify
(
challenge
,
2
,
percent
));
if
(
percent
<=
0
){
challenge
.
fail
();
}
}
}
src/main/java/emu/grasscutter/game/dungeons/challenge/trigger/InTimeTrigger.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge.trigger
;
import
emu.grasscutter.game.dungeons.challenge.WorldChallenge
;
public
class
InTimeTrigger
extends
ChallengeTrigger
{
@Override
public
void
onCheckTimeout
(
WorldChallenge
challenge
)
{
var
current
=
System
.
currentTimeMillis
();
if
(
current
-
challenge
.
getStartedAt
()
>
challenge
.
getTimeLimit
()
*
1000L
){
challenge
.
fail
();
}
}
}
src/main/java/emu/grasscutter/game/dungeons/challenge/trigger/KillGadgetTrigger.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge.trigger
;
import
emu.grasscutter.game.dungeons.challenge.WorldChallenge
;
import
emu.grasscutter.game.entity.EntityGadget
;
import
emu.grasscutter.server.packet.send.PacketChallengeDataNotify
;
public
class
KillGadgetTrigger
extends
ChallengeTrigger
{
@Override
public
void
onBegin
(
WorldChallenge
challenge
)
{
challenge
.
getScene
().
broadcastPacket
(
new
PacketChallengeDataNotify
(
challenge
,
2
,
challenge
.
getScore
().
get
()));
}
@Override
public
void
onGadgetDeath
(
WorldChallenge
challenge
,
EntityGadget
gadget
)
{
var
newScore
=
challenge
.
increaseScore
();
challenge
.
getScene
().
broadcastPacket
(
new
PacketChallengeDataNotify
(
challenge
,
2
,
newScore
));
if
(
newScore
>=
challenge
.
getGoal
()){
challenge
.
done
();
}
}
}
src/main/java/emu/grasscutter/game/dungeons/challenge/trigger/KillMonsterTrigger.java
0 → 100644
View file @
30c7bb94
package
emu.grasscutter.game.dungeons.challenge.trigger
;
import
emu.grasscutter.game.dungeons.challenge.WorldChallenge
;
import
emu.grasscutter.game.entity.EntityMonster
;
import
emu.grasscutter.server.packet.send.PacketChallengeDataNotify
;
public
class
KillMonsterTrigger
extends
ChallengeTrigger
{
@Override
public
void
onBegin
(
WorldChallenge
challenge
)
{
challenge
.
getScene
().
broadcastPacket
(
new
PacketChallengeDataNotify
(
challenge
,
1
,
challenge
.
getScore
().
get
()));
}
@Override
public
void
onMonsterDeath
(
WorldChallenge
challenge
,
EntityMonster
monster
)
{
var
newScore
=
challenge
.
increaseScore
();
challenge
.
getScene
().
broadcastPacket
(
new
PacketChallengeDataNotify
(
challenge
,
1
,
newScore
));
if
(
newScore
>=
challenge
.
getGoal
()){
challenge
.
done
();
}
}
}
Prev
1
2
3
4
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