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
91000821
Commit
91000821
authored
Jul 05, 2022
by
Akka
Committed by
Luke H-W
Jul 10, 2022
Browse files
quest fix & personal line impl
parent
7bae35f5
Changes
51
Hide whitespace changes
Inline
Side-by-side
src/main/java/emu/grasscutter/data/GameData.java
View file @
91000821
...
...
@@ -104,6 +104,8 @@ public class GameData {
@Getter
private
static
final
Int2ObjectMap
<
ActivityData
>
activityDataMap
=
new
Int2ObjectOpenHashMap
<>();
@Getter
private
static
final
Int2ObjectMap
<
ActivityWatcherData
>
activityWatcherDataMap
=
new
Int2ObjectOpenHashMap
<>();
@Getter
private
static
final
Int2ObjectMap
<
MusicGameBasicData
>
musicGameBasicDataMap
=
new
Int2ObjectOpenHashMap
<>();
@Getter
private
static
final
Int2ObjectMap
<
PersonalLineData
>
personalLineDataMap
=
new
Int2ObjectOpenHashMap
<>();
@Getter
private
static
final
Int2ObjectMap
<
ChapterData
>
chapterDataMap
=
new
Int2ObjectOpenHashMap
<>();
// Cache
private
static
Map
<
Integer
,
List
<
Integer
>>
fetters
=
new
HashMap
<>();
...
...
src/main/java/emu/grasscutter/data/binout/MainQuestData.java
View file @
91000821
package
emu.grasscutter.data.binout
;
import
emu.grasscutter.game.quest.enums.LogicType
;
import
emu.grasscutter.game.quest.enums.QuestTrigger
;
import
emu.grasscutter.game.quest.enums.QuestType
;
import
lombok.Data
;
public
class
MainQuestData
{
private
int
id
;
...
...
@@ -42,12 +41,10 @@ public class MainQuestData {
public
SubQuestData
[]
getSubQuests
()
{
return
subQuests
;
}
@Data
public
static
class
SubQuestData
{
private
int
subId
;
public
int
getSubId
()
{
return
subId
;
}
private
int
order
;
}
}
src/main/java/emu/grasscutter/data/excels/ChapterData.java
0 → 100644
View file @
91000821
package
emu.grasscutter.data.excels
;
import
emu.grasscutter.data.GameResource
;
import
emu.grasscutter.data.ResourceType
;
import
lombok.AccessLevel
;
import
lombok.Getter
;
import
lombok.Setter
;
import
lombok.experimental.FieldDefaults
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
@ResourceType
(
name
=
"ChapterExcelConfigData.json"
)
@Getter
@Setter
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
ChapterData
extends
GameResource
{
int
id
;
int
beginQuestId
;
int
endQuestId
;
int
needPlayerLevel
;
public
static
final
Map
<
Integer
,
ChapterData
>
beginQuestChapterMap
=
new
HashMap
<>();
public
static
final
Map
<
Integer
,
ChapterData
>
endQuestChapterMap
=
new
HashMap
<>();
@Override
public
int
getId
()
{
return
this
.
id
;
}
@Override
public
void
onLoad
()
{
beginQuestChapterMap
.
put
(
beginQuestId
,
this
);
beginQuestChapterMap
.
put
(
endQuestId
,
this
);
}
}
src/main/java/emu/grasscutter/data/excels/PersonalLineData.java
0 → 100644
View file @
91000821
package
emu.grasscutter.data.excels
;
import
emu.grasscutter.data.GameResource
;
import
emu.grasscutter.data.ResourceType
;
import
lombok.AccessLevel
;
import
lombok.Getter
;
import
lombok.Setter
;
import
lombok.experimental.FieldDefaults
;
import
java.util.List
;
@ResourceType
(
name
=
"PersonalLineExcelConfigData.json"
)
@Getter
@Setter
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
PersonalLineData
extends
GameResource
{
int
id
;
int
avatarID
;
List
<
Integer
>
preQuestId
;
int
startQuestId
;
int
chapterId
;
@Override
public
int
getId
()
{
return
this
.
id
;
}
}
src/main/java/emu/grasscutter/data/excels/QuestData.java
View file @
91000821
...
...
@@ -3,31 +3,36 @@ package emu.grasscutter.data.excels;
import
java.util.Arrays
;
import
java.util.List
;
import
com.google.gson.annotations.SerializedName
;
import
emu.grasscutter.data.GameResource
;
import
emu.grasscutter.data.ResourceType
;
import
emu.grasscutter.game.quest.enums.LogicType
;
import
emu.grasscutter.game.quest.enums.QuestTrigger
;
import
lombok.AccessLevel
;
import
lombok.Data
;
import
lombok.Getter
;
import
lombok.ToString
;
import
lombok.experimental.FieldDefaults
;
@ResourceType
(
name
=
"QuestExcelConfigData.json"
)
@Getter
@ToString
public
class
QuestData
extends
GameResource
{
private
int
subId
;
private
int
mainId
;
private
int
order
;
private
long
descTextMapHash
;
private
boolean
finishParent
;
private
boolean
isRewind
;
private
LogicType
acceptCondComb
;
private
QuestCondition
[]
acceptConditons
;
private
LogicType
finishCondComb
;
private
QuestCondition
[]
finishConditons
;
private
LogicType
failCondComb
;
private
QuestCondition
[]
failConditons
;
private
List
<
QuestParam
>
acceptCond
;
private
List
<
QuestParam
>
finishCond
;
private
List
<
QuestParam
>
failCond
;
private
List
<
QuestCondition
>
acceptCond
;
private
List
<
QuestCondition
>
finishCond
;
private
List
<
QuestCondition
>
failCond
;
private
List
<
QuestExecParam
>
beginExec
;
private
List
<
QuestExecParam
>
finishExec
;
private
List
<
QuestExecParam
>
failExec
;
...
...
@@ -60,67 +65,57 @@ public class QuestData extends GameResource {
return
acceptCondComb
;
}
public
QuestCondition
[]
getAcceptCond
()
{
return
acceptCond
itons
;
public
List
<
QuestCondition
>
getAcceptCond
()
{
return
acceptCond
;
}
public
LogicType
getFinishCondComb
()
{
return
finishCondComb
;
}
public
QuestCondition
[]
getFinishCond
()
{
return
finishCond
itons
;
public
List
<
QuestCondition
>
getFinishCond
()
{
return
finishCond
;
}
public
LogicType
getFailCondComb
()
{
return
failCondComb
;
}
public
QuestCondition
[]
getFailCond
()
{
return
failCond
itons
;
public
List
<
QuestCondition
>
getFailCond
()
{
return
failCond
;
}
public
void
onLoad
()
{
this
.
acceptConditons
=
acceptCond
.
stream
().
filter
(
p
->
p
.
_type
!=
null
).
map
(
QuestCondition:
:
new
).
toArray
(
QuestCondition
[]::
new
);
acceptCond
=
null
;
this
.
finishConditons
=
finishCond
.
stream
().
filter
(
p
->
p
.
_type
!=
null
).
map
(
QuestCondition:
:
new
).
toArray
(
QuestCondition
[]::
new
);
finishCond
=
null
;
this
.
failConditons
=
failCond
.
stream
().
filter
(
p
->
p
.
_type
!=
null
).
map
(
QuestCondition:
:
new
).
toArray
(
QuestCondition
[]::
new
);
failCond
=
null
;
}
public
class
QuestParam
{
QuestTrigger
_type
;
int
[]
_param
;
String
_count
;
this
.
acceptCond
=
acceptCond
.
stream
().
filter
(
p
->
p
.
type
!=
null
).
toList
();
this
.
finishCond
=
finishCond
.
stream
().
filter
(
p
->
p
.
type
!=
null
).
toList
();
this
.
failCond
=
failCond
.
stream
().
filter
(
p
->
p
.
type
!=
null
).
toList
();
this
.
beginExec
=
beginExec
.
stream
().
filter
(
p
->
p
.
type
!=
null
).
toList
();
this
.
finishExec
=
finishExec
.
stream
().
filter
(
p
->
p
.
type
!=
null
).
toList
();
this
.
failExec
=
failExec
.
stream
().
filter
(
p
->
p
.
type
!=
null
).
toList
();
}
@Data
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
QuestExecParam
{
QuestTrigger
_type
;
String
[]
_param
;
String
_count
;
@SerializedName
(
"_type"
)
QuestTrigger
type
;
@SerializedName
(
"_param"
)
String
[]
param
;
@SerializedName
(
"_count"
)
String
count
;
}
@Data
public
static
class
QuestCondition
{
@SerializedName
(
"_type"
)
private
QuestTrigger
type
;
@SerializedName
(
"_param"
)
private
int
[]
param
;
@SerializedName
(
"_param_str"
)
private
String
paramStr
;
@SerializedName
(
"_count"
)
private
String
count
;
public
QuestCondition
(
QuestParam
param
)
{
this
.
type
=
param
.
_type
;
this
.
param
=
param
.
_param
;
}
public
QuestTrigger
getType
()
{
return
type
;
}
public
int
[]
getParam
()
{
return
param
;
}
public
String
getCount
()
{
return
count
;
}
}
}
src/main/java/emu/grasscutter/game/inventory/Inventory.java
View file @
91000821
...
...
@@ -271,6 +271,8 @@ public class Inventory implements Iterable<GameItem> {
this
.
player
.
getServer
().
getInventoryManager
().
upgradeAvatarFetterLevel
(
this
.
player
,
this
.
player
.
getTeamManager
().
getCurrentAvatarEntity
().
getAvatar
(),
count
);
case
106
->
// Resin
this
.
player
.
getResinManager
().
addResin
(
count
);
case
107
->
// Legendary Key
this
.
player
.
addLegendaryKey
(
count
);
case
201
->
// Primogem
this
.
player
.
setPrimogems
(
this
.
player
.
getPrimogems
()
+
count
);
case
202
->
// Mora
...
...
@@ -292,6 +294,8 @@ public class Inventory implements Iterable<GameItem> {
return
this
.
player
.
getCrystals
();
case
106
:
// Resin
return
this
.
player
.
getProperty
(
PlayerProperty
.
PROP_PLAYER_RESIN
);
case
107
:
// Legendary Key
return
this
.
player
.
getProperty
(
PlayerProperty
.
PROP_PLAYER_LEGENDARY_KEY
);
case
204
:
// Home Coin
return
this
.
player
.
getHomeCoin
();
default
:
...
...
@@ -334,13 +338,15 @@ public class Inventory implements Iterable<GameItem> {
player
.
setCrystals
(
player
.
getCrystals
()
-
(
cost
.
getCount
()
*
quantity
));
case
106
->
// Resin
player
.
getResinManager
().
useResin
(
cost
.
getCount
()
*
quantity
);
case
107
->
// LegendaryKey
player
.
useLegendaryKey
(
cost
.
getCount
()
*
quantity
);
case
204
->
// Home Coin
player
.
setHomeCoin
(
player
.
getHomeCoin
()
-
(
cost
.
getCount
()
*
quantity
));
default
->
removeItem
(
getInventoryTab
(
ItemType
.
ITEM_MATERIAL
).
getItemById
(
cost
.
getId
()),
cost
.
getCount
()
*
quantity
);
}
}
if
(
reason
!=
null
)
{
// Do we need these?
// getPlayer().sendPacket(new PacketItemAddHintNotify(changedItems, reason));
}
...
...
src/main/java/emu/grasscutter/game/player/Player.java
View file @
91000821
...
...
@@ -4,10 +4,10 @@ import dev.morphia.annotations.*;
import
emu.grasscutter.GameConstants
;
import
emu.grasscutter.Grasscutter
;
import
emu.grasscutter.data.GameData
;
import
emu.grasscutter.data.excels.PersonalLineData
;
import
emu.grasscutter.data.excels.PlayerLevelData
;
import
emu.grasscutter.data.excels.WeatherData
;
import
emu.grasscutter.database.DatabaseHelper
;
import
emu.grasscutter.database.DatabaseManager
;
import
emu.grasscutter.game.Account
;
import
emu.grasscutter.game.CoopRequest
;
import
emu.grasscutter.game.ability.AbilityManager
;
...
...
@@ -1597,7 +1597,17 @@ public class Player {
getServer
().
getPlayers
().
values
().
removeIf
(
player1
->
player1
==
this
);
}
public
enum
SceneLoadState
{
public
int
getLegendaryKey
()
{
return
this
.
getProperty
(
PlayerProperty
.
PROP_PLAYER_LEGENDARY_KEY
);
}
public
synchronized
void
addLegendaryKey
(
int
count
)
{
this
.
setProperty
(
PlayerProperty
.
PROP_PLAYER_LEGENDARY_KEY
,
getLegendaryKey
()
+
count
);
}
public
synchronized
void
useLegendaryKey
(
int
count
)
{
this
.
setProperty
(
PlayerProperty
.
PROP_PLAYER_LEGENDARY_KEY
,
getLegendaryKey
()
-
count
);
}
public
enum
SceneLoadState
{
NONE
(
0
),
LOADING
(
1
),
INIT
(
2
),
LOADED
(
3
);
private
final
int
value
;
...
...
src/main/java/emu/grasscutter/game/props/PlayerProperty.java
View file @
91000821
...
...
@@ -39,7 +39,7 @@ public enum PlayerProperty {
PROP_IS_ONLY_MP_WITH_PS_PLAYER
(
10024
,
0
,
1
),
// Is only MP with PlayStation players? [0, 1]
PROP_PLAYER_MCOIN
(
10025
),
// Genesis Crystal (-inf, +inf) see 10015
PROP_PLAYER_WAIT_SUB_MCOIN
(
10026
),
PROP_PLAYER_LEGENDARY_KEY
(
10027
),
PROP_PLAYER_LEGENDARY_KEY
(
10027
,
0
),
PROP_IS_HAS_FIRST_SHARE
(
10028
),
PROP_PLAYER_FORGE_POINT
(
10029
,
0
,
300_000
),
PROP_CUR_CLIMATE_METER
(
10035
),
...
...
src/main/java/emu/grasscutter/game/quest/GameMainQuest.java
View file @
91000821
package
emu.grasscutter.game.quest
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.*
;
import
emu.grasscutter.server.packet.send.PacketCodexDataUpdateNotify
;
import
org.bson.types.ObjectId
;
...
...
@@ -31,20 +30,21 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@Entity
(
value
=
"quests"
,
useDiscriminator
=
false
)
public
class
GameMainQuest
{
@Id
private
ObjectId
id
;
@Indexed
private
int
ownerUid
;
@Transient
private
Player
owner
;
private
Map
<
Integer
,
GameQuest
>
childQuests
;
private
int
parentQuestId
;
private
int
[]
questVars
;
private
ParentQuestState
state
;
private
boolean
isFinished
;
List
<
QuestGroupSuite
>
questGroupSuites
;
@Deprecated
// Morphia only. Do not use.
public
GameMainQuest
()
{}
public
GameMainQuest
(
Player
player
,
int
parentQuestId
)
{
this
.
owner
=
player
;
this
.
ownerUid
=
player
.
getUid
();
...
...
@@ -52,12 +52,13 @@ public class GameMainQuest {
this
.
childQuests
=
new
HashMap
<>();
this
.
questVars
=
new
int
[
5
];
this
.
state
=
ParentQuestState
.
PARENT_QUEST_STATE_NONE
;
this
.
questGroupSuites
=
new
ArrayList
<>();
}
public
int
getParentQuestId
()
{
return
parentQuestId
;
}
public
int
getOwnerUid
()
{
return
ownerUid
;
}
...
...
@@ -74,7 +75,7 @@ public class GameMainQuest {
public
Map
<
Integer
,
GameQuest
>
getChildQuests
()
{
return
childQuests
;
}
public
GameQuest
getChildQuestById
(
int
id
)
{
return
this
.
getChildQuests
().
get
(
id
);
}
...
...
@@ -91,26 +92,36 @@ public class GameMainQuest {
return
isFinished
;
}
public
void
finish
()
{
public
List
<
QuestGroupSuite
>
getQuestGroupSuites
()
{
return
questGroupSuites
;
}
public
void
finish
()
{
this
.
isFinished
=
true
;
this
.
state
=
ParentQuestState
.
PARENT_QUEST_STATE_FINISHED
;
this
.
getOwner
().
getSession
().
send
(
new
PacketFinishedParentQuestUpdateNotify
(
this
));
this
.
getOwner
().
getSession
().
send
(
new
PacketCodexDataUpdateNotify
(
this
));
this
.
save
();
// Add rewards
MainQuestData
mainQuestData
=
GameData
.
getMainQuestDataMap
().
get
(
this
.
getParentQuestId
());
for
(
int
rewardId
:
mainQuestData
.
getRewardIdList
())
{
RewardData
rewardData
=
GameData
.
getRewardDataMap
().
get
(
rewardId
);
if
(
rewardData
==
null
)
{
continue
;
}
getOwner
().
getInventory
().
addItemParamDatas
(
rewardData
.
getRewardItemList
(),
ActionReason
.
QuestReward
);
}
// handoff main quest
if
(
mainQuestData
.
getSuggestTrackMainQuestList
()
!=
null
){
Arrays
.
stream
(
mainQuestData
.
getSuggestTrackMainQuestList
())
.
forEach
(
getOwner
().
getQuestManager
()::
startMainQuest
);
}
}
public
void
save
()
{
...
...
@@ -122,16 +133,16 @@ public class GameMainQuest {
.
setParentQuestId
(
getParentQuestId
())
.
setIsFinished
(
isFinished
())
.
setParentQuestState
(
getState
().
getValue
());
for
(
GameQuest
quest
:
this
.
getChildQuests
().
values
())
{
ChildQuest
childQuest
=
ChildQuest
.
newBuilder
()
.
setQuestId
(
quest
.
getQuestId
())
.
setState
(
quest
.
getState
().
getValue
())
.
build
();
proto
.
addChildQuestList
(
childQuest
);
}
if
(
getQuestVars
()
!=
null
)
{
for
(
int
i
:
getQuestVars
())
{
proto
.
addQuestVar
(
i
);
...
...
src/main/java/emu/grasscutter/game/quest/GameQuest.java
View file @
91000821
...
...
@@ -6,13 +6,16 @@ import emu.grasscutter.Grasscutter;
import
emu.grasscutter.data.GameData
;
import
emu.grasscutter.data.binout.MainQuestData
;
import
emu.grasscutter.data.binout.MainQuestData.SubQuestData
;
import
emu.grasscutter.data.excels.ChapterData
;
import
emu.grasscutter.data.excels.QuestData
;
import
emu.grasscutter.data.excels.QuestData.QuestCondition
;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.game.quest.enums.LogicType
;
import
emu.grasscutter.game.quest.enums.QuestState
;
import
emu.grasscutter.game.quest.enums.QuestTrigger
;
import
emu.grasscutter.net.proto.ChapterStateOuterClass
;
import
emu.grasscutter.net.proto.QuestOuterClass.Quest
;
import
emu.grasscutter.server.packet.send.PacketC
odexDataUpd
ateNotify
;
import
emu.grasscutter.server.packet.send.PacketC
hapterSt
ateNotify
;
import
emu.grasscutter.server.packet.send.PacketQuestListUpdateNotify
;
import
emu.grasscutter.server.packet.send.PacketQuestProgressUpdateNotify
;
import
emu.grasscutter.utils.Utils
;
...
...
@@ -21,21 +24,21 @@ import emu.grasscutter.utils.Utils;
public
class
GameQuest
{
@Transient
private
GameMainQuest
mainQuest
;
@Transient
private
QuestData
questData
;
private
int
questId
;
private
int
mainQuestId
;
private
QuestState
state
;
private
int
startTime
;
private
int
acceptTime
;
private
int
finishTime
;
private
int
[]
finishProgressList
;
private
int
[]
failProgressList
;
@Deprecated
// Morphia only. Do not use.
public
GameQuest
()
{}
public
GameQuest
(
GameMainQuest
mainQuest
,
QuestData
questData
)
{
this
.
mainQuest
=
mainQuest
;
this
.
questId
=
questData
.
getId
();
...
...
@@ -44,18 +47,31 @@ public class GameQuest {
this
.
acceptTime
=
Utils
.
getCurrentSeconds
();
this
.
startTime
=
this
.
acceptTime
;
this
.
state
=
QuestState
.
QUEST_STATE_UNFINISHED
;
if
(
questData
.
getFinishCond
()
!=
null
&&
questData
.
getAcceptCond
().
length
!=
0
)
{
this
.
finishProgressList
=
new
int
[
questData
.
getFinishCond
().
length
];
if
(
questData
.
getFinishCond
()
!=
null
&&
questData
.
getAcceptCond
().
size
()
!=
0
)
{
this
.
finishProgressList
=
new
int
[
questData
.
getFinishCond
().
size
()
];
}
if
(
questData
.
getFailCond
()
!=
null
&&
questData
.
getFailCond
().
length
!=
0
)
{
this
.
failProgressList
=
new
int
[
questData
.
getFailCond
().
length
];
if
(
questData
.
getFailCond
()
!=
null
&&
questData
.
getFailCond
().
size
()
!=
0
)
{
this
.
failProgressList
=
new
int
[
questData
.
getFailCond
().
size
()
];
}
this
.
mainQuest
.
getChildQuests
().
put
(
this
.
questId
,
this
);
this
.
getData
().
getBeginExec
().
forEach
(
e
->
getOwner
().
getServer
().
getQuestHandler
().
triggerExec
(
this
,
e
,
e
.
getParam
()));
this
.
getOwner
().
getQuestManager
().
triggerEvent
(
QuestTrigger
.
QUEST_CONTENT_QUEST_STATE_EQUAL
,
this
.
questId
,
this
.
state
.
getValue
());
if
(
ChapterData
.
beginQuestChapterMap
.
containsKey
(
questId
)){
mainQuest
.
getOwner
().
sendPacket
(
new
PacketChapterStateNotify
(
ChapterData
.
beginQuestChapterMap
.
get
(
questId
).
getId
(),
ChapterStateOuterClass
.
ChapterState
.
CHAPTER_STATE_BEGIN
));
}
Grasscutter
.
getLogger
().
debug
(
"Quest {} is started"
,
questId
);
}
public
GameMainQuest
getMainQuest
()
{
return
mainQuest
;
}
...
...
@@ -63,7 +79,7 @@ public class GameQuest {
public
void
setMainQuest
(
GameMainQuest
mainQuest
)
{
this
.
mainQuest
=
mainQuest
;
}
public
Player
getOwner
()
{
return
getMainQuest
().
getOwner
();
}
...
...
@@ -116,11 +132,11 @@ public class GameQuest {
public
void
setFinishTime
(
int
finishTime
)
{
this
.
finishTime
=
finishTime
;
}
public
int
[]
getFinishProgressList
()
{
return
finishProgressList
;
}
public
void
setFinishProgress
(
int
index
,
int
value
)
{
finishProgressList
[
index
]
=
value
;
}
...
...
@@ -128,7 +144,7 @@ public class GameQuest {
public
int
[]
getFailProgressList
()
{
return
failProgressList
;
}
public
void
setFailProgress
(
int
index
,
int
value
)
{
failProgressList
[
index
]
=
value
;
}
...
...
@@ -136,16 +152,16 @@ public class GameQuest {
public
void
finish
()
{
this
.
state
=
QuestState
.
QUEST_STATE_FINISHED
;
this
.
finishTime
=
Utils
.
getCurrentSeconds
();
if
(
this
.
getFinishProgressList
()
!=
null
)
{
for
(
int
i
=
0
;
i
<
getFinishProgressList
().
length
;
i
++)
{
getFinishProgressList
()[
i
]
=
1
;
}
}
this
.
getOwner
().
getSession
().
send
(
new
PacketQuestProgressUpdateNotify
(
this
));
this
.
getOwner
().
getSession
().
send
(
new
PacketQuestListUpdateNotify
(
this
));
if
(
this
.
getData
().
finishParent
())
{
// This quest finishes the questline - the main quest will also save the quest to db so we dont have to call save() here
this
.
getMainQuest
().
finish
();
...
...
@@ -154,8 +170,21 @@ public class GameQuest {
this
.
tryAcceptQuestLine
();
this
.
save
();
}
this
.
getData
().
getFinishExec
().
forEach
(
e
->
getOwner
().
getServer
().
getQuestHandler
().
triggerExec
(
this
,
e
,
e
.
getParam
()));
this
.
getOwner
().
getQuestManager
().
triggerEvent
(
QuestTrigger
.
QUEST_CONTENT_QUEST_STATE_EQUAL
,
this
.
questId
,
this
.
state
.
getValue
());
if
(
ChapterData
.
endQuestChapterMap
.
containsKey
(
questId
)){
mainQuest
.
getOwner
().
sendPacket
(
new
PacketChapterStateNotify
(
ChapterData
.
endQuestChapterMap
.
get
(
questId
).
getId
(),
ChapterStateOuterClass
.
ChapterState
.
CHAPTER_STATE_END
));
}
Grasscutter
.
getLogger
().
debug
(
"Quest {} is finished"
,
questId
);
}
public
boolean
tryAcceptQuestLine
()
{
try
{
MainQuestData
questConfig
=
GameData
.
getMainQuestDataMap
().
get
(
this
.
getMainQuestId
());
...
...
@@ -167,16 +196,17 @@ public class GameQuest {
QuestData
questData
=
GameData
.
getQuestDataMap
().
get
(
subQuest
.
getSubId
());
if
(
questData
==
null
||
questData
.
getAcceptCond
()
==
null
||
questData
.
getAcceptCond
().
length
==
0
)
{
||
questData
.
getAcceptCond
().
size
()
==
0
)
{
continue
;
}
int
[]
accept
=
new
int
[
questData
.
getAcceptCond
().
length
];
int
[]
accept
=
new
int
[
questData
.
getAcceptCond
().
size
()
];
// TODO
for
(
int
i
=
0
;
i
<
questData
.
getAcceptCond
().
length
;
i
++)
{
QuestCondition
condition
=
questData
.
getAcceptCond
()
[
i
]
;
for
(
int
i
=
0
;
i
<
questData
.
getAcceptCond
().
size
()
;
i
++)
{
QuestCondition
condition
=
questData
.
getAcceptCond
()
.
get
(
i
)
;
boolean
result
=
getOwner
().
getServer
().
getQuestHandler
().
triggerCondition
(
this
,
condition
,
condition
.
getParamStr
(),
condition
.
getParam
());
accept
[
i
]
=
result
?
1
:
0
;
...
...
@@ -195,11 +225,11 @@ public class GameQuest {
return
false
;
}
public
void
save
()
{
getMainQuest
().
save
();
}
public
Quest
toProto
()
{
Quest
.
Builder
proto
=
Quest
.
newBuilder
()
.
setQuestId
(
this
.
getQuestId
())
...
...
@@ -208,19 +238,19 @@ public class GameQuest {
.
setStartTime
(
this
.
getStartTime
())
.
setStartGameTime
(
438
)
.
setAcceptTime
(
this
.
getAcceptTime
());
if
(
this
.
getFinishProgressList
()
!=
null
)
{
for
(
int
i
:
this
.
getFinishProgressList
())
{
proto
.
addFinishProgressList
(
i
);
}
}
if
(
this
.
getFailProgressList
()
!=
null
)
{
for
(
int
i
:
this
.
getFailProgressList
())
{
proto
.
addFailProgressList
(
i
);
}
}
return
proto
.
build
();
}
}
src/main/java/emu/grasscutter/game/quest/QuestGroupSuite.java
0 → 100644
View file @
91000821
package
emu.grasscutter.game.quest
;
import
dev.morphia.annotations.Entity
;
import
lombok.AccessLevel
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.experimental.FieldDefaults
;
@Entity
@Data
@Builder
(
builderMethodName
=
"of"
)
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
QuestGroupSuite
{
int
scene
;
int
group
;
int
suite
;
}
src/main/java/emu/grasscutter/game/quest/QuestManager.java
View file @
91000821
package
emu.grasscutter.game.quest
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Set
;
import
java.util.*
;
import
java.util.function.Consumer
;
import
java.util.stream.Collectors
;
import
emu.grasscutter.Grasscutter
;
import
emu.grasscutter.data.GameData
;
import
emu.grasscutter.data.binout.MainQuestData
;
import
emu.grasscutter.data.excels.QuestData
;
import
emu.grasscutter.data.excels.QuestData.QuestCondition
;
import
emu.grasscutter.database.DatabaseHelper
;
import
emu.grasscutter.game.player.Player
;
import
emu.grasscutter.game.quest.enums.ParentQuestState
;
import
emu.grasscutter.game.quest.enums.QuestTrigger
;
import
emu.grasscutter.game.quest.enums.LogicType
;
import
emu.grasscutter.game.quest.enums.QuestState
;
import
emu.grasscutter.server.packet.send.PacketFinishedParentQuestUpdateNotify
;
import
emu.grasscutter.server.packet.send.PacketQuestListUpdateNotify
;
import
emu.grasscutter.server.packet.send.PacketQuestProgressUpdateNotify
;
import
emu.grasscutter.server.packet.send.PacketServerCondMeetQuestListUpdateNotify
;
import
emu.grasscutter.server.packet.send.*
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectMap
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
;
public
class
QuestManager
{
private
final
Player
player
;
private
final
Int2ObjectMap
<
GameMainQuest
>
quests
;
public
QuestManager
(
Player
player
)
{
this
.
player
=
player
;
this
.
quests
=
new
Int2ObjectOpenHashMap
<>();
...
...
@@ -122,40 +121,56 @@ public class QuestManager {
return
quest
;
}
public
void
triggerEvent
(
QuestTrigger
condType
,
int
...
params
)
{
public
void
startMainQuest
(
int
mainQuestId
){
var
mainQuestData
=
GameData
.
getMainQuestDataMap
().
get
(
mainQuestId
);
if
(
mainQuestData
==
null
){
return
;
}
Arrays
.
stream
(
mainQuestData
.
getSubQuests
())
.
min
(
Comparator
.
comparingInt
(
MainQuestData
.
SubQuestData
::
getOrder
))
.
map
(
MainQuestData
.
SubQuestData
::
getSubId
)
.
ifPresent
(
this
::
addQuest
);
}
public
void
triggerEvent
(
QuestTrigger
condType
,
int
...
params
)
{
triggerEvent
(
condType
,
""
,
params
);
}
public
void
triggerEvent
(
QuestTrigger
condType
,
String
paramStr
,
int
...
params
)
{
Grasscutter
.
getLogger
().
debug
(
"Trigger Event {}, {}, {}"
,
condType
,
paramStr
,
params
);
Set
<
GameQuest
>
changedQuests
=
new
HashSet
<>();
this
.
forEachActiveQuest
(
quest
->
{
QuestData
data
=
quest
.
getData
();
for
(
int
i
=
0
;
i
<
data
.
getFinishCond
().
length
;
i
++)
{
if
(
quest
.
getFinishProgressList
()
==
null
for
(
int
i
=
0
;
i
<
data
.
getFinishCond
().
size
()
;
i
++)
{
if
(
quest
.
getFinishProgressList
()
==
null
||
quest
.
getFinishProgressList
().
length
==
0
||
quest
.
getFinishProgressList
()[
i
]
==
1
)
{
continue
;
}
QuestCondition
condition
=
data
.
getFinishCond
()
[
i
]
;
QuestCondition
condition
=
data
.
getFinishCond
()
.
get
(
i
)
;
if
(
condition
.
getType
()
!=
condType
)
{
continue
;
}
boolean
result
=
getPlayer
().
getServer
().
getQuestHandler
().
triggerContent
(
quest
,
condition
,
params
);
boolean
result
=
getPlayer
().
getServer
().
getQuestHandler
().
triggerContent
(
quest
,
condition
,
paramStr
,
params
);
if
(
result
)
{
quest
.
getFinishProgressList
()[
i
]
=
1
;
changedQuests
.
add
(
quest
);
}
}
});
for
(
GameQuest
quest
:
changedQuests
)
{
LogicType
logicType
=
quest
.
getData
().
getFailCondComb
();
int
[]
progress
=
quest
.
getFinishProgressList
();
// Handle logical comb
boolean
finish
=
LogicType
.
calculate
(
logicType
,
progress
);
...
...
@@ -169,6 +184,15 @@ public class QuestManager {
}
}
public
List
<
QuestGroupSuite
>
getSceneGroupSuite
(
int
sceneId
)
{
return
getQuests
().
values
().
stream
()
.
filter
(
i
->
i
.
getState
()
!=
ParentQuestState
.
PARENT_QUEST_STATE_FINISHED
)
.
map
(
GameMainQuest:
:
getQuestGroupSuites
)
.
filter
(
Objects:
:
nonNull
)
.
flatMap
(
Collection:
:
stream
)
.
filter
(
i
->
i
.
getScene
()
==
sceneId
)
.
toList
();
}
public
void
loadFromDatabase
()
{
List
<
GameMainQuest
>
quests
=
DatabaseHelper
.
getAllQuests
(
getPlayer
());
...
...
src/main/java/emu/grasscutter/game/quest/ServerQuestHandler.java
View file @
91000821
...
...
@@ -2,10 +2,12 @@ package emu.grasscutter.game.quest;
import
java.util.Set
;
import
emu.grasscutter.data.excels.QuestData
;
import
emu.grasscutter.game.quest.handlers.QuestExecHandler
;
import
org.reflections.Reflections
;
import
emu.grasscutter.Grasscutter
;
import
emu.grasscutter.data.excels.QuestData.
QuestCondition
;
import
emu.grasscutter.data.excels.QuestData.
*
;
import
emu.grasscutter.game.quest.handlers.QuestBaseHandler
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectMap
;
import
it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
;
...
...
@@ -14,32 +16,32 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public
class
ServerQuestHandler
{
private
final
Int2ObjectMap
<
QuestBaseHandler
>
condHandlers
;
private
final
Int2ObjectMap
<
QuestBaseHandler
>
contHandlers
;
private
final
Int2ObjectMap
<
Quest
Base
Handler
>
execHandlers
;
private
final
Int2ObjectMap
<
Quest
Exec
Handler
>
execHandlers
;
public
ServerQuestHandler
()
{
this
.
condHandlers
=
new
Int2ObjectOpenHashMap
<>();
this
.
condHandlers
=
new
Int2ObjectOpenHashMap
<>();
this
.
contHandlers
=
new
Int2ObjectOpenHashMap
<>();
this
.
execHandlers
=
new
Int2ObjectOpenHashMap
<>();
this
.
registerHandlers
();
}
public
void
registerHandlers
()
{
this
.
registerHandlers
(
this
.
condHandlers
,
"emu.grasscutter.game.quest.conditions"
);
this
.
registerHandlers
(
this
.
contHandlers
,
"emu.grasscutter.game.quest.content"
);
this
.
registerHandlers
(
this
.
execHandlers
,
"emu.grasscutter.game.quest.exec"
);
this
.
registerHandlers
(
this
.
condHandlers
,
"emu.grasscutter.game.quest.conditions"
,
QuestBaseHandler
.
class
);
this
.
registerHandlers
(
this
.
contHandlers
,
"emu.grasscutter.game.quest.content"
,
QuestBaseHandler
.
class
);
this
.
registerHandlers
(
this
.
execHandlers
,
"emu.grasscutter.game.quest.exec"
,
QuestExecHandler
.
class
);
}
public
void
registerHandlers
(
Int2ObjectMap
<
QuestBaseHandler
>
map
,
String
packageName
)
{
public
<
T
>
void
registerHandlers
(
Int2ObjectMap
<
T
>
map
,
String
packageName
,
Class
<
T
>
clazz
)
{
Reflections
reflections
=
new
Reflections
(
packageName
);
Set
<?>
handlerClasses
=
reflections
.
getSubTypesOf
(
QuestBaseHandler
.
cla
ss
);
for
(
Object
obj
:
handlerClasses
)
{
this
.
registerPacketHandler
(
map
,
(
Class
<?
extends
QuestBaseHandler
>)
obj
);
var
handlerClasses
=
reflections
.
getSubTypesOf
(
cla
zz
);
for
(
var
obj
:
handlerClasses
)
{
this
.
registerPacketHandler
(
map
,
obj
);
}
}
public
void
registerPacketHandler
(
Int2ObjectMap
<
QuestBaseHandler
>
map
,
Class
<?
extends
QuestBaseHandler
>
handlerClass
)
{
public
<
T
>
void
registerPacketHandler
(
Int2ObjectMap
<
T
>
map
,
Class
<?
extends
T
>
handlerClass
)
{
try
{
QuestValue
opcode
=
handlerClass
.
getAnnotation
(
QuestValue
.
class
);
...
...
@@ -47,43 +49,44 @@ public class ServerQuestHandler {
return
;
}
QuestBaseHandler
packetHandler
=
(
QuestBaseHandler
)
handlerClass
.
newInstance
();
map
.
put
(
opcode
.
value
().
getValue
(),
packetHandler
);
map
.
put
(
opcode
.
value
().
getValue
(),
handlerClass
.
newInstance
());
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
// TODO make cleaner
public
boolean
triggerCondition
(
GameQuest
quest
,
QuestCondition
condition
,
int
...
params
)
{
public
boolean
triggerCondition
(
GameQuest
quest
,
QuestCondition
condition
,
String
paramStr
,
int
...
params
)
{
QuestBaseHandler
handler
=
condHandlers
.
get
(
condition
.
getType
().
getValue
());
if
(
handler
==
null
||
quest
.
getData
()
==
null
)
{
Grasscutter
.
getLogger
().
debug
(
"Could not trigger condition {} at {}"
,
condition
.
getType
().
getValue
(),
quest
.
getData
());
return
false
;
}
return
handler
.
execute
(
quest
,
condition
,
params
);
return
handler
.
execute
(
quest
,
condition
,
paramStr
,
params
);
}
public
boolean
triggerContent
(
GameQuest
quest
,
QuestCondition
condition
,
int
...
params
)
{
public
boolean
triggerContent
(
GameQuest
quest
,
QuestCondition
condition
,
String
paramStr
,
int
...
params
)
{
QuestBaseHandler
handler
=
contHandlers
.
get
(
condition
.
getType
().
getValue
());
if
(
handler
==
null
||
quest
.
getData
()
==
null
)
{
Grasscutter
.
getLogger
().
debug
(
"Could not trigger content {} at {}"
,
condition
.
getType
().
getValue
(),
quest
.
getData
());
return
false
;
}
return
handler
.
execute
(
quest
,
condition
,
params
);
return
handler
.
execute
(
quest
,
condition
,
paramStr
,
params
);
}
public
boolean
triggerExec
(
GameQuest
quest
,
Quest
Condition
condition
,
in
t
...
params
)
{
Quest
Base
Handler
handler
=
execHandlers
.
get
(
condition
.
getType
().
getValue
());
public
boolean
triggerExec
(
GameQuest
quest
,
Quest
ExecParam
execParam
,
Str
in
g
...
params
)
{
Quest
Exec
Handler
handler
=
execHandlers
.
get
(
execParam
.
getType
().
getValue
());
if
(
handler
==
null
||
quest
.
getData
()
==
null
)
{
Grasscutter
.
getLogger
().
debug
(
"Could not trigger exec {} at {}"
,
execParam
.
getType
().
getValue
(),
quest
.
getData
());
return
false
;
}
return
handler
.
execute
(
quest
,
condition
,
params
);
return
handler
.
execute
(
quest
,
execParam
,
params
);
}
}
src/main/java/emu/grasscutter/game/quest/conditions/BaseCondition.java
View file @
91000821
...
...
@@ -10,9 +10,9 @@ import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
public
class
BaseCondition
extends
QuestBaseHandler
{
@Override
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
int
...
params
)
{
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
String
paramStr
,
int
...
params
)
{
// TODO Auto-generated method stub
return
false
;
}
}
src/main/java/emu/grasscutter/game/quest/conditions/ConditionLuaNotify.java
0 → 100644
View file @
91000821
package
emu.grasscutter.game.quest.conditions
;
import
emu.grasscutter.data.excels.QuestData.QuestCondition
;
import
emu.grasscutter.game.quest.GameQuest
;
import
emu.grasscutter.game.quest.QuestValue
;
import
emu.grasscutter.game.quest.enums.QuestTrigger
;
import
emu.grasscutter.game.quest.handlers.QuestBaseHandler
;
@QuestValue
(
QuestTrigger
.
QUEST_COND_LUA_NOTIFY
)
public
class
ConditionLuaNotify
extends
QuestBaseHandler
{
@Override
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
String
paramStr
,
int
...
params
)
{
return
condition
.
getParam
()[
0
]
==
Integer
.
parseInt
(
paramStr
);
}
}
src/main/java/emu/grasscutter/game/quest/conditions/ConditionPlayerLevelEqualGreater.java
View file @
91000821
...
...
@@ -10,8 +10,8 @@ import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
public
class
ConditionPlayerLevelEqualGreater
extends
QuestBaseHandler
{
@Override
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
int
...
params
)
{
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
String
paramStr
,
int
...
params
)
{
return
quest
.
getOwner
().
getLevel
()
>=
params
[
0
];
}
}
src/main/java/emu/grasscutter/game/quest/conditions/ConditionStateEqual.java
View file @
91000821
...
...
@@ -10,14 +10,14 @@ import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
public
class
ConditionStateEqual
extends
QuestBaseHandler
{
@Override
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
int
...
params
)
{
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
String
paramStr
,
int
...
params
)
{
GameQuest
checkQuest
=
quest
.
getOwner
().
getQuestManager
().
getQuestById
(
params
[
0
]);
if
(
checkQuest
!=
null
)
{
return
checkQuest
.
getState
().
getValue
()
==
params
[
1
];
}
return
false
;
return
false
;
}
}
src/main/java/emu/grasscutter/game/quest/content/BaseContent.java
View file @
91000821
...
...
@@ -10,9 +10,9 @@ import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
public
class
BaseContent
extends
QuestBaseHandler
{
@Override
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
int
...
params
)
{
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
String
paramStr
,
int
...
params
)
{
// TODO Auto-generated method stub
return
false
;
}
}
src/main/java/emu/grasscutter/game/quest/content/ContentAddQuestProgress.java
0 → 100644
View file @
91000821
package
emu.grasscutter.game.quest.content
;
import
emu.grasscutter.data.excels.QuestData.QuestCondition
;
import
emu.grasscutter.game.quest.GameQuest
;
import
emu.grasscutter.game.quest.QuestValue
;
import
emu.grasscutter.game.quest.enums.QuestTrigger
;
import
emu.grasscutter.game.quest.handlers.QuestBaseHandler
;
@QuestValue
(
QuestTrigger
.
QUEST_CONTENT_ADD_QUEST_PROGRESS
)
public
class
ContentAddQuestProgress
extends
QuestBaseHandler
{
@Override
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
String
paramStr
,
int
...
params
)
{
return
condition
.
getParam
()[
0
]
==
params
[
0
];
}
}
src/main/java/emu/grasscutter/game/quest/content/ContentCompleteTalk.java
View file @
91000821
...
...
@@ -10,8 +10,8 @@ import emu.grasscutter.game.quest.handlers.QuestBaseHandler;
public
class
ContentCompleteTalk
extends
QuestBaseHandler
{
@Override
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
int
...
params
)
{
public
boolean
execute
(
GameQuest
quest
,
QuestCondition
condition
,
String
paramStr
,
int
...
params
)
{
return
condition
.
getParam
()[
0
]
==
params
[
0
];
}
}
Prev
1
2
3
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