Merge unstable into development (#2173)

* Remove more scene synchronized

* Fix worktop options not appearing

* Format code [skip actions]

* Fix delay with server tasks

* Format code [skip actions]

* Fully fix fairy clock (#2146)

* Fix scene transition

* fully fix fairy clock

* Re-add call to `Player#updatePlayerGameTime`

* Format code [skip actions]

* Initialize the script loader in `ResourceLoader#loadAll`

* Fix region removal checking

* Format code [skip actions]

* Use Lombok's `EqualsAndHashCode` for comparing scene regions

* Format code [skip actions]

* Move 'invalid gather object' to `trace`

* Add more information to the 'unknown condition handler' message

* Move invalid ability action to trace

* Make `KcpTunnel` public

* Validate the NPC being talked to

* Format code [skip actions]

* NPCs are not spawned server side; change logic to handle it

* Format code [skip actions]

* unload scene when there are no players (#2147)

* unload scene when there are no players

* Update src/main/java/emu/grasscutter/game/world/Scene.java

Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>

---------

Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>

* Check if a command should be copied or HTTP should be used

* Lint Code [skip actions]

* Fix character names rendering incorrectly

* Add basic troubleshooting command

* Implement handbook teleporting

also a few formatting changes and sort data by logical sense

* Fix listener `ConcurrentModificationException` issue

* Add color change to `Join the Community!`

* Lint Code [skip actions]

* Make clickable buttons appear clickable

* Remove 'Mechanicus' entities from the list of entities

* Format code [skip actions]

* Fix going back returning a blank screen

* Implement entity spawning

* Add setting level to entity card

* Add support for 'plain text' mode

* Make descriptions of objects scrollable

* Lint Code [skip actions]

* Format code [skip actions]

* Change the way existing hooks work

* Format code [skip actions]

* Upgrade Javalin to 5.5.0 & Fix project warnings

* Upgrade logging libraries

* Fix gacha mappings static file issue

* Add temporary backwards compatability for `ServerHelper`

* Format code [skip actions]

* Remove artifact signatures from VCS

* Fix forge queue data protocol definition

* Run `spotlessApply`

* Format code [skip actions]

* Download data required for building artifacts

* Add call for Facebook logins

* Add the wiki page as a submodule

* Format code [skip actions]

* Update translation (#2150)

* Update translation

* Update translation

* Separate the dispatch and game servers (pt. 1)

gacha is still broken, handbook still needs to be done

* Format code [skip actions]

* Separate the dispatch and game servers (pt. 2)

this commit fixes the gacha page

* Add description for '/troubleshoot'

* Set default avatar talent level to 10

* Separate the dispatch and game servers (pt. 3)

implement handbook across servers!

* Format code [skip actions]

* Update GitHub Actions to use 'download-file' over 'wget'

* Gm handbook lmao (#2149)

* Fix font issue

* Fix avatars

* Fix text overflow in commands

* Fix virtualized lists and items page 😭😭

* magix why 💀

* use hover style in all minicards

* button

* remove console.log

* lint

* Add icons

* magix asked

* Fix overflow padding issue

* Fix achievement text overflow

* remove icons from repo

* Change command icon

* Add the wiki page as a submodule

* total magix moment

* fix text overflow in commands

* Fix discord button

* Make text scale on Minicard

* import icons and font from another source

* Add hover effects to siebar buttons

* move font and readme to submodule repo

* Make data folder a submodule

* import icons and font from data submodule

* Update README.md

* total magix moment

* magix moment v2

* submodule change

* Import `.webp` files

* Resize `HomeButton`

* Fix 'Copy Command' reappearing after changing pages

---------

Co-authored-by: KingRainbow44 <kobedo11@gmail.com>

* Lint Code [skip actions]

* Download data for the build, not for the lint

* format imports

this is really just to see if build handbook works kek

* Implement proper handbook authentication (pt. 1)

* Implement proper handbook authentication (pt. 2)

* Format code [skip actions]

* Add quest data dumping for the handbook

* Change colors to fit _something suitable_

* Format code [skip actions]

* Fix force pushing to branches after linting

* Fix logic of `SetPlayerPropReq`

* Move more group loading to `trace`

* Add handbook IP authentication in hybrid mode

* Fix player level up not displaying on the client properly

* Format code [skip actions]

* Fix game time locking

* Format code [skip actions]

* Update player properties

* Format code [skip actions]

* Move `warn`s for groups to `debug`

* Fix player pausing

* Move more logs to `trace`

* Use `removeItemById` for deleting items via quests

* Clean up logger more

* Pause in-game time when the world is paused

* Format code [skip actions]

* More player property documentation

* Multi-threaded resource loading

* Format code [skip actions]

* Add quest widgets

* Add quests page (basic impl.)

* Add/fix colors

also fix tailwind

* Remove banned packets

client modifications already perform the job of blocking malicious packets from being executed, no point in having this if self-windy is wanted

* Re-add `BeginCameraSceneLookNotify`

* Fix being unable to attack (#2157)

* Add `PlayerOpenChestEvent`

* Add methods to get players from the server

* Add static methods to register an event handler

* Add `PlayerEnterDungeonEvent`

* Remove legacy documentation from `PlayerMoveEvent`

* Add `PlayerChatEvent`

* Add defaults to `Position`

* Clean up `.utils`

* Revert `Multi-threaded resource loading`

* Fix changing target UID when talking to the server

* Lint Code [skip actions]

* Format code [skip actions]

* fix NPC talk triggering main quest in 46101 (#2158)

Make it so that only talks where the param matches the talkId are checked.

* Format code [skip actions]

* Partially fix Chasing Shadows (#2159)

* Partially fix Chasing Shadows

* Go ahead and move it before the return before Magix tells me to.

* Format code [skip actions]

* Bring back period lol (#2160)

* Disable SNI for the HTTPS server

* Add `EntityCreationEvent`

* Add initial startup message

this is so the server appears like its preparing to start

* Format code [skip actions]

* Enable debug mode for plugin loggers if enabled for the primary logger

* Add documentation about `WorldAreaConfigData`

* Make more fields in excels accessible

* Remove deprecated fields from `GetShopRsp`

* Run `spotlessApply` on definitions

* Add `PlayerEnterAreaEvent`

* Optimize event calls

* Fix event invokes

* Format code [skip actions]

* Remove manual autofinish for main quests. (#2162)

* Add world areas to the textmap cache

* Format code [skip actions]

* Don't overdefine variables in extended classes (#2163)

* Add dumper for world areas

* Format code [skip actions]

* instantiate personalLineList (#2165)

* Fix protocol definitions

thank you Nazrin! (+ hiro for raw definitions)

* Fix the background color leaking from the character widget

* Change HTML spacing to 2 spaces

* Implement hiding widgets

* Change scrollbar to a vibrant color

* Add _some_ scaling to the home buttons and its text

* Build the handbook with Gradle

* Fix the 'finer details' with the handbook UI

* Lint Code [skip actions]

* Fix target destination for the Gradle-built handbook

* Implement fetching a player across servers & Add a chainable JsonObject

useful for plugins! might be used in grasscutter eventually

* Fix GitHub actions

* Fix event calling & canceling

* Run `spotlessApply`

* Rename fields (might be wrong)

* Add/update all/more protocol definitions

* Add/update all/more protocol definitions

* Remove outdated packet

* Fix protocol definitions

* Format code [skip actions]

* Implement some lua variables for less console spam (#2172)

* Implement some lua variables for less console spam

* Add GetHostQuestState

This fixes some chapter 3 stuff.

* Format code [skip actions]

* Fix merge import

* Format code [skip actions]

* Fully fix fairy clock for real this time (#2167)

* Fully fix fairy clock For real this time

* Make it so relogging keeps the time lock state.

* Refactor out questLockTime

* Per Hartie, the client packet needs to be changed too

* Update src/main/java/emu/grasscutter/game/world/World.java

Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>

* Update src/main/java/emu/grasscutter/server/packet/recv/HandlerClientLockGameTimeNotify.java

* Remove all code not needed to get clock working

---------

Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>

* Implement a proper ability system (#2166)

* Apply fix `21dec2fe`

* Apply fix `89d01d5f`

* Apply fix `d900f154`

this one was already implemented; updated to use call from previous commit

* Ability changing commit

TODO: change info to debug

* Remove use of deprecated methods/fields

* Temp commit v2
(Adding LoseHP and some fixes)

* Oopsie

* Probably fix monster battle

* Fix issue with reflecting into fields

* Fix some things

* Fix ability names for 3.6 resources

* Improve logging

---------

Co-authored-by: StartForKiller <jesussanz2003@gmail.com>

* Format code [skip actions]

* Add system for sending messages between servers

* Format some code

* Remove protocol definitions from Spotless

* Default debug to false; enable with `-debug`

* Implement completely useless global value copying

* HACK: Return the avatar which holds the weapon when the weapon is referred to by ID

* Add properties to `AbilityModifier`

* Change the way HTML is served after authentication

* Use thread executors to speed up the database loading process

* Format code [skip actions]

* Add system for setting handbook address and port

* Lint Code [skip actions]

* Format code [skip actions]

* Fix game-related data not saving

* Format code [skip actions]

* Fix handbook server details

* Lint Code [skip actions]

* Format code [skip actions]

* Use the headers provided by a context to get the IP address

should acknowledge #1975

* Format code [skip actions]

* Move more logs to `trace`

* Format code [skip actions]

* more trace

* Fix something and implement weapon entities

* Format code [skip actions]

* Fix `EntityWeapon`

* Remove deprecated API & Fix resource checking

* Fix unnecessary warning for first-time setup

* Implement handbook request limiting

* Format code [skip actions]

* Fix new avatar weapons being null

* Format code [skip actions]

* Fix issue with 35303 being un-completable & Try to fix fulfilled quest conditions being met

* Load activity config on server startup

* Require plugins to specify an API version and match with the server

* Add default open state ignore list

* Format code [skip actions]

* Quick fix for questing, needs more investigation
This would make the questing work again

* Remove existing hack for 35303

* Fix ignored open states from being set

* Format code [skip actions]

* fix the stupidest bug ive ever seen

* Optimize player kicking on server close

* Format code [skip actions]

* Re-add hack to fix 35303

* Update GitHub actions

* Format code [skip actions]

* Potentially fix issues with regions

* Download additional handbook data

* Revert "Potentially fix issues with regions"

This reverts commit 84e3823695.

---------

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: scooterboo <lewasite@yahoo.com>
Co-authored-by: Tesutarin <105267106+Tesutarin@users.noreply.github.com>
Co-authored-by: Scald <104459145+Arikatsu@users.noreply.github.com>
Co-authored-by: StartForKiller <jesussanz2003@gmail.com>
This commit is contained in:
Magix
2023-05-31 20:48:16 -07:00
committed by GitHub
parent f46fd372d2
commit 9e5b57a043
3839 changed files with 1841548 additions and 37533 deletions

View File

@@ -1,211 +1,213 @@
package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public enum ActionReason {
None(0),
QuestItem(1),
QuestReward(2),
Trifle(3),
Shop(4),
PlayerUpgradeReward(5),
AddAvatar(6),
GadgetEnvAnimal(7),
MonsterEnvAnimal(8),
Compound(9),
Cook(10),
Gather(11),
MailAttachment(12),
CityLevelupReturn(15),
CityLevelupReward(17),
AreaExploreReward(18),
UnlockPointReward(19),
DungeonFirstPass(20),
DungeonPass(21),
ChangeElemType(23),
FetterOpen(25),
DailyTaskScore(26),
DailyTaskHost(27),
RandTaskHost(28),
Expedition(29),
Gacha(30),
Combine(31),
RandTaskGuest(32),
DailyTaskGuest(33),
ForgeOutput(34),
ForgeReturn(35),
InitAvatar(36),
MonsterDie(37),
Gm(38),
OpenChest(39),
GadgetDie(40),
MonsterChangeHp(41),
SubfieldDrop(42),
PushTipsReward(43),
ActivityMonsterDrop(44),
ActivityGather(45),
ActivitySubfieldDrop(46),
TowerScheduleReward(47),
TowerFloorStarReward(48),
TowerFirstPassReward(49),
TowerDailyReward(50),
HitClientTrivialEntity(51),
OpenWorldBossChest(52),
MaterialDeleteReturn(53),
SignInReward(54),
OpenBlossomChest(55),
Recharge(56),
BonusActivityReward(57),
TowerCommemorativeReward(58),
TowerSkipFloorReward(59),
RechargeBonus(60),
RechargeCard(61),
RechargeCardDaily(62),
RechargeCardReplace(63),
RechargeCardReplaceFree(64),
RechargePlayReplace(65),
MpPlayTakeReward(66),
ActivityWatcher(67),
SalesmanDeliverItem(68),
SalesmanReward(69),
Rebate(70),
McoinExchangeHcoin(71),
DailyTaskExchangeLegendaryKey(72),
UnlockPersonLine(73),
FetterLevelReward(74),
BuyResin(75),
RechargePackage(76),
DeliveryDailyReward(77),
CityReputationLevel(78),
CityReputationQuest(79),
CityReputationRequest(80),
CityReputationExplore(81),
OffergingLevel(82),
RoutineHost(83),
RoutineGuest(84),
TreasureMapSpotToken(89),
TreasureMapBonusLevelReward(90),
TreasureMapMpReward(91),
Convert(92),
OverflowTransform(93),
ActivityAvatarSelectionReward(96),
ActivityWatcherBatch(97),
HitTreeDrop(98),
GetHomeLevelupReward(99),
HomeDefaultFurniture(100),
ActivityCond(101),
BattlePassNotify(102),
PlayerUseItem(1001),
DropItem(1002),
WeaponUpgrade(1011),
WeaponPromote(1012),
WeaponAwaken(1013),
RelicUpgrade(1014),
Ability(1015),
DungeonStatueDrop(1016),
OfflineMsg(1017),
AvatarUpgrade(1018),
AvatarPromote(1019),
QuestAction(1021),
CityLevelup(1022),
UpgradeSkill(1024),
UnlockTalent(1025),
UpgradeProudSkill(1026),
PlayerLevelLimitUp(1027),
DungeonDaily(1028),
ItemGiving(1030),
ForgeCost(1031),
InvestigationReward(1032),
InvestigationTargetReward(1033),
GadgetInteract(1034),
SeaLampCiMaterial(1036),
SeaLampContributionReward(1037),
SeaLampPhaseReward(1038),
SeaLampFlyLamp(1039),
AutoRecover(1040),
ActivityExpireItem(1041),
SubCoinNegative(1042),
BargainDeduct(1043),
BattlePassPaidReward(1044),
BattlePassLevelReward(1045),
TrialAvatarActivityFirstPassReward(1046),
BuyBattlePassLevel(1047),
GrantBirthdayBenefit(1048),
AchievementReward(1049),
AchievementGoalReward(1050),
FirstShareToSocialNetwork(1051),
DestroyMaterial(1052),
CodexLevelupReward(1053),
HuntingOfferReward(1054),
UseWidgetAnchorPoint(1055),
UseWidgetBonfire(1056),
UngradeWeaponReturnMaterial(1057),
UseWidgetOneoffGatherPointDetector(1058),
UseWidgetClientCollector(1059),
UseWidgetClientDetector(1060),
TakeGeneralReward(1061),
AsterTakeSpecialReward(1062),
RemoveCodexBook(1063),
OfferingItem(1064),
UseWidgetGadgetBuilder(1065),
EffigyFirstPassReward(1066),
EffigyReward(1067),
ReunionFirstGiftReward(1068),
ReunionSignInReward(1069),
ReunionWatcherReward(1070),
SalesmanMpReward(1071),
ActionReasionAvatarPromoteReward(1072),
BlessingRedeemReward(1073),
ActionMiracleRingReward(1074),
ExpeditionReward(1075),
TreasureMapRemoveDetector(1076),
MechanicusDungeonTicket(1077),
MechanicusLevelupGear(1078),
MechanicusBattleSettle(1079),
RegionSearchReward(1080),
UnlockCoopChapter(1081),
TakeCoopReward(1082),
FleurFairDungeonReward(1083),
ActivityScore(1084),
ChannellerSlabOneoffDungeonReward(1085),
FurnitureMakeStart(1086),
FurnitureMakeTake(1087),
FurnitureMakeCancel(1088),
FurnitureMakeFastFinish(1089),
ChannellerSlabLoopDungeonFirstPassReward(1090),
ChannellerSlabLoopDungeonScoreReward(1091),
HomeLimitedShopBuy(1092),
HomeCoinCollect(1093);
private final int value;
private static final Int2ObjectMap<ActionReason> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, ActionReason> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private ActionReason(int value) {
this.value = value;
}
None(0),
QuestItem(1),
QuestReward(2),
Trifle(3),
Shop(4),
PlayerUpgradeReward(5),
AddAvatar(6),
GadgetEnvAnimal(7),
MonsterEnvAnimal(8),
Compound(9),
Cook(10),
Gather(11),
MailAttachment(12),
CityLevelupReturn(15),
CityLevelupReward(17),
AreaExploreReward(18),
UnlockPointReward(19),
DungeonFirstPass(20),
DungeonPass(21),
ChangeElemType(23),
FetterOpen(25),
DailyTaskScore(26),
DailyTaskHost(27),
RandTaskHost(28),
Expedition(29),
Gacha(30),
Combine(31),
RandTaskGuest(32),
DailyTaskGuest(33),
ForgeOutput(34),
ForgeReturn(35),
InitAvatar(36),
MonsterDie(37),
Gm(38),
OpenChest(39),
GadgetDie(40),
MonsterChangeHp(41),
SubfieldDrop(42),
PushTipsReward(43),
ActivityMonsterDrop(44),
ActivityGather(45),
ActivitySubfieldDrop(46),
TowerScheduleReward(47),
TowerFloorStarReward(48),
TowerFirstPassReward(49),
TowerDailyReward(50),
HitClientTrivialEntity(51),
OpenWorldBossChest(52),
MaterialDeleteReturn(53),
SignInReward(54),
OpenBlossomChest(55),
Recharge(56),
BonusActivityReward(57),
TowerCommemorativeReward(58),
TowerSkipFloorReward(59),
RechargeBonus(60),
RechargeCard(61),
RechargeCardDaily(62),
RechargeCardReplace(63),
RechargeCardReplaceFree(64),
RechargePlayReplace(65),
MpPlayTakeReward(66),
ActivityWatcher(67),
SalesmanDeliverItem(68),
SalesmanReward(69),
Rebate(70),
McoinExchangeHcoin(71),
DailyTaskExchangeLegendaryKey(72),
UnlockPersonLine(73),
FetterLevelReward(74),
BuyResin(75),
RechargePackage(76),
DeliveryDailyReward(77),
CityReputationLevel(78),
CityReputationQuest(79),
CityReputationRequest(80),
CityReputationExplore(81),
OffergingLevel(82),
RoutineHost(83),
RoutineGuest(84),
TreasureMapSpotToken(89),
TreasureMapBonusLevelReward(90),
TreasureMapMpReward(91),
Convert(92),
OverflowTransform(93),
ActivityAvatarSelectionReward(96),
ActivityWatcherBatch(97),
HitTreeDrop(98),
GetHomeLevelupReward(99),
HomeDefaultFurniture(100),
ActivityCond(101),
BattlePassNotify(102),
PlayerUseItem(1001),
DropItem(1002),
WeaponUpgrade(1011),
WeaponPromote(1012),
WeaponAwaken(1013),
RelicUpgrade(1014),
Ability(1015),
DungeonStatueDrop(1016),
OfflineMsg(1017),
AvatarUpgrade(1018),
AvatarPromote(1019),
QuestAction(1021),
CityLevelup(1022),
UpgradeSkill(1024),
UnlockTalent(1025),
UpgradeProudSkill(1026),
PlayerLevelLimitUp(1027),
DungeonDaily(1028),
ItemGiving(1030),
ForgeCost(1031),
InvestigationReward(1032),
InvestigationTargetReward(1033),
GadgetInteract(1034),
SeaLampCiMaterial(1036),
SeaLampContributionReward(1037),
SeaLampPhaseReward(1038),
SeaLampFlyLamp(1039),
AutoRecover(1040),
ActivityExpireItem(1041),
SubCoinNegative(1042),
BargainDeduct(1043),
BattlePassPaidReward(1044),
BattlePassLevelReward(1045),
TrialAvatarActivityFirstPassReward(1046),
BuyBattlePassLevel(1047),
GrantBirthdayBenefit(1048),
AchievementReward(1049),
AchievementGoalReward(1050),
FirstShareToSocialNetwork(1051),
DestroyMaterial(1052),
CodexLevelupReward(1053),
HuntingOfferReward(1054),
UseWidgetAnchorPoint(1055),
UseWidgetBonfire(1056),
UngradeWeaponReturnMaterial(1057),
UseWidgetOneoffGatherPointDetector(1058),
UseWidgetClientCollector(1059),
UseWidgetClientDetector(1060),
TakeGeneralReward(1061),
AsterTakeSpecialReward(1062),
RemoveCodexBook(1063),
OfferingItem(1064),
UseWidgetGadgetBuilder(1065),
EffigyFirstPassReward(1066),
EffigyReward(1067),
ReunionFirstGiftReward(1068),
ReunionSignInReward(1069),
ReunionWatcherReward(1070),
SalesmanMpReward(1071),
ActionReasionAvatarPromoteReward(1072),
BlessingRedeemReward(1073),
ActionMiracleRingReward(1074),
ExpeditionReward(1075),
TreasureMapRemoveDetector(1076),
MechanicusDungeonTicket(1077),
MechanicusLevelupGear(1078),
MechanicusBattleSettle(1079),
RegionSearchReward(1080),
UnlockCoopChapter(1081),
TakeCoopReward(1082),
FleurFairDungeonReward(1083),
ActivityScore(1084),
ChannellerSlabOneoffDungeonReward(1085),
FurnitureMakeStart(1086),
FurnitureMakeTake(1087),
FurnitureMakeCancel(1088),
FurnitureMakeFastFinish(1089),
ChannellerSlabLoopDungeonFirstPassReward(1090),
ChannellerSlabLoopDungeonScoreReward(1091),
HomeLimitedShopBuy(1092),
HomeCoinCollect(1093);
public int getValue() {
return value;
}
public static ActionReason getTypeByValue(int value) {
return map.getOrDefault(value, None);
}
public static ActionReason getTypeByName(String name) {
return stringMap.getOrDefault(name, None);
}
private static final Int2ObjectMap<ActionReason> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, ActionReason> stringMap = new HashMap<>();
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private final int value;
ActionReason(int value) {
this.value = value;
}
public static ActionReason getTypeByValue(int value) {
return map.getOrDefault(value, None);
}
public static ActionReason getTypeByName(String name) {
return stringMap.getOrDefault(name, None);
}
public int getValue() {
return value;
}
}

View File

@@ -2,30 +2,37 @@ package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ActivityType {
NONE(0),
NEW_ACTIVITY_TRIAL_AVATAR(4),
NEW_ACTIVITY_PERSONAL_LIINE(8),
NEW_ACTIVITY_SALESMAN_MP(1205),
NEW_ACTIVITY_SUMMER_TIME(1600),
NEW_ACTIVITY_GENERAL_BANNER(2100),
NEW_ACTIVITY_MUSIC_GAME(2202),
;
NEW_ACTIVITY_PHOTO(2603),
NEW_ACTIVITY_FUNGUS_FIGHTER(3201),
NEW_ACTIVITY_EFFIGY_CHALLENGE_V2(3203);
private final int value;
private static final Int2ObjectMap<ActivityType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, ActivityType> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
public static ActivityType getTypeByValue(int value) {

View File

@@ -1,18 +1,18 @@
package emu.grasscutter.game.props;
public enum BattlePassMissionRefreshType {
BATTLE_PASS_MISSION_REFRESH_DAILY (0),
BATTLE_PASS_MISSION_REFRESH_CYCLE_CROSS_SCHEDULE (1), // Weekly
BATTLE_PASS_MISSION_REFRESH_SCHEDULE (2), // Per BP
BATTLE_PASS_MISSION_REFRESH_CYCLE (1); // Event?
private final int value;
BattlePassMissionRefreshType(int value) {
this.value = value;
}
BATTLE_PASS_MISSION_REFRESH_DAILY(0),
BATTLE_PASS_MISSION_REFRESH_CYCLE_CROSS_SCHEDULE(1), // Weekly
BATTLE_PASS_MISSION_REFRESH_SCHEDULE(2), // Per BP
BATTLE_PASS_MISSION_REFRESH_CYCLE(1); // Event?
public int getValue() {
return value;
}
private final int value;
BattlePassMissionRefreshType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}

View File

@@ -3,24 +3,24 @@ package emu.grasscutter.game.props;
import emu.grasscutter.net.proto.BattlePassMissionOuterClass.BattlePassMission.MissionStatus;
public enum BattlePassMissionStatus {
MISSION_STATUS_INVALID (0, MissionStatus.MISSION_STATUS_INVALID),
MISSION_STATUS_UNFINISHED (1, MissionStatus.MISSION_STATUS_UNFINISHED),
MISSION_STATUS_FINISHED (2, MissionStatus.MISSION_STATUS_FINISHED),
MISSION_STATUS_POINT_TAKEN (3, MissionStatus.MISSION_STATUS_POINT_TAKEN);
private final int value;
private final MissionStatus missionStatus;
BattlePassMissionStatus(int value, MissionStatus missionStatus) {
this.value = value;
this.missionStatus = missionStatus; // In case proto enum values change later
}
MISSION_STATUS_INVALID(0, MissionStatus.MISSION_STATUS_INVALID),
MISSION_STATUS_UNFINISHED(1, MissionStatus.MISSION_STATUS_UNFINISHED),
MISSION_STATUS_FINISHED(2, MissionStatus.MISSION_STATUS_FINISHED),
MISSION_STATUS_POINT_TAKEN(3, MissionStatus.MISSION_STATUS_POINT_TAKEN);
public int getValue() {
return value;
}
private final int value;
private final MissionStatus missionStatus;
public MissionStatus getMissionStatus() {
return missionStatus;
}
BattlePassMissionStatus(int value, MissionStatus missionStatus) {
this.value = value;
this.missionStatus = missionStatus; // In case proto enum values change later
}
public int getValue() {
return value;
}
public MissionStatus getMissionStatus() {
return missionStatus;
}
}

View File

@@ -0,0 +1,48 @@
package emu.grasscutter.game.props;
import emu.grasscutter.scripts.constants.IntValueEnum;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
public enum CampTargetType implements IntValueEnum {
None(0),
Alliance(1),
Enemy(2),
Self(3),
SelfCamp(4),
All(5),
AllExceptSelf(6),
AllianceIncludeSelf(7);
private final int value;
private static final Int2ObjectMap<CampTargetType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, CampTargetType> stringMap = new HashMap<>();
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private CampTargetType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static CampTargetType getTypeByValue(int value) {
return map.getOrDefault(value, None);
}
public static CampTargetType getTypeByName(String name) {
return stringMap.getOrDefault(name, None);
}
}

View File

@@ -1,54 +1,56 @@
package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public enum ClimateType {
CLIMATE_NONE(0),
CLIMATE_SUNNY(1),
CLIMATE_CLOUDY(2),
CLIMATE_RAIN(3),
CLIMATE_THUNDERSTORM(4),
CLIMATE_SNOW(5),
CLIMATE_MIST(6);
private final int value;
private static final Int2ObjectMap<ClimateType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, ClimateType> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private ClimateType(int value) {
this.value = value;
}
CLIMATE_NONE(0),
CLIMATE_SUNNY(1),
CLIMATE_CLOUDY(2),
CLIMATE_RAIN(3),
CLIMATE_THUNDERSTORM(4),
CLIMATE_SNOW(5),
CLIMATE_MIST(6);
public int getValue() {
return this.value;
}
private static final Int2ObjectMap<ClimateType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, ClimateType> stringMap = new HashMap<>();
public String getShortName() {
return this.name().substring(8).toLowerCase();
}
public static ClimateType getTypeByValue(int value) {
return map.getOrDefault(value, CLIMATE_NONE);
}
public static ClimateType getTypeByName(String name) {
return stringMap.getOrDefault(name, CLIMATE_NONE);
}
public static ClimateType getTypeByShortName(String shortName) {
String name = "CLIMATE_" + shortName.toUpperCase();
return stringMap.getOrDefault(name, CLIMATE_NONE);
}
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private final int value;
ClimateType(int value) {
this.value = value;
}
public static ClimateType getTypeByValue(int value) {
return map.getOrDefault(value, CLIMATE_NONE);
}
public static ClimateType getTypeByName(String name) {
return stringMap.getOrDefault(name, CLIMATE_NONE);
}
public static ClimateType getTypeByShortName(String shortName) {
String name = "CLIMATE_" + shortName.toUpperCase();
return stringMap.getOrDefault(name, CLIMATE_NONE);
}
public int getValue() {
return this.value;
}
public String getShortName() {
return this.name().substring(8).toLowerCase();
}
}

View File

@@ -1,57 +1,119 @@
package emu.grasscutter.game.props;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import emu.grasscutter.scripts.constants.IntValueEnum;
import emu.grasscutter.utils.Utils;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import lombok.Getter;
public enum ElementType {
None (0, FightProperty.FIGHT_PROP_CUR_FIRE_ENERGY, FightProperty.FIGHT_PROP_MAX_FIRE_ENERGY),
Fire (1, FightProperty.FIGHT_PROP_CUR_FIRE_ENERGY, FightProperty.FIGHT_PROP_MAX_FIRE_ENERGY, 10101, "TeamResonance_Fire_Lv2", 2),
Water (2, FightProperty.FIGHT_PROP_CUR_WATER_ENERGY, FightProperty.FIGHT_PROP_MAX_WATER_ENERGY, 10201, "TeamResonance_Water_Lv2", 3),
Grass (3, FightProperty.FIGHT_PROP_CUR_GRASS_ENERGY, FightProperty.FIGHT_PROP_MAX_GRASS_ENERGY, 10501, "TeamResonance_Grass_Lv2", 8),
Electric (4, FightProperty.FIGHT_PROP_CUR_ELEC_ENERGY, FightProperty.FIGHT_PROP_MAX_ELEC_ENERGY, 10401, "TeamResonance_Electric_Lv2", 7),
Ice (5, FightProperty.FIGHT_PROP_CUR_ICE_ENERGY, FightProperty.FIGHT_PROP_MAX_ICE_ENERGY, 10601, "TeamResonance_Ice_Lv2", 5),
Frozen (6, FightProperty.FIGHT_PROP_CUR_ICE_ENERGY, FightProperty.FIGHT_PROP_MAX_ICE_ENERGY),
Wind (7, FightProperty.FIGHT_PROP_CUR_WIND_ENERGY, FightProperty.FIGHT_PROP_MAX_WIND_ENERGY, 10301, "TeamResonance_Wind_Lv2", 4),
Rock (8, FightProperty.FIGHT_PROP_CUR_ROCK_ENERGY, FightProperty.FIGHT_PROP_MAX_ROCK_ENERGY, 10701, "TeamResonance_Rock_Lv2", 6),
AntiFire (9, FightProperty.FIGHT_PROP_CUR_FIRE_ENERGY, FightProperty.FIGHT_PROP_MAX_FIRE_ENERGY),
Default (255, FightProperty.FIGHT_PROP_CUR_FIRE_ENERGY, FightProperty.FIGHT_PROP_MAX_FIRE_ENERGY, 10801, "TeamResonance_AllDifferent");
public enum ElementType implements IntValueEnum {
None(0, FightProperty.FIGHT_PROP_CUR_FIRE_ENERGY, FightProperty.FIGHT_PROP_MAX_FIRE_ENERGY),
Fire(
1,
FightProperty.FIGHT_PROP_CUR_FIRE_ENERGY,
FightProperty.FIGHT_PROP_MAX_FIRE_ENERGY,
10101,
"TeamResonance_Fire_Lv2",
1),
Water(
2,
FightProperty.FIGHT_PROP_CUR_WATER_ENERGY,
FightProperty.FIGHT_PROP_MAX_WATER_ENERGY,
10201,
"TeamResonance_Water_Lv2",
2),
Grass(
3,
FightProperty.FIGHT_PROP_CUR_GRASS_ENERGY,
FightProperty.FIGHT_PROP_MAX_GRASS_ENERGY,
10501,
"TeamResonance_Grass_Lv2",
7),
Electric(
4,
FightProperty.FIGHT_PROP_CUR_ELEC_ENERGY,
FightProperty.FIGHT_PROP_MAX_ELEC_ENERGY,
10401,
"TeamResonance_Electric_Lv2",
6),
Ice(
5,
FightProperty.FIGHT_PROP_CUR_ICE_ENERGY,
FightProperty.FIGHT_PROP_MAX_ICE_ENERGY,
10601,
"TeamResonance_Ice_Lv2",
4),
Frozen(6, FightProperty.FIGHT_PROP_CUR_ICE_ENERGY, FightProperty.FIGHT_PROP_MAX_ICE_ENERGY),
Wind(
7,
FightProperty.FIGHT_PROP_CUR_WIND_ENERGY,
FightProperty.FIGHT_PROP_MAX_WIND_ENERGY,
10301,
"TeamResonance_Wind_Lv2",
3),
Rock(
8,
FightProperty.FIGHT_PROP_CUR_ROCK_ENERGY,
FightProperty.FIGHT_PROP_MAX_ROCK_ENERGY,
10701,
"TeamResonance_Rock_Lv2",
5),
AntiFire(9, FightProperty.FIGHT_PROP_CUR_FIRE_ENERGY, FightProperty.FIGHT_PROP_MAX_FIRE_ENERGY),
Default(
255,
FightProperty.FIGHT_PROP_CUR_FIRE_ENERGY,
FightProperty.FIGHT_PROP_MAX_FIRE_ENERGY,
10801,
"TeamResonance_AllDifferent");
private static final Int2ObjectMap<ElementType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, ElementType> stringMap = new HashMap<>();
static {
// Create bindings for each value.
Stream.of(ElementType.values())
.forEach(
entry -> {
map.put(entry.getValue(), entry);
stringMap.put(entry.name(), entry);
});
}
@Getter private final int value;
@Getter private final int teamResonanceId;
@Getter private final FightProperty curEnergyProp;
@Getter private final FightProperty maxEnergyProp;
@Getter private final int depotValue;
@Getter private final int depotIndex;
@Getter private final int configHash;
private static final Int2ObjectMap<ElementType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, ElementType> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private ElementType(int value, FightProperty curEnergyProp, FightProperty maxEnergyProp) {
ElementType(int value, FightProperty curEnergyProp, FightProperty maxEnergyProp) {
this(value, curEnergyProp, maxEnergyProp, 0, null, 1);
}
private ElementType(int value, FightProperty curEnergyProp, FightProperty maxEnergyProp, int teamResonanceId, String configName) {
ElementType(
int value,
FightProperty curEnergyProp,
FightProperty maxEnergyProp,
int teamResonanceId,
String configName) {
this(value, curEnergyProp, maxEnergyProp, teamResonanceId, configName, 1);
}
private ElementType(int value, FightProperty curEnergyProp, FightProperty maxEnergyProp, int teamResonanceId, String configName, int depotValue) {
ElementType(
int value,
FightProperty curEnergyProp,
FightProperty maxEnergyProp,
int teamResonanceId,
String configName,
int depotIndex) {
this.value = value;
this.curEnergyProp = curEnergyProp;
this.maxEnergyProp = maxEnergyProp;
this.teamResonanceId = teamResonanceId;
this.depotValue = depotValue;
this.depotIndex = depotIndex;
if (configName != null) {
this.configHash = Utils.abilityHash(configName);
} else {

View File

@@ -1,70 +1,72 @@
package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public enum EnterReason {
None(0),
Login(1),
DungeonReplay(11),
DungeonReviveOnWaypoint(12),
DungeonEnter(13),
DungeonQuit(14),
Gm(21),
QuestRollback(31),
Revival(32),
PersonalScene(41),
TransPoint(42),
ClientTransmit(43),
ForceDragBack(44),
TeamKick(51),
TeamJoin(52),
TeamBack(53),
Muip(54),
DungeonInviteAccept(55),
Lua(56),
ActivityLoadTerrain(57),
HostFromSingleToMp(58),
MpPlay(59),
AnchorPoint(60),
LuaSkipUi(61),
ReloadTerrain(62),
DraftTransfer(63),
EnterHome(64),
ExitHome(65),
ChangeHomeModule(66),
Gallery(67),
HomeSceneJump(68),
HideAndSeek(69);
private final int value;
private static final Int2ObjectMap<EnterReason> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, EnterReason> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private EnterReason(int value) {
this.value = value;
}
None(0),
Login(1),
DungeonReplay(11),
DungeonReviveOnWaypoint(12),
DungeonEnter(13),
DungeonQuit(14),
Gm(21),
QuestRollback(31),
Revival(32),
PersonalScene(41),
TransPoint(42),
ClientTransmit(43),
ForceDragBack(44),
TeamKick(51),
TeamJoin(52),
TeamBack(53),
Muip(54),
DungeonInviteAccept(55),
Lua(56),
ActivityLoadTerrain(57),
HostFromSingleToMp(58),
MpPlay(59),
AnchorPoint(60),
LuaSkipUi(61),
ReloadTerrain(62),
DraftTransfer(63),
EnterHome(64),
ExitHome(65),
ChangeHomeModule(66),
Gallery(67),
HomeSceneJump(68),
HideAndSeek(69);
public int getValue() {
return value;
}
public static EnterReason getTypeByValue(int value) {
return map.getOrDefault(value, None);
}
public static EnterReason getTypeByName(String name) {
return stringMap.getOrDefault(name, None);
}
private static final Int2ObjectMap<EnterReason> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, EnterReason> stringMap = new HashMap<>();
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private final int value;
EnterReason(int value) {
this.value = value;
}
public static EnterReason getTypeByValue(int value) {
return map.getOrDefault(value, None);
}
public static EnterReason getTypeByName(String name) {
return stringMap.getOrDefault(name, None);
}
public int getValue() {
return value;
}
}

View File

@@ -1,22 +1,22 @@
package emu.grasscutter.game.props;
public enum EntityIdType {
AVATAR (0x01),
MONSTER (0x02),
NPC (0x03),
GADGET (0x04),
REGION (0x05),
WEAPON (0x06),
TEAM (0x09),
MPLEVEL (0x0b);
AVATAR(0x01),
MONSTER(0x02),
NPC(0x03),
GADGET(0x04),
REGION(0x05),
WEAPON(0x06),
TEAM(0x09),
MPLEVEL(0x0b);
private final int id;
private final int id;
private EntityIdType(int id) {
this.id = id;
}
EntityIdType(int id) {
this.id = id;
}
public int getId() {
return id;
}
public int getId() {
return id;
}
}

View File

@@ -1,101 +1,100 @@
package emu.grasscutter.game.props;
import emu.grasscutter.scripts.constants.IntValueEnum;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public enum EntityType implements IntValueEnum {
None(0),
Avatar(1),
Monster(2),
Bullet(3),
AttackPhyisicalUnit(4),
AOE(5),
Camera(6),
EnviroArea(7),
Equip(8),
MonsterEquip(9),
Grass(10),
Level(11),
NPC(12),
TransPointFirst(13),
TransPointFirstGadget(14),
TransPointSecond(15),
TransPointSecondGadget(16),
DropItem(17),
Field(18),
Gadget(19),
Water(20),
GatherPoint(21),
GatherObject(22),
AirflowField(23),
SpeedupField(24),
Gear(25),
Chest(26),
EnergyBall(27),
ElemCrystal(28),
Timeline(29),
Worktop(30),
Team(31),
Platform(32),
AmberWind(33),
EnvAnimal(34),
SealGadget(35),
Tree(36),
Bush(37),
QuestGadget(38),
Lightning(39),
RewardPoint(40),
RewardStatue(41),
MPLevel(42),
WindSeed(43),
MpPlayRewardPoint(44),
ViewPoint(45),
RemoteAvatar(46),
GeneralRewardPoint(47),
PlayTeam(48),
OfferingGadget(49),
EyePoint(50),
MiracleRing(51),
Foundation(52),
WidgetGadget(53),
Vehicle(54),
SubEquip(55),
FishRod(56),
CustomTile(57),
FishPool(58),
CustomGadget(59),
BlackMud(60),
RoguelikeOperatorGadget(61),
NightCrowGadget(62),
Projector(63),
Screen(64),
EchoShell(65),
UIInteractGadget(66),
PlaceHolder(99);
public enum EntityType {
None (0),
Avatar (1),
Monster (2),
Bullet (3),
AttackPhyisicalUnit (4),
AOE (5),
Camera (6),
EnviroArea (7),
Equip (8),
MonsterEquip (9),
Grass (10),
Level (11),
NPC (12),
TransPointFirst (13),
TransPointFirstGadget (14),
TransPointSecond (15),
TransPointSecondGadget (16),
DropItem (17),
Field (18),
Gadget (19),
Water (20),
GatherPoint (21),
GatherObject (22),
AirflowField (23),
SpeedupField (24),
Gear (25),
Chest (26),
EnergyBall (27),
ElemCrystal (28),
Timeline (29),
Worktop (30),
Team (31),
Platform (32),
AmberWind (33),
EnvAnimal (34),
SealGadget (35),
Tree (36),
Bush (37),
QuestGadget (38),
Lightning (39),
RewardPoint (40),
RewardStatue (41),
MPLevel (42),
WindSeed (43),
MpPlayRewardPoint (44),
ViewPoint (45),
RemoteAvatar (46),
GeneralRewardPoint (47),
PlayTeam (48),
OfferingGadget (49),
EyePoint (50),
MiracleRing (51),
Foundation (52),
WidgetGadget (53),
Vehicle (54),
SubEquip (55),
FishRod (56),
CustomTile (57),
FishPool (58),
CustomGadget (59),
BlackMud (60),
RoguelikeOperatorGadget (61),
NightCrowGadget (62),
Projector (63),
Screen (64),
EchoShell (65),
UIInteractGadget (66),
PlaceHolder (99);
private final int value;
private static final Int2ObjectMap<EntityType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, EntityType> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private EntityType(int value) {
private final int value;
EntityType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static EntityType getTypeByValue(int value) {
return map.getOrDefault(value, None);
}
@@ -103,4 +102,8 @@ public enum EntityType {
public static EntityType getTypeByName(String name) {
return stringMap.getOrDefault(name, None);
}
public int getValue() {
return value;
}
}

View File

@@ -1,42 +1,44 @@
package emu.grasscutter.game.props;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public enum FetterState {
NONE(0),
NOT_OPEN(1),
OPEN(1),
FINISH(3);
private final int value;
private static final Int2ObjectMap<FetterState> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, FetterState> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private FetterState(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static FetterState getTypeByValue(int value) {
return map.getOrDefault(value, NONE);
}
public static FetterState getTypeByName(String name) {
return stringMap.getOrDefault(name, NONE);
}
}
package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
public enum FetterState {
NONE(0),
NOT_OPEN(1),
OPEN(1),
FINISH(3);
private static final Int2ObjectMap<FetterState> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, FetterState> stringMap = new HashMap<>();
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private final int value;
FetterState(int value) {
this.value = value;
}
public static FetterState getTypeByValue(int value) {
return map.getOrDefault(value, NONE);
}
public static FetterState getTypeByName(String name) {
return stringMap.getOrDefault(name, NONE);
}
public int getValue() {
return value;
}
}

View File

@@ -1,18 +1,12 @@
package emu.grasscutter.game.props;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import static java.util.Map.entry;
import java.util.Arrays;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Stream;
import lombok.Getter;
public enum FightProperty {
@@ -113,27 +107,112 @@ public enum FightProperty {
FIGHT_PROP_NONEXTRA_SHIELD_COST_MINUS_RATIO(3023),
FIGHT_PROP_NONEXTRA_PHYSICAL_ADD_HURT(3024);
private final int id;
public static final int[] fightProps =
new int[] {
1, 4, 7, 20, 21, 22, 23, 26, 27, 28, 29, 30, 40, 41, 42, 43, 44, 45, 46, 50, 51, 52, 53, 54,
55, 56, 2000, 2001, 2002, 2003, 1010
};
private static final Int2ObjectMap<FightProperty> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, FightProperty> stringMap = new HashMap<>();
public static final int[] fightProps = new int[] {1, 4, 7, 20, 21, 22, 23, 26, 27, 28, 29, 30, 40, 41, 42, 43, 44, 45, 46, 50, 51, 52, 53, 54, 55, 56, 2000, 2001, 2002, 2003, 1010};
// This was originally for relic properties so some names might not be applicable for e.g.
// setstats
private static final Map<String, FightProperty> shortNameMap =
Map.ofEntries(
// Normal relic stats
entry("hp", FIGHT_PROP_HP),
entry("atk", FIGHT_PROP_ATTACK),
entry("def", FIGHT_PROP_DEFENSE),
entry("hp%", FIGHT_PROP_HP_PERCENT),
entry("atk%", FIGHT_PROP_ATTACK_PERCENT),
entry("def%", FIGHT_PROP_DEFENSE_PERCENT),
entry("em", FIGHT_PROP_ELEMENT_MASTERY),
entry("er", FIGHT_PROP_CHARGE_EFFICIENCY),
entry("hb", FIGHT_PROP_HEAL_ADD),
entry("heal", FIGHT_PROP_HEAL_ADD),
entry("cd", FIGHT_PROP_CRITICAL_HURT),
entry("cdmg", FIGHT_PROP_CRITICAL_HURT),
entry("cr", FIGHT_PROP_CRITICAL),
entry("crate", FIGHT_PROP_CRITICAL),
entry("phys%", FIGHT_PROP_PHYSICAL_ADD_HURT),
entry("dendro%", FIGHT_PROP_GRASS_ADD_HURT),
entry("geo%", FIGHT_PROP_ROCK_ADD_HURT),
entry("anemo%", FIGHT_PROP_WIND_ADD_HURT),
entry("hydro%", FIGHT_PROP_WATER_ADD_HURT),
entry("cryo%", FIGHT_PROP_ICE_ADD_HURT),
entry("electro%", FIGHT_PROP_ELEC_ADD_HURT),
entry("pyro%", FIGHT_PROP_FIRE_ADD_HURT),
// Other stats
entry("maxhp", FIGHT_PROP_MAX_HP),
entry("dmg", FIGHT_PROP_ADD_HURT), // This seems to get reset after attacks
entry("cdr", FIGHT_PROP_SKILL_CD_MINUS_RATIO),
entry("heali", FIGHT_PROP_HEALED_ADD),
entry("shield", FIGHT_PROP_SHIELD_COST_MINUS_RATIO),
entry("defi", FIGHT_PROP_DEFENCE_IGNORE_RATIO),
entry("resall", FIGHT_PROP_SUB_HURT), // This seems to get reset after attacks
entry("resanemo", FIGHT_PROP_WIND_SUB_HURT),
entry("rescryo", FIGHT_PROP_ICE_SUB_HURT),
entry("resdendro", FIGHT_PROP_GRASS_SUB_HURT),
entry("reselectro", FIGHT_PROP_ELEC_SUB_HURT),
entry("resgeo", FIGHT_PROP_ROCK_SUB_HURT),
entry("reshydro", FIGHT_PROP_WATER_SUB_HURT),
entry("respyro", FIGHT_PROP_FIRE_SUB_HURT),
entry("resphys", FIGHT_PROP_PHYSICAL_SUB_HURT));
private static final List<FightProperty> flatProps =
Arrays.asList(
FIGHT_PROP_BASE_HP,
FIGHT_PROP_HP,
FIGHT_PROP_BASE_ATTACK,
FIGHT_PROP_ATTACK,
FIGHT_PROP_BASE_DEFENSE,
FIGHT_PROP_DEFENSE,
FIGHT_PROP_HEALED_ADD,
FIGHT_PROP_CUR_FIRE_ENERGY,
FIGHT_PROP_CUR_ELEC_ENERGY,
FIGHT_PROP_CUR_WATER_ENERGY,
FIGHT_PROP_CUR_GRASS_ENERGY,
FIGHT_PROP_CUR_WIND_ENERGY,
FIGHT_PROP_CUR_ICE_ENERGY,
FIGHT_PROP_CUR_ROCK_ENERGY,
FIGHT_PROP_CUR_HP,
FIGHT_PROP_MAX_HP,
FIGHT_PROP_CUR_ATTACK,
FIGHT_PROP_CUR_DEFENSE);
private static final Map<FightProperty, CompoundProperty> compoundProperties =
Map.ofEntries(
entry(
FIGHT_PROP_MAX_HP,
new CompoundProperty(
FIGHT_PROP_MAX_HP, FIGHT_PROP_BASE_HP, FIGHT_PROP_HP_PERCENT, FIGHT_PROP_HP)),
entry(
FIGHT_PROP_CUR_ATTACK,
new CompoundProperty(
FIGHT_PROP_CUR_ATTACK,
FIGHT_PROP_BASE_ATTACK,
FIGHT_PROP_ATTACK_PERCENT,
FIGHT_PROP_ATTACK)),
entry(
FIGHT_PROP_CUR_DEFENSE,
new CompoundProperty(
FIGHT_PROP_CUR_DEFENSE,
FIGHT_PROP_BASE_DEFENSE,
FIGHT_PROP_DEFENSE_PERCENT,
FIGHT_PROP_DEFENSE)));
static {
Stream.of(values()).forEach(e -> {
map.put(e.getId(), e);
stringMap.put(e.name(), e);
});
Stream.of(values())
.forEach(
e -> {
map.put(e.getId(), e);
stringMap.put(e.name(), e);
});
}
private FightProperty(int id) {
private final int id;
FightProperty(int id) {
this.id = id;
}
public int getId() {
return id;
}
public static FightProperty getPropById(int value) {
return map.getOrDefault(value, FIGHT_PROP_NONE);
}
@@ -150,76 +229,6 @@ public enum FightProperty {
return shortNameMap.keySet();
}
// This was originally for relic properties so some names might not be applicable for e.g. setstats
private static final Map<String, FightProperty> shortNameMap = Map.ofEntries(
// Normal relic stats
entry("hp", FIGHT_PROP_HP),
entry("atk", FIGHT_PROP_ATTACK),
entry("def", FIGHT_PROP_DEFENSE),
entry("hp%", FIGHT_PROP_HP_PERCENT),
entry("atk%", FIGHT_PROP_ATTACK_PERCENT),
entry("def%", FIGHT_PROP_DEFENSE_PERCENT),
entry("em", FIGHT_PROP_ELEMENT_MASTERY),
entry("er", FIGHT_PROP_CHARGE_EFFICIENCY),
entry("hb", FIGHT_PROP_HEAL_ADD),
entry("heal", FIGHT_PROP_HEAL_ADD),
entry("cd", FIGHT_PROP_CRITICAL_HURT),
entry("cdmg", FIGHT_PROP_CRITICAL_HURT),
entry("cr", FIGHT_PROP_CRITICAL),
entry("crate", FIGHT_PROP_CRITICAL),
entry("phys%", FIGHT_PROP_PHYSICAL_ADD_HURT),
entry("dendro%", FIGHT_PROP_GRASS_ADD_HURT),
entry("geo%", FIGHT_PROP_ROCK_ADD_HURT),
entry("anemo%", FIGHT_PROP_WIND_ADD_HURT),
entry("hydro%", FIGHT_PROP_WATER_ADD_HURT),
entry("cryo%", FIGHT_PROP_ICE_ADD_HURT),
entry("electro%", FIGHT_PROP_ELEC_ADD_HURT),
entry("pyro%", FIGHT_PROP_FIRE_ADD_HURT),
// Other stats
entry("maxhp", FIGHT_PROP_MAX_HP),
entry("dmg", FIGHT_PROP_ADD_HURT), // This seems to get reset after attacks
entry("cdr", FIGHT_PROP_SKILL_CD_MINUS_RATIO),
entry("heali", FIGHT_PROP_HEALED_ADD),
entry("shield", FIGHT_PROP_SHIELD_COST_MINUS_RATIO),
entry("defi", FIGHT_PROP_DEFENCE_IGNORE_RATIO),
entry("resall", FIGHT_PROP_SUB_HURT), // This seems to get reset after attacks
entry("resanemo", FIGHT_PROP_WIND_SUB_HURT),
entry("rescryo", FIGHT_PROP_ICE_SUB_HURT),
entry("resdendro", FIGHT_PROP_GRASS_SUB_HURT),
entry("reselectro", FIGHT_PROP_ELEC_SUB_HURT),
entry("resgeo", FIGHT_PROP_ROCK_SUB_HURT),
entry("reshydro", FIGHT_PROP_WATER_SUB_HURT),
entry("respyro", FIGHT_PROP_FIRE_SUB_HURT),
entry("resphys", FIGHT_PROP_PHYSICAL_SUB_HURT)
);
private static final List<FightProperty> flatProps = Arrays.asList(
FIGHT_PROP_BASE_HP, FIGHT_PROP_HP, FIGHT_PROP_BASE_ATTACK, FIGHT_PROP_ATTACK, FIGHT_PROP_BASE_DEFENSE,
FIGHT_PROP_DEFENSE, FIGHT_PROP_HEALED_ADD, FIGHT_PROP_CUR_FIRE_ENERGY, FIGHT_PROP_CUR_ELEC_ENERGY,
FIGHT_PROP_CUR_WATER_ENERGY, FIGHT_PROP_CUR_GRASS_ENERGY, FIGHT_PROP_CUR_WIND_ENERGY, FIGHT_PROP_CUR_ICE_ENERGY,
FIGHT_PROP_CUR_ROCK_ENERGY, FIGHT_PROP_CUR_HP, FIGHT_PROP_MAX_HP, FIGHT_PROP_CUR_ATTACK, FIGHT_PROP_CUR_DEFENSE);
@Getter
public static class CompoundProperty {
private FightProperty result;
private FightProperty base;
private FightProperty percent;
private FightProperty flat;
public CompoundProperty(FightProperty result, FightProperty base, FightProperty percent, FightProperty flat) {
this.result = result;
this.base = base;
this.percent = percent;
this.flat = flat;
}
}
private static Map<FightProperty, CompoundProperty> compoundProperties = Map.ofEntries(
entry(FIGHT_PROP_MAX_HP, new CompoundProperty(FIGHT_PROP_MAX_HP, FIGHT_PROP_BASE_HP, FIGHT_PROP_HP_PERCENT, FIGHT_PROP_HP)),
entry(FIGHT_PROP_CUR_ATTACK, new CompoundProperty(FIGHT_PROP_CUR_ATTACK, FIGHT_PROP_BASE_ATTACK, FIGHT_PROP_ATTACK_PERCENT, FIGHT_PROP_ATTACK)),
entry(FIGHT_PROP_CUR_DEFENSE, new CompoundProperty(FIGHT_PROP_CUR_DEFENSE, FIGHT_PROP_BASE_DEFENSE, FIGHT_PROP_DEFENSE_PERCENT, FIGHT_PROP_DEFENSE))
);
public static CompoundProperty getCompoundProperty(FightProperty result) {
return compoundProperties.get(result);
}
@@ -231,4 +240,24 @@ public enum FightProperty {
public static boolean isPercentage(FightProperty prop) {
return !flatProps.contains(prop);
}
public int getId() {
return id;
}
@Getter
public static class CompoundProperty {
private final FightProperty result;
private final FightProperty base;
private final FightProperty percent;
private final FightProperty flat;
public CompoundProperty(
FightProperty result, FightProperty base, FightProperty percent, FightProperty flat) {
this.result = result;
this.base = base;
this.percent = percent;
this.flat = flat;
}
}
}

View File

@@ -1,100 +1,105 @@
package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public enum GrowCurve {
GROW_CURVE_NONE(0),
GROW_CURVE_HP(1),
GROW_CURVE_ATTACK(2),
GROW_CURVE_STAMINA(3),
GROW_CURVE_STRIKE(4),
GROW_CURVE_ANTI_STRIKE(5),
GROW_CURVE_ANTI_STRIKE1(6),
GROW_CURVE_ANTI_STRIKE2(7),
GROW_CURVE_ANTI_STRIKE3(8),
GROW_CURVE_STRIKE_HURT(9),
GROW_CURVE_ELEMENT(10),
GROW_CURVE_KILL_EXP(11),
GROW_CURVE_DEFENSE(12),
GROW_CURVE_ATTACK_BOMB(13),
GROW_CURVE_HP_LITTLEMONSTER(14),
GROW_CURVE_ELEMENT_MASTERY(15),
GROW_CURVE_PROGRESSION(16),
GROW_CURVE_DEFENDING(17),
GROW_CURVE_MHP(18),
GROW_CURVE_MATK(19),
GROW_CURVE_TOWERATK(20),
GROW_CURVE_HP_S5(21),
GROW_CURVE_HP_S4(22),
GROW_CURVE_HP_2(23),
GROW_CURVE_ATTACK_S5(31),
GROW_CURVE_ATTACK_S4(32),
GROW_CURVE_ATTACK_S3(33),
GROW_CURVE_STRIKE_S5(34),
GROW_CURVE_DEFENSE_S5(41),
GROW_CURVE_DEFENSE_S4(42),
GROW_CURVE_ATTACK_101(1101),
GROW_CURVE_ATTACK_102(1102),
GROW_CURVE_ATTACK_103(1103),
GROW_CURVE_ATTACK_104(1104),
GROW_CURVE_ATTACK_105(1105),
GROW_CURVE_ATTACK_201(1201),
GROW_CURVE_ATTACK_202(1202),
GROW_CURVE_ATTACK_203(1203),
GROW_CURVE_ATTACK_204(1204),
GROW_CURVE_ATTACK_205(1205),
GROW_CURVE_ATTACK_301(1301),
GROW_CURVE_ATTACK_302(1302),
GROW_CURVE_ATTACK_303(1303),
GROW_CURVE_ATTACK_304(1304),
GROW_CURVE_ATTACK_305(1305),
GROW_CURVE_CRITICAL_101(2101),
GROW_CURVE_CRITICAL_102(2102),
GROW_CURVE_CRITICAL_103(2103),
GROW_CURVE_CRITICAL_104(2104),
GROW_CURVE_CRITICAL_105(2105),
GROW_CURVE_CRITICAL_201(2201),
GROW_CURVE_CRITICAL_202(2202),
GROW_CURVE_CRITICAL_203(2203),
GROW_CURVE_CRITICAL_204(2204),
GROW_CURVE_CRITICAL_205(2205),
GROW_CURVE_CRITICAL_301(2301),
GROW_CURVE_CRITICAL_302(2302),
GROW_CURVE_CRITICAL_303(2303),
GROW_CURVE_CRITICAL_304(2304),
GROW_CURVE_CRITICAL_305(2305);
private final int id;
private static final Int2ObjectMap<GrowCurve> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, GrowCurve> stringMap = new HashMap<>();
public static final int[] fightProps = new int[] {1, 4, 7, 20, 21, 22, 23, 26, 27, 28, 29, 30, 40, 41, 42, 43, 44, 45, 46, 50, 51, 52, 53, 54, 55, 56, 2000, 2001, 2002, 2003, 1010};
static {
Stream.of(values()).forEach(e -> {
map.put(e.getId(), e);
stringMap.put(e.name(), e);
});
}
private GrowCurve(int id) {
this.id = id;
}
GROW_CURVE_NONE(0),
GROW_CURVE_HP(1),
GROW_CURVE_ATTACK(2),
GROW_CURVE_STAMINA(3),
GROW_CURVE_STRIKE(4),
GROW_CURVE_ANTI_STRIKE(5),
GROW_CURVE_ANTI_STRIKE1(6),
GROW_CURVE_ANTI_STRIKE2(7),
GROW_CURVE_ANTI_STRIKE3(8),
GROW_CURVE_STRIKE_HURT(9),
GROW_CURVE_ELEMENT(10),
GROW_CURVE_KILL_EXP(11),
GROW_CURVE_DEFENSE(12),
GROW_CURVE_ATTACK_BOMB(13),
GROW_CURVE_HP_LITTLEMONSTER(14),
GROW_CURVE_ELEMENT_MASTERY(15),
GROW_CURVE_PROGRESSION(16),
GROW_CURVE_DEFENDING(17),
GROW_CURVE_MHP(18),
GROW_CURVE_MATK(19),
GROW_CURVE_TOWERATK(20),
GROW_CURVE_HP_S5(21),
GROW_CURVE_HP_S4(22),
GROW_CURVE_HP_2(23),
GROW_CURVE_ATTACK_S5(31),
GROW_CURVE_ATTACK_S4(32),
GROW_CURVE_ATTACK_S3(33),
GROW_CURVE_STRIKE_S5(34),
GROW_CURVE_DEFENSE_S5(41),
GROW_CURVE_DEFENSE_S4(42),
GROW_CURVE_ATTACK_101(1101),
GROW_CURVE_ATTACK_102(1102),
GROW_CURVE_ATTACK_103(1103),
GROW_CURVE_ATTACK_104(1104),
GROW_CURVE_ATTACK_105(1105),
GROW_CURVE_ATTACK_201(1201),
GROW_CURVE_ATTACK_202(1202),
GROW_CURVE_ATTACK_203(1203),
GROW_CURVE_ATTACK_204(1204),
GROW_CURVE_ATTACK_205(1205),
GROW_CURVE_ATTACK_301(1301),
GROW_CURVE_ATTACK_302(1302),
GROW_CURVE_ATTACK_303(1303),
GROW_CURVE_ATTACK_304(1304),
GROW_CURVE_ATTACK_305(1305),
GROW_CURVE_CRITICAL_101(2101),
GROW_CURVE_CRITICAL_102(2102),
GROW_CURVE_CRITICAL_103(2103),
GROW_CURVE_CRITICAL_104(2104),
GROW_CURVE_CRITICAL_105(2105),
GROW_CURVE_CRITICAL_201(2201),
GROW_CURVE_CRITICAL_202(2202),
GROW_CURVE_CRITICAL_203(2203),
GROW_CURVE_CRITICAL_204(2204),
GROW_CURVE_CRITICAL_205(2205),
GROW_CURVE_CRITICAL_301(2301),
GROW_CURVE_CRITICAL_302(2302),
GROW_CURVE_CRITICAL_303(2303),
GROW_CURVE_CRITICAL_304(2304),
GROW_CURVE_CRITICAL_305(2305);
public int getId() {
return id;
}
public static GrowCurve getPropById(int value) {
return map.getOrDefault(value, GROW_CURVE_NONE);
}
public static GrowCurve getPropByName(String name) {
return stringMap.getOrDefault(name, GROW_CURVE_NONE);
}
public static final int[] fightProps =
new int[] {
1, 4, 7, 20, 21, 22, 23, 26, 27, 28, 29, 30, 40, 41, 42, 43, 44, 45, 46, 50, 51, 52, 53, 54,
55, 56, 2000, 2001, 2002, 2003, 1010
};
private static final Int2ObjectMap<GrowCurve> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, GrowCurve> stringMap = new HashMap<>();
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getId(), e);
stringMap.put(e.name(), e);
});
}
private final int id;
GrowCurve(int id) {
this.id = id;
}
public static GrowCurve getPropById(int value) {
return map.getOrDefault(value, GROW_CURVE_NONE);
}
public static GrowCurve getPropByName(String name) {
return stringMap.getOrDefault(name, GROW_CURVE_NONE);
}
public int getId() {
return id;
}
}

View File

@@ -3,15 +3,15 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseAcceptQuest extends ItemUseInt {
public ItemUseAcceptQuest(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ACCEPT_QUEST;
}
public ItemUseAcceptQuest(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
return (params.player.getQuestManager().addQuest(this.i) != null);

View File

@@ -4,67 +4,72 @@ import emu.grasscutter.data.common.ItemUseData;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseAction {
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_NONE;
}
public static ItemUseAction fromItemUseData(ItemUseData data) {
var useParam = data.getUseParam();
return switch (data.getUseOp()) {
case ITEM_USE_NONE -> null;
// Uprade materials - no direct usage
// Uprade materials - no direct usage
case ITEM_USE_ADD_EXP -> new ItemUseAddExp(useParam);
case ITEM_USE_ADD_RELIQUARY_EXP -> new ItemUseAddReliquaryExp(useParam);
case ITEM_USE_ADD_WEAPON_EXP -> new ItemUseAddWeaponExp(useParam);
// Energy pickups
// Energy pickups
case ITEM_USE_ADD_ALL_ENERGY -> new ItemUseAddAllEnergy(useParam);
case ITEM_USE_ADD_ELEM_ENERGY -> new ItemUseAddElemEnergy(useParam);
// Give items
// Give items
case ITEM_USE_ADD_ITEM -> new ItemUseAddItem(useParam);
case ITEM_USE_GAIN_AVATAR -> new ItemUseGainAvatar(useParam);
case ITEM_USE_GAIN_COSTUME -> new ItemUseGainCostume(useParam); // TODO - real success/fail
case ITEM_USE_GAIN_FLYCLOAK -> new ItemUseGainFlycloak(useParam); // TODO - real success/fail
case ITEM_USE_GAIN_COSTUME -> new ItemUseGainCostume(useParam); // TODO - real success/fail
case ITEM_USE_GAIN_FLYCLOAK -> new ItemUseGainFlycloak(useParam); // TODO - real success/fail
case ITEM_USE_GAIN_NAME_CARD -> new ItemUseGainNameCard(useParam);
case ITEM_USE_CHEST_SELECT_ITEM -> new ItemUseChestSelectItem(useParam);
case ITEM_USE_ADD_SELECT_ITEM -> new ItemUseAddSelectItem(useParam);
case ITEM_USE_GRANT_SELECT_REWARD -> new ItemUseGrantSelectReward(useParam);
case ITEM_USE_COMBINE_ITEM -> new ItemUseCombineItem(useParam);
case ITEM_USE_OPEN_RANDOM_CHEST -> new ItemUseOpenRandomChest(useParam);
// Food effects
case ITEM_USE_RELIVE_AVATAR -> new ItemUseReliveAvatar(useParam); // First action for revival food. Should we worry about race conditions in parallel streams?
// Food effects
case ITEM_USE_RELIVE_AVATAR -> new ItemUseReliveAvatar(
useParam); // First action for revival food. Should we worry about race conditions in
// parallel streams?
case ITEM_USE_ADD_CUR_HP -> new ItemUseAddCurHp(useParam);
case ITEM_USE_ADD_CUR_STAMINA -> new ItemUseAddCurStamina(useParam);
case ITEM_USE_ADD_SERVER_BUFF -> new ItemUseAddServerBuff(useParam);
case ITEM_USE_MAKE_GADGET -> new ItemUseMakeGadget(useParam);
// Unlock recipes - TODO: allow scheduling packets for after recipe is removed
// Unlock recipes - TODO: allow scheduling packets for after recipe is removed
case ITEM_USE_UNLOCK_COMBINE -> new ItemUseUnlockCombine(useParam);
case ITEM_USE_UNLOCK_CODEX -> new ItemUseUnlockCodex(useParam); // TODO: No backend for this yet
case ITEM_USE_UNLOCK_CODEX -> new ItemUseUnlockCodex(
useParam); // TODO: No backend for this yet
case ITEM_USE_UNLOCK_COOK_RECIPE -> new ItemUseUnlockCookRecipe(useParam);
case ITEM_USE_UNLOCK_FORGE -> new ItemUseUnlockForge(useParam);
case ITEM_USE_UNLOCK_FURNITURE_FORMULA -> new ItemUseUnlockFurnitureFormula(useParam);
case ITEM_USE_UNLOCK_FURNITURE_SUITE -> new ItemUseUnlockFurnitureSuite(useParam);
case ITEM_USE_UNLOCK_HOME_MODULE -> new ItemUseUnlockHomeModule(useParam); // No backend for this yet
case ITEM_USE_UNLOCK_HOME_MODULE -> new ItemUseUnlockHomeModule(
useParam); // No backend for this yet
case ITEM_USE_UNLOCK_HOME_BGM -> new ItemUseUnlockHomeBgm(useParam);
// Account things
// Account things
case ITEM_USE_ACCEPT_QUEST -> new ItemUseAcceptQuest(useParam);
case ITEM_USE_GAIN_CARD_PRODUCT -> new ItemUseGainCardProduct(useParam);
case ITEM_USE_UNLOCK_PAID_BATTLE_PASS_NORMAL -> new ItemUseUnlockPaidBattlePassNormal(useParam); // TODO: add paid BP
case ITEM_USE_UNLOCK_PAID_BATTLE_PASS_NORMAL -> new ItemUseUnlockPaidBattlePassNormal(
useParam); // TODO: add paid BP
// Unused in current resources
// Unused in current resources
case ITEM_USE_DEL_SERVER_BUFF -> null;
case ITEM_USE_ADD_BIG_TALENT_POINT -> null;
case ITEM_USE_GAIN_RESIN_CARD_PRODUCT -> null;
case ITEM_USE_TRIGGER_ABILITY -> null;
case ITEM_USE_ADD_TREASURE_MAP_BONUS_REGION_FRAGMENT -> null;
// Used in current resources but no point yet
case ITEM_USE_ADD_PERSIST_STAMINA -> null; // [int amount] one Test item
case ITEM_USE_ADD_TEMPORARY_STAMINA -> null; // [int amount] one Test item
case ITEM_USE_ADD_DUNGEON_COND_TIME -> null; // [int 1, int 15 or 20] - minigame shards
case ITEM_USE_ADD_CHANNELLER_SLAB_BUFF -> null; // [int] minigame buffs
case ITEM_USE_ADD_REGIONAL_PLAY_VAR -> null; // [String, int] - coral butterfly effect
// Used in current resources but no point yet
case ITEM_USE_ADD_PERSIST_STAMINA -> null; // [int amount] one Test item
case ITEM_USE_ADD_TEMPORARY_STAMINA -> null; // [int amount] one Test item
case ITEM_USE_ADD_DUNGEON_COND_TIME -> null; // [int 1, int 15 or 20] - minigame shards
case ITEM_USE_ADD_CHANNELLER_SLAB_BUFF -> null; // [int] minigame buffs
case ITEM_USE_ADD_REGIONAL_PLAY_VAR -> null; // [String, int] - coral butterfly effect
};
}
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_NONE;
}
public boolean useItem(UseItemParams params) {
// An item must return true on at least one of its actions to count as successfully used.
// If all of the actions return false, the item will not be consumed from inventory.

View File

@@ -6,15 +6,16 @@ import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseAddAllEnergy extends ItemUseAddEnergy {
private float energy = 0f;
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_ALL_ENERGY;
}
public ItemUseAddAllEnergy(String[] useParam) {
try {
this.energy = Float.parseFloat(useParam[0]);
} catch (Exception ignored) {}
} catch (Exception ignored) {
}
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_ALL_ENERGY;
}
public float getAddEnergy(ElementType avatarElement) {

View File

@@ -3,18 +3,18 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseAddCurHp extends ItemUseInt {
private String icon;
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_CUR_HP;
}
private final String icon;
public ItemUseAddCurHp(String[] useParam) {
super(useParam);
this.icon = useParam[1];
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_CUR_HP;
}
@Override
public boolean useItem(UseItemParams params) {
return (params.targetAvatar.getAsEntity().heal(params.count * this.i) > 0.01);

View File

@@ -3,15 +3,15 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseAddCurStamina extends ItemUseInt {
public ItemUseAddCurStamina(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_CUR_STAMINA;
}
public ItemUseAddCurStamina(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
return params.player.getStaminaManager().addCurrentStamina(this.i);

View File

@@ -8,21 +8,24 @@ public class ItemUseAddElemEnergy extends ItemUseAddEnergy {
private float elemEnergy = 0f;
private float otherEnergy = 0f;
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_ELEM_ENERGY;
}
public ItemUseAddElemEnergy(String[] useParam) {
try {
this.element = ElementType.getTypeByValue(Integer.parseInt(useParam[0]));
} catch (Exception ignored) {}
} catch (Exception ignored) {
}
try {
this.elemEnergy = Float.parseFloat(useParam[1]);
} catch (Exception ignored) {}
} catch (Exception ignored) {
}
try {
this.otherEnergy = Float.parseFloat(useParam[2]);
} catch (Exception ignored) {}
} catch (Exception ignored) {
}
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_ELEM_ENERGY;
}
public float getAddEnergy(ElementType avatarElement) {

View File

@@ -1,6 +1,6 @@
package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.data.excels.AvatarSkillDepotData;
import emu.grasscutter.data.excels.avatar.AvatarSkillDepotData;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.props.ElementType;
import emu.grasscutter.net.proto.PropChangeReasonOuterClass.PropChangeReason;
@@ -21,40 +21,41 @@ public abstract class ItemUseAddEnergy extends ItemUseAction {
return switch (params.itemUseTarget) {
case ITEM_USE_TARGET_CUR_AVATAR -> {
this.addEnergy(teamManager.getCurrentAvatarEntity().getAvatar(), params.count);
yield true; // Always consume elem balls
yield true; // Always consume elem balls
}
case ITEM_USE_TARGET_CUR_TEAM -> {
var activeTeam = teamManager.getActiveTeam();
// On-field vs off-field multiplier.
// The on-field character gets full amount, off-field characters get less depending on the team size.
final float offFieldRatio = switch (activeTeam.size()) {
case 2 -> 0.8f;
case 3 -> 0.7f;
default -> 0.6f;
};
// The on-field character gets full amount, off-field characters get less depending on the
// team size.
final float offFieldRatio =
switch (activeTeam.size()) {
case 2 -> 0.8f;
case 3 -> 0.7f;
default -> 0.6f;
};
final int currentCharacterIndex = teamManager.getCurrentCharacterIndex();
// Add energy to every team member.
for (int i = 0; i < activeTeam.size(); i++) {
var avatar = activeTeam.get(i).getAvatar();
if (i == currentCharacterIndex)
this.addEnergy(avatar, params.count);
else
this.addEnergy(avatar, params.count * offFieldRatio);
if (i == currentCharacterIndex) this.addEnergy(avatar, params.count);
else this.addEnergy(avatar, params.count * offFieldRatio);
}
yield true; // Always consume elem balls
yield true; // Always consume elem balls
}
case ITEM_USE_TARGET_SPECIFY_AVATAR, ITEM_USE_TARGET_SPECIFY_ALIVE_AVATAR, ITEM_USE_TARGET_SPECIFY_DEAD_AVATAR ->
this.addEnergy(params.targetAvatar, params.count); // Targeted items might care about this
case ITEM_USE_TARGET_SPECIFY_AVATAR,
ITEM_USE_TARGET_SPECIFY_ALIVE_AVATAR,
ITEM_USE_TARGET_SPECIFY_DEAD_AVATAR -> this.addEnergy(
params.targetAvatar, params.count); // Targeted items might care about this
case ITEM_USE_TARGET_NONE -> false;
};
}
private boolean addEnergy(Avatar avatar, float multiplier) {
float energy = this.getAddEnergy(avatar.getSkillDepot()) * multiplier;
if (energy < 0.01f)
return false;
if (energy < 0.01f) return false;
avatar.getAsEntity().addEnergy(energy, PropChangeReason.PROP_CHANGE_REASON_ENERGY_BALL);
return true;
}

View File

@@ -3,15 +3,15 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseAddExp extends ItemUseInt {
public ItemUseAddExp(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_EXP;
}
public ItemUseAddExp(String[] useParam) {
super(useParam);
}
public int getExp() {
return this.i;
}

View File

@@ -15,11 +15,15 @@ public class ItemUseAddItem extends ItemUseInt {
super(useParam);
try {
this.count = Integer.parseInt(useParam[1]);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {}
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {
}
}
@Override
public boolean useItem(UseItemParams params) {
return params.player.getInventory().addItem(this.i, this.count * params.count, ActionReason.PlayerUseItem);
return params
.player
.getInventory()
.addItem(this.i, this.count * params.count, ActionReason.PlayerUseItem);
}
}

View File

@@ -3,12 +3,12 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseAddReliquaryExp extends ItemUseAddExp {
public ItemUseAddReliquaryExp(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_RELIQUARY_EXP;
}
public ItemUseAddReliquaryExp(String[] useParam) {
super(useParam);
}
}

View File

@@ -3,11 +3,6 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseAddSelectItem extends ItemUseSelectItems {
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_SELECT_ITEM;
}
public ItemUseAddSelectItem(String[] useParam) {
String[] options = useParam[0].split(",");
this.optionItemIds = new int[options.length];
@@ -17,6 +12,11 @@ public class ItemUseAddSelectItem extends ItemUseSelectItems {
} catch (NumberFormatException ignored) {
this.optionItemIds[i] = INVALID;
}
};
}
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_SELECT_ITEM;
}
}

View File

@@ -5,16 +5,17 @@ import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseAddServerBuff extends ItemUseInt {
private int duration = 0;
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_SERVER_BUFF;
}
public ItemUseAddServerBuff(String[] useParam) {
super(useParam);
try {
this.duration = Integer.parseInt(useParam[1]);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {}
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {
}
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_SERVER_BUFF;
}
@Override

View File

@@ -3,12 +3,12 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseAddWeaponExp extends ItemUseAddExp {
public ItemUseAddWeaponExp(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_WEAPON_EXP;
}
public ItemUseAddWeaponExp(String[] useParam) {
super(useParam);
}
}

View File

@@ -3,12 +3,7 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseChestSelectItem extends ItemUseSelectItems {
private int[] optionItemCounts;
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_CHEST_SELECT_ITEM;
}
private final int[] optionItemCounts;
public ItemUseChestSelectItem(String[] useParam) {
String[] options = useParam[0].split(",");
@@ -26,12 +21,18 @@ public class ItemUseChestSelectItem extends ItemUseSelectItems {
} catch (NumberFormatException ignored) {
this.optionItemCounts[i] = INVALID;
}
};
}
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_CHEST_SELECT_ITEM;
}
@Override
protected int getItemCount(int index) {
if ((optionItemCounts == null) || (index < 0) || (index > optionItemCounts.length)) return INVALID;
if ((optionItemCounts == null) || (index < 0) || (index > optionItemCounts.length))
return INVALID;
return this.optionItemCounts[index];
}
}

View File

@@ -6,24 +6,26 @@ public class ItemUseCombineItem extends ItemUseInt {
private int resultId = 0;
private int resultCount = 1;
public ItemUseCombineItem(String[] useParam) {
super(useParam);
try {
this.resultId = Integer.parseInt(useParam[1]);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {
}
try {
this.resultCount = Integer.parseInt(useParam[2]);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {
}
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_COMBINE_ITEM;
}
public ItemUseCombineItem(String[] useParam) {
super(useParam);
try {
this.resultId = Integer.parseInt(useParam[1]);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {}
try {
this.resultCount = Integer.parseInt(useParam[2]);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {}
}
@Override
public boolean useItem(UseItemParams params) {
if (params.count != this.i) return false; // Wrong amount of fragments supplied!
if (params.count != this.i) return false; // Wrong amount of fragments supplied!
return params.player.getInventory().addItem(this.resultId, this.resultCount);
}
}

View File

@@ -1,33 +1,35 @@
package emu.grasscutter.game.props.ItemUseAction;
import java.util.Optional;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.props.ItemUseOp;
import emu.grasscutter.game.systems.InventorySystem;
import java.util.Optional;
public class ItemUseGainAvatar extends ItemUseInt {
private int level = 1;
private int constellation = 0;
public ItemUseGainAvatar(String[] useParam) {
super(useParam);
try {
this.level = Integer.parseInt(useParam[1]);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {
}
try {
this.constellation = Integer.parseInt(useParam[2]);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {
}
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_GAIN_AVATAR;
}
public ItemUseGainAvatar(String[] useParam) {
super(useParam);
try {
this.level = Integer.parseInt(useParam[1]);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {}
try {
this.constellation = Integer.parseInt(useParam[2]);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {}
}
@Override
public boolean useItem(UseItemParams params) {
int haveConstellation = InventorySystem.checkPlayerAvatarConstellationLevel(params.player, this.i);
int haveConstellation =
InventorySystem.checkPlayerAvatarConstellationLevel(params.player, this.i);
if (haveConstellation == -2 || haveConstellation >= 6) {
return false;
} else if (haveConstellation == -1) {
@@ -38,10 +40,11 @@ public class ItemUseGainAvatar extends ItemUseInt {
params.player.addAvatar(avatar);
return true;
} else {
int itemId = Optional.ofNullable(params.player.getAvatars().getAvatarById(this.i))
.map(Avatar::getSkillDepot)
.map(depot -> depot.getTalentCostItemId())
.orElse((this.i % 1000) + 100);
int itemId =
Optional.ofNullable(params.player.getAvatars().getAvatarById(this.i))
.map(Avatar::getSkillDepot)
.map(depot -> depot.getTalentCostItemId())
.orElse((this.i % 1000) + 100);
return params.player.getInventory().addItem(itemId);
}
}

View File

@@ -3,14 +3,13 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseGainCardProduct extends ItemUseAction {
public ItemUseGainCardProduct(String[] useParam) {}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_GAIN_CARD_PRODUCT;
}
public ItemUseGainCardProduct(String[] useParam) {
}
@Override
public boolean useItem(UseItemParams params) {
return params.player.rechargeMoonCard();

View File

@@ -1,19 +1,18 @@
package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.data.GameData;
import emu.grasscutter.game.props.ItemUseOp;
import emu.grasscutter.data.GameData;
public class ItemUseGainCostume extends ItemUseInt {
public ItemUseGainCostume(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_GAIN_COSTUME;
}
public ItemUseGainCostume(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
if (GameData.getAvatarCostumeDataMap().containsKey(this.i)) {

View File

@@ -1,19 +1,18 @@
package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.data.GameData;
import emu.grasscutter.game.props.ItemUseOp;
import emu.grasscutter.data.GameData;
public class ItemUseGainFlycloak extends ItemUseInt {
public ItemUseGainFlycloak(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_GAIN_FLYCLOAK;
}
public ItemUseGainFlycloak(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
if (GameData.getAvatarFlycloakDataMap().containsKey(this.i)) {

View File

@@ -3,14 +3,13 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseGainNameCard extends ItemUseAction {
public ItemUseGainNameCard(String[] useParam) {}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_GAIN_NAME_CARD;
}
public ItemUseGainNameCard(String[] useParam) {
}
@Override
public boolean useItem(UseItemParams params) {
params.player.addNameCard(params.usedItemId);

View File

@@ -3,11 +3,6 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseGrantSelectReward extends ItemUseSelectItems {
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_SELECT_ITEM;
}
public ItemUseGrantSelectReward(String[] useParam) {
String[] options = useParam[0].split(",");
this.optionItemIds = new int[options.length];
@@ -17,6 +12,11 @@ public class ItemUseGrantSelectReward extends ItemUseSelectItems {
} catch (NumberFormatException ignored) {
this.optionItemIds[i] = INVALID;
}
};
}
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_ADD_SELECT_ITEM;
}
}

View File

@@ -8,6 +8,7 @@ public abstract class ItemUseInt extends ItemUseAction {
public ItemUseInt(String[] useParam) {
try {
this.i = Integer.parseInt(useParam[0]);
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {}
} catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) {
}
}
}

View File

@@ -4,15 +4,15 @@ import emu.grasscutter.game.entity.EntityVehicle;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseMakeGadget extends ItemUseInt {
public ItemUseMakeGadget(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_MAKE_GADGET;
}
public ItemUseMakeGadget(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
var player = params.player;

View File

@@ -5,20 +5,19 @@ import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseOpenRandomChest extends ItemUseInt {
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_OPEN_RANDOM_CHEST;
}
public ItemUseOpenRandomChest(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) { // cash shop material bundles
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_OPEN_RANDOM_CHEST;
}
@Override
public boolean useItem(UseItemParams params) { // cash shop material bundles
var data = params.player.getServer().getShopSystem().getShopChestData(this.i);
if (data == null)
return false;
if (data == null) return false;
var rewardItems = data.stream().map(GameItem::new).toList();
if (!rewardItems.isEmpty()) {
params.player.getInventory().addItems(rewardItems, ActionReason.Shop);

View File

@@ -3,14 +3,13 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseReliveAvatar extends ItemUseAction {
public ItemUseReliveAvatar(String[] useParam) {}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_RELIVE_AVATAR;
}
public ItemUseReliveAvatar(String[] useParam) {
}
@Override
public boolean useItem(UseItemParams params) {
return params.player.getTeamManager().reviveAvatar(params.targetAvatar);

View File

@@ -3,15 +3,15 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseUnlockCodex extends ItemUseInt {
public ItemUseUnlockCodex(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_UNLOCK_CODEX;
}
public ItemUseUnlockCodex(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
return false;

View File

@@ -3,15 +3,15 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseUnlockCombine extends ItemUseInt {
public ItemUseUnlockCombine(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_UNLOCK_COMBINE;
}
public ItemUseUnlockCombine(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
return true;

View File

@@ -3,15 +3,15 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseUnlockCookRecipe extends ItemUseInt {
public ItemUseUnlockCookRecipe(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_UNLOCK_COOK_RECIPE;
}
public ItemUseUnlockCookRecipe(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
return true;

View File

@@ -3,15 +3,15 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseUnlockForge extends ItemUseInt {
public ItemUseUnlockForge(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_UNLOCK_FORGE;
}
public ItemUseUnlockForge(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
return true;

View File

@@ -3,15 +3,15 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseUnlockFurnitureFormula extends ItemUseInt {
public ItemUseUnlockFurnitureFormula(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_UNLOCK_FURNITURE_FORMULA;
}
public ItemUseUnlockFurnitureFormula(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
return true;

View File

@@ -3,15 +3,15 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseUnlockFurnitureSuite extends ItemUseInt {
public ItemUseUnlockFurnitureSuite(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_UNLOCK_FURNITURE_SUITE;
}
public ItemUseUnlockFurnitureSuite(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
return true;

View File

@@ -3,18 +3,18 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseUnlockHomeBgm extends ItemUseInt {
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_UNLOCK_HOME_BGM;
}
public ItemUseUnlockHomeBgm(String[] useParam) {
super(useParam);
}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_UNLOCK_HOME_BGM;
}
@Override
public boolean useItem(UseItemParams params) {
params.player.getHome().addUnlockedHomeBgm(this.i);
return true; // Probably best to remove the item even if the bgm was already unlocked.
return true; // Probably best to remove the item even if the bgm was already unlocked.
}
}

View File

@@ -3,23 +3,17 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseUnlockHomeModule extends ItemUseInt {
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_UNLOCK_HOME_MODULE;
}
public ItemUseUnlockHomeModule(String[] useParam) {
super(useParam);
}
@Override
public boolean useItem(UseItemParams params) {
return true;
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_UNLOCK_HOME_MODULE;
}
@Override
public boolean postUseItem(UseItemParams params){
params.player.addRealmList(this.i);
return true;
public boolean useItem(UseItemParams params) {
return false;
}
}

View File

@@ -3,18 +3,17 @@ package emu.grasscutter.game.props.ItemUseAction;
import emu.grasscutter.game.props.ItemUseOp;
public class ItemUseUnlockPaidBattlePassNormal extends ItemUseAction {
public ItemUseUnlockPaidBattlePassNormal(String[] useParam) {}
@Override
public ItemUseOp getItemUseOp() {
return ItemUseOp.ITEM_USE_UNLOCK_PAID_BATTLE_PASS_NORMAL;
}
public ItemUseUnlockPaidBattlePassNormal(String[] useParam) {
}
@Override
public boolean useItem(UseItemParams params) {
// TODO: add paid BP
//return params.player.getBattlePassManager().setPaid(true);
// return params.player.getBattlePassManager().setPaid(true);
return false;
}
}

View File

@@ -14,7 +14,13 @@ public class UseItemParams {
public boolean isEnterMpDungeonTeam = false;
public int usedItemId = 0;
public UseItemParams(Player player, ItemUseTarget itemUseTarget, Avatar targetAvatar, int count, int optionId, boolean isEnterMpDungeonTeam) {
public UseItemParams(
Player player,
ItemUseTarget itemUseTarget,
Avatar targetAvatar,
int count,
int optionId,
boolean isEnterMpDungeonTeam) {
this.player = player;
this.itemUseTarget = itemUseTarget;
this.targetAvatar = targetAvatar;

View File

@@ -1,72 +1,74 @@
package emu.grasscutter.game.props;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.stream.Stream;
public enum ItemUseOp {
ITEM_USE_NONE (0),
ITEM_USE_ACCEPT_QUEST (1),
ITEM_USE_TRIGGER_ABILITY (2),
ITEM_USE_GAIN_AVATAR (3),
ITEM_USE_ADD_EXP (4),
ITEM_USE_RELIVE_AVATAR (5),
ITEM_USE_ADD_BIG_TALENT_POINT (6),
ITEM_USE_ADD_PERSIST_STAMINA (7),
ITEM_USE_ADD_TEMPORARY_STAMINA (8),
ITEM_USE_ADD_CUR_STAMINA (9),
ITEM_USE_ADD_CUR_HP (10),
ITEM_USE_ADD_ELEM_ENERGY (11),
ITEM_USE_ADD_ALL_ENERGY (12),
ITEM_USE_ADD_DUNGEON_COND_TIME (13),
ITEM_USE_ADD_WEAPON_EXP (14),
ITEM_USE_ADD_SERVER_BUFF (15),
ITEM_USE_DEL_SERVER_BUFF (16),
ITEM_USE_UNLOCK_COOK_RECIPE (17),
ITEM_USE_OPEN_RANDOM_CHEST (20),
ITEM_USE_MAKE_GADGET (24),
ITEM_USE_ADD_ITEM (25),
ITEM_USE_GRANT_SELECT_REWARD (26),
ITEM_USE_ADD_SELECT_ITEM (27),
ITEM_USE_GAIN_FLYCLOAK (28),
ITEM_USE_GAIN_NAME_CARD (29),
ITEM_USE_UNLOCK_PAID_BATTLE_PASS_NORMAL (30),
ITEM_USE_GAIN_CARD_PRODUCT (31),
ITEM_USE_UNLOCK_FORGE (32),
ITEM_USE_UNLOCK_COMBINE (33),
ITEM_USE_UNLOCK_CODEX (34),
ITEM_USE_CHEST_SELECT_ITEM (35),
ITEM_USE_GAIN_RESIN_CARD_PRODUCT (36),
ITEM_USE_ADD_RELIQUARY_EXP (37),
ITEM_USE_UNLOCK_FURNITURE_FORMULA (38),
ITEM_USE_UNLOCK_FURNITURE_SUITE (39),
ITEM_USE_ADD_CHANNELLER_SLAB_BUFF (40),
ITEM_USE_GAIN_COSTUME (41),
ITEM_USE_ADD_TREASURE_MAP_BONUS_REGION_FRAGMENT (42),
ITEM_USE_COMBINE_ITEM (43),
ITEM_USE_UNLOCK_HOME_MODULE (44),
ITEM_USE_UNLOCK_HOME_BGM (45),
ITEM_USE_ADD_REGIONAL_PLAY_VAR (46);
ITEM_USE_NONE(0),
ITEM_USE_ACCEPT_QUEST(1),
ITEM_USE_TRIGGER_ABILITY(2),
ITEM_USE_GAIN_AVATAR(3),
ITEM_USE_ADD_EXP(4),
ITEM_USE_RELIVE_AVATAR(5),
ITEM_USE_ADD_BIG_TALENT_POINT(6),
ITEM_USE_ADD_PERSIST_STAMINA(7),
ITEM_USE_ADD_TEMPORARY_STAMINA(8),
ITEM_USE_ADD_CUR_STAMINA(9),
ITEM_USE_ADD_CUR_HP(10),
ITEM_USE_ADD_ELEM_ENERGY(11),
ITEM_USE_ADD_ALL_ENERGY(12),
ITEM_USE_ADD_DUNGEON_COND_TIME(13),
ITEM_USE_ADD_WEAPON_EXP(14),
ITEM_USE_ADD_SERVER_BUFF(15),
ITEM_USE_DEL_SERVER_BUFF(16),
ITEM_USE_UNLOCK_COOK_RECIPE(17),
ITEM_USE_OPEN_RANDOM_CHEST(20),
ITEM_USE_MAKE_GADGET(24),
ITEM_USE_ADD_ITEM(25),
ITEM_USE_GRANT_SELECT_REWARD(26),
ITEM_USE_ADD_SELECT_ITEM(27),
ITEM_USE_GAIN_FLYCLOAK(28),
ITEM_USE_GAIN_NAME_CARD(29),
ITEM_USE_UNLOCK_PAID_BATTLE_PASS_NORMAL(30),
ITEM_USE_GAIN_CARD_PRODUCT(31),
ITEM_USE_UNLOCK_FORGE(32),
ITEM_USE_UNLOCK_COMBINE(33),
ITEM_USE_UNLOCK_CODEX(34),
ITEM_USE_CHEST_SELECT_ITEM(35),
ITEM_USE_GAIN_RESIN_CARD_PRODUCT(36),
ITEM_USE_ADD_RELIQUARY_EXP(37),
ITEM_USE_UNLOCK_FURNITURE_FORMULA(38),
ITEM_USE_UNLOCK_FURNITURE_SUITE(39),
ITEM_USE_ADD_CHANNELLER_SLAB_BUFF(40),
ITEM_USE_GAIN_COSTUME(41),
ITEM_USE_ADD_TREASURE_MAP_BONUS_REGION_FRAGMENT(42),
ITEM_USE_COMBINE_ITEM(43),
ITEM_USE_UNLOCK_HOME_MODULE(44),
ITEM_USE_UNLOCK_HOME_BGM(45),
ITEM_USE_ADD_REGIONAL_PLAY_VAR(46);
private final int value;
private static final Int2ObjectMap<ItemUseOp> map = new Int2ObjectOpenHashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
});
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
});
}
private ItemUseOp(int value) {
private final int value;
ItemUseOp(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static ItemUseOp getTypeByValue(int value) {
return map.getOrDefault(value, ITEM_USE_NONE);
}
public int getValue() {
return value;
}
}

View File

@@ -1,36 +1,38 @@
package emu.grasscutter.game.props;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.stream.Stream;
public enum ItemUseTarget {
ITEM_USE_TARGET_NONE (0),
ITEM_USE_TARGET_CUR_AVATAR (1),
ITEM_USE_TARGET_CUR_TEAM (2),
ITEM_USE_TARGET_SPECIFY_AVATAR (3),
ITEM_USE_TARGET_SPECIFY_ALIVE_AVATAR (4),
ITEM_USE_TARGET_SPECIFY_DEAD_AVATAR (5);
ITEM_USE_TARGET_NONE(0),
ITEM_USE_TARGET_CUR_AVATAR(1),
ITEM_USE_TARGET_CUR_TEAM(2),
ITEM_USE_TARGET_SPECIFY_AVATAR(3),
ITEM_USE_TARGET_SPECIFY_ALIVE_AVATAR(4),
ITEM_USE_TARGET_SPECIFY_DEAD_AVATAR(5);
private final int value;
private static final Int2ObjectMap<ItemUseTarget> map = new Int2ObjectOpenHashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
});
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
});
}
private ItemUseTarget(int value) {
private final int value;
ItemUseTarget(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static ItemUseTarget getTypeByValue(int value) {
return map.getOrDefault(value, ITEM_USE_TARGET_NONE);
}
public int getValue() {
return value;
}
}

View File

@@ -1,42 +1,44 @@
package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public enum LifeState {
LIFE_NONE(0),
LIFE_ALIVE(1),
LIFE_DEAD(2),
LIFE_REVIVE(3);
private final int value;
private static final Int2ObjectMap<LifeState> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, LifeState> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private LifeState(int value) {
this.value = value;
}
LIFE_NONE(0),
LIFE_ALIVE(1),
LIFE_DEAD(2),
LIFE_REVIVE(3);
public int getValue() {
return value;
}
public static LifeState getTypeByValue(int value) {
return map.getOrDefault(value, LIFE_NONE);
}
public static LifeState getTypeByName(String name) {
return stringMap.getOrDefault(name, LIFE_NONE);
}
private static final Int2ObjectMap<LifeState> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, LifeState> stringMap = new HashMap<>();
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private final int value;
LifeState(int value) {
this.value = value;
}
public static LifeState getTypeByValue(int value) {
return map.getOrDefault(value, LIFE_NONE);
}
public static LifeState getTypeByName(String name) {
return stringMap.getOrDefault(name, LIFE_NONE);
}
public int getValue() {
return value;
}
}

View File

@@ -1,44 +1,46 @@
package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public enum MonsterType {
MONSTER_NONE (0),
MONSTER_ORDINARY (1),
MONSTER_BOSS (2),
MONSTER_ENV_ANIMAL (3),
MONSTER_LITTLE_MONSTER (4),
MONSTER_FISH (5);
private final int value;
private static final Int2ObjectMap<MonsterType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, MonsterType> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private MonsterType(int value) {
this.value = value;
}
MONSTER_NONE(0),
MONSTER_ORDINARY(1),
MONSTER_BOSS(2),
MONSTER_ENV_ANIMAL(3),
MONSTER_LITTLE_MONSTER(4),
MONSTER_FISH(5);
public int getValue() {
return value;
}
public static MonsterType getTypeByValue(int value) {
return map.getOrDefault(value, MONSTER_NONE);
}
public static MonsterType getTypeByName(String name) {
return stringMap.getOrDefault(name, MONSTER_NONE);
}
private static final Int2ObjectMap<MonsterType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, MonsterType> stringMap = new HashMap<>();
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private final int value;
MonsterType(int value) {
this.value = value;
}
public static MonsterType getTypeByValue(int value) {
return map.getOrDefault(value, MONSTER_NONE);
}
public static MonsterType getTypeByName(String name) {
return stringMap.getOrDefault(name, MONSTER_NONE);
}
public int getValue() {
return value;
}
}

View File

@@ -1,67 +1,77 @@
package emu.grasscutter.game.props;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.stream.Stream;
import lombok.Getter;
public enum PlayerProperty {
PROP_NONE (0),
PROP_EXP (1001, 0),
PROP_BREAK_LEVEL (1002),
PROP_SATIATION_VAL (1003),
PROP_SATIATION_PENALTY_TIME (1004),
PROP_LEVEL (4001, 0, 90),
PROP_LAST_CHANGE_AVATAR_TIME (10001),
PROP_MAX_SPRING_VOLUME (10002, 0, 8_500_000), // Maximum volume of the Statue of the Seven for the player [0, 8500000]
PROP_CUR_SPRING_VOLUME (10003, true), // Current volume of the Statue of the Seven [0, PROP_MAX_SPRING_VOLUME]
PROP_IS_SPRING_AUTO_USE (10004, 0, 1), // Auto HP recovery when approaching the Statue of the Seven [0, 1]
PROP_SPRING_AUTO_USE_PERCENT (10005, 0, 100), // Auto HP recovery percentage [0, 100]
PROP_IS_FLYABLE (10006, 0, 1), // Are you in a state that disables your flying ability? e.g. new player [0, 1]
PROP_IS_WEATHER_LOCKED (10007, 0, 1),
PROP_IS_GAME_TIME_LOCKED (10008, 0, 1),
PROP_IS_TRANSFERABLE (10009, 0, 1),
PROP_MAX_STAMINA (10010, 0, 24_000), // Maximum stamina of the player (0 - 24000)
PROP_CUR_PERSIST_STAMINA (10011, true), // Used stamina of the player (0 - PROP_MAX_STAMINA)
PROP_CUR_TEMPORARY_STAMINA (10012),
PROP_PLAYER_LEVEL (10013, 1, 60),
PROP_PLAYER_EXP (10014),
PROP_PLAYER_HCOIN (10015), // Primogem (-inf, +inf)
PROP_NONE(0),
PROP_EXP(1001, 0),
PROP_BREAK_LEVEL(1002),
PROP_SATIATION_VAL(1003),
PROP_SATIATION_PENALTY_TIME(1004),
PROP_LEVEL(4001, 0, 90),
PROP_LAST_CHANGE_AVATAR_TIME(10001),
PROP_MAX_SPRING_VOLUME(
10002, 0, 8_500_000), // Maximum volume of the Statue of the Seven for the player [0, 8500000]
PROP_CUR_SPRING_VOLUME(
10003, true), // Current volume of the Statue of the Seven [0, PROP_MAX_SPRING_VOLUME]
PROP_IS_SPRING_AUTO_USE(
10004, 0, 1), // Auto HP recovery when approaching the Statue of the Seven [0, 1]
PROP_SPRING_AUTO_USE_PERCENT(10005, 0, 100), // Auto HP recovery percentage [0, 100]
PROP_IS_FLYABLE(
10006, 0, 1), // Are you in a state that disables your flying ability? e.g. new player [0, 1]
PROP_IS_WEATHER_LOCKED(10007, 0, 1), // Weather will not change in this state.
PROP_IS_GAME_TIME_LOCKED(10008, 0, 1), // Game time will not move in this state.
PROP_IS_TRANSFERABLE(10009, 0, 1),
PROP_MAX_STAMINA(10010, 0, 24_000), // Maximum stamina of the player (0 - 24000)
PROP_CUR_PERSIST_STAMINA(10011, true), // Used stamina of the player (0 - PROP_MAX_STAMINA)
PROP_CUR_TEMPORARY_STAMINA(10012),
PROP_PLAYER_LEVEL(10013, 1, 60), // Player level [1, 60]
PROP_PLAYER_EXP(10014, 0), // Player EXP (0, +inf)
PROP_PLAYER_HCOIN(10015), // Primogem (-inf, +inf)
// It is known that Mihoyo will make Primogem negative in the cases that a player spends
// his gems and then got a money refund, so negative is allowed.
PROP_PLAYER_SCOIN (10016, 0), // Mora [0, +inf)
PROP_PLAYER_MP_SETTING_TYPE (10017, 0, 2), // Do you allow other players to join your game? [0=no 1=direct 2=approval]
PROP_IS_MP_MODE_AVAILABLE (10018, 0, 1), // 0 if in quest or something that disables MP [0, 1]
PROP_PLAYER_WORLD_LEVEL (10019, 0, 8), // [0, 8]
PROP_PLAYER_RESIN (10020, 0, 2000), // Original Resin [0, 2000] - note that values above 160 require refills
PROP_PLAYER_WAIT_SUB_HCOIN (10022),
PROP_PLAYER_WAIT_SUB_SCOIN (10023),
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,0),
PROP_IS_HAS_FIRST_SHARE (10028),
PROP_PLAYER_FORGE_POINT (10029, 0, 300_000),
PROP_CUR_CLIMATE_METER (10035),
PROP_CUR_CLIMATE_TYPE (10036),
PROP_CUR_CLIMATE_AREA_ID (10037),
PROP_CUR_CLIMATE_AREA_CLIMATE_TYPE (10038),
PROP_PLAYER_WORLD_LEVEL_LIMIT (10039),
PROP_PLAYER_WORLD_LEVEL_ADJUST_CD (10040),
PROP_PLAYER_LEGENDARY_DAILY_TASK_NUM (10041),
PROP_PLAYER_HOME_COIN (10042, 0), // Realm currency [0, +inf)
PROP_PLAYER_WAIT_SUB_HOME_COIN (10043);
PROP_PLAYER_SCOIN(10016, 0), // Mora [0, +inf)
PROP_PLAYER_MP_SETTING_TYPE(
10017, 0, 2), // Do you allow other players to join your game? [0=no 1=direct 2=approval]
PROP_IS_MP_MODE_AVAILABLE(10018, 0, 1), // 0 if in quest or something that disables MP [0, 1]
PROP_PLAYER_WORLD_LEVEL(10019, 0, 8), // [0, 8]
PROP_PLAYER_RESIN(
10020, 0, 2000), // Original Resin [0, 2000] - note that values above 160 require refills
PROP_PLAYER_WAIT_SUB_HCOIN(10022),
PROP_PLAYER_WAIT_SUB_SCOIN(10023),
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, 0), // Amount of story keys [0, 3]
PROP_IS_HAS_FIRST_SHARE(10028),
PROP_PLAYER_FORGE_POINT(10029, 0, 300_000),
PROP_CUR_CLIMATE_METER(10035),
PROP_CUR_CLIMATE_TYPE(10036),
PROP_CUR_CLIMATE_AREA_ID(10037),
PROP_CUR_CLIMATE_AREA_CLIMATE_TYPE(10038),
PROP_PLAYER_WORLD_LEVEL_LIMIT(10039, 0, 8), // [0, 8] World level limit, up to 8.
PROP_PLAYER_WORLD_LEVEL_ADJUST_CD(10040), // Time until world level can be increased/decreased.
PROP_PLAYER_LEGENDARY_DAILY_TASK_NUM(10041), // Amount of remaining quests for another story key.
PROP_PLAYER_HOME_COIN(10042, 0), // Realm currency [0, +inf)
PROP_PLAYER_WAIT_SUB_HOME_COIN(10043),
PROP_IS_AUTO_UNLOCK_SPECIFIC_EQUIP(10044), // New; unknown/un-used.
PROP_PLAYER_GCG_COIN(10045), // New; unknown/un-used.
PROP_PLAYER_WAIT_SUB_GCG_COIN(10046), // New; unknown/un-used.
PROP_PLAYER_ONLINE_TIME(10047); // New; unknown/un-used.
private static final int inf = Integer.MAX_VALUE; // Maybe this should be something else?
@Getter private final int id, min, max;
@Getter private final boolean dynamicRange;
private static final int inf = Integer.MAX_VALUE; // Maybe this should be something else?
private static final Int2ObjectMap<PlayerProperty> map = new Int2ObjectOpenHashMap<>();
static {
Stream.of(values()).forEach(e -> map.put(e.getId(), e));
}
@Getter private final int id, min, max;
@Getter private final boolean dynamicRange;
PlayerProperty(int id, int min, int max, boolean dynamicRange) {
this.id = id;
this.min = min;

View File

@@ -0,0 +1,44 @@
package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
public enum RefreshType {
REFRESH_NONE(0),
REFRESH_INTERVAL(1),
REFRESH_DAILY(2),
REFRESH_WEEKlY(3),
REFRESH_DAYBEGIN_INTERVAL(4);
private final int value;
private static final Int2ObjectMap<RefreshType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, RefreshType> stringMap = new HashMap<>();
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private RefreshType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static RefreshType getTypeByValue(int value) {
return map.getOrDefault(value, REFRESH_NONE);
}
public static RefreshType getTypeByName(String name) {
return stringMap.getOrDefault(name, REFRESH_NONE);
}
}

View File

@@ -1,45 +1,47 @@
package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public enum SceneType {
SCENE_NONE (0),
SCENE_WORLD (1),
SCENE_DUNGEON (2),
SCENE_ROOM (3),
SCENE_HOME_WORLD (4),
SCENE_HOME_ROOM (5),
SCENE_ACTIVITY (6);
private final int value;
private static final Int2ObjectMap<SceneType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, SceneType> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private SceneType(int value) {
this.value = value;
}
SCENE_NONE(0),
SCENE_WORLD(1),
SCENE_DUNGEON(2),
SCENE_ROOM(3),
SCENE_HOME_WORLD(4),
SCENE_HOME_ROOM(5),
SCENE_ACTIVITY(6);
public int getValue() {
return value;
}
public static SceneType getTypeByValue(int value) {
return map.getOrDefault(value, SCENE_NONE);
}
public static SceneType getTypeByName(String name) {
return stringMap.getOrDefault(name, SCENE_NONE);
}
private static final Int2ObjectMap<SceneType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, SceneType> stringMap = new HashMap<>();
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private final int value;
SceneType(int value) {
this.value = value;
}
public static SceneType getTypeByValue(int value) {
return map.getOrDefault(value, SCENE_NONE);
}
public static SceneType getTypeByName(String name) {
return stringMap.getOrDefault(name, SCENE_NONE);
}
public int getValue() {
return value;
}
}

View File

@@ -1,34 +1,36 @@
package emu.grasscutter.game.props;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.stream.Stream;
public enum ServerBuffType {
SERVER_BUFF_NONE (0),
SERVER_BUFF_AVATAR (1),
SERVER_BUFF_TEAM (2),
SERVER_BUFF_TOWER (3);
SERVER_BUFF_NONE(0),
SERVER_BUFF_AVATAR(1),
SERVER_BUFF_TEAM(2),
SERVER_BUFF_TOWER(3);
private final int value;
private static final Int2ObjectMap<ServerBuffType> map = new Int2ObjectOpenHashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
});
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
});
}
private ServerBuffType(int value) {
private final int value;
ServerBuffType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static ServerBuffType getTypeByValue(int value) {
return map.getOrDefault(value, SERVER_BUFF_NONE);
}
public int getValue() {
return value;
}
}

View File

@@ -1,337 +1,339 @@
package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public enum WatcherTriggerType {
TRIGGER_NONE (0),
TRIGGER_COMBAT_CONFIG_COMMON (1),
TRIGGER_ELEMENT_VIEW (2),
TRIGGER_ENTER_AIRFLOW (5),
TRIGGER_NEW_MONSTER (6),
TRIGGER_NEW_AFFIX (8),
TRIGGER_CHANGE_INPUT_DEVICE_TYPE (9),
TRIGGER_PAIMON_ANGRY_VOICE_EASTER_EGG (10),
TRIGGER_WIND_CRYSTAL (11),
TRIGGER_ELEMENT_BALL (101),
TRIGGER_WORLD_LEVEL_UP (102),
TRIGGER_DUNGEON_ENTRY_TO_BE_EXPLORED (103),
TRIGGER_UNLOCK_GATE_TEMPLE (104),
TRIGGER_UNLOCK_AREA (105),
TRIGGER_UNLOCK_TRANS_POINT (106),
TRIGGER_OPEN_CHEST_WITH_GADGET_ID (107),
TRIGGER_CITY_LEVEL_UP (108),
TRIGGER_MONSTER_DIE (109),
TRIGGER_PLATFORM_START_MOVE (110),
TRIGGER_GROUP_NOTIFY (111),
TRIGGER_ELEMENT_TYPE_CHANGE (112),
TRIGGER_GADGET_INTERACTABLE (113),
TRIGGER_COLLECT_SET_OF_READINGS (114),
TRIGGER_TELEPORT_WITH_CERTAIN_PORTAL (115),
TRIGGER_WORLD_GATHER (116),
TRIGGER_TAKE_GENERAL_REWARD (117),
TRIGGER_BATTLE_FOR_MONSTER_DIE_OR (118),
TRIGGER_BATTLE_FOR_MONSTER_DIE_AND (119),
TRIGGER_OPEN_WORLD_CHEST (120),
TRIGGER_ENTER_CLIMATE_AREA (121),
TRIGGER_UNLOCK_SCENE_POINT (122),
TRIGGER_INTERACT_GADGET_WITH_INTERACT_ID (123),
TRIGGER_OBTAIN_AVATAR (201),
TRIGGER_PLAYER_LEVEL (202),
TRIGGER_AVATAR_UPGRADE (203),
TRIGGER_AVATAR_PROMOTE (204),
TRIGGER_WEAPON_UPGRADE (205),
TRIGGER_WEAPON_PROMOTE (206),
TRIGGER_RELIQUARY_UPGRADE (207),
TRIGGER_WEAR_RELIQUARY (208),
TRIGGER_UPGRADE_TALENT (209),
TRIGGER_UNLOCK_RECIPE (210),
TRIGGER_RELIQUARY_SET_NUM (211),
TRIGGER_OBTAIN_MATERIAL_NUM (212),
TRIGGER_OBTAIN_RELIQUARY_NUM (213),
TRIGGER_GACHA_NUM (214),
TRIGGER_ANY_RELIQUARY_UPGRADE (215),
TRIGGER_FETTER_LEVEL_AVATAR_NUM (216),
TRIGGER_SKILLED_AT_RECIPE (217),
TRIGGER_RELIQUARY_UPGRADE_EQUAL_RANK_LEVEL (218),
TRIGGER_SPECIFIED_WEAPON_UPGRADE (219),
TRIGGER_SPECIFIED_WEAPON_AWAKEN (220),
TRIGGER_UNLOCK_SPECIFIC_RECIPE_OR (221),
TRIGGER_POSSESS_MATERIAL_NUM (222),
TRIGGER_EXHIBITION_ACCUMULABLE_VALUE (223),
TRIGGER_EXHIBITION_REPLACEABLE_VALUE_SETTLE_NUM (224),
TRIGGER_ANY_WEAPON_UPGRADE_NUM (225),
TRIGGER_ANY_RELIQUARY_UPGRADE_NUM (226),
TRIGGER_ACTIVITY_SCORE_EXCEED_VALUE (227),
TRIGGER_UNLOCK_SPECIFIC_FORGE_OR (228),
TRIGGER_UNLOCK_SPECIFIC_ANIMAL_CODEX (229),
TRIGGER_OBTAIN_ITEM_NUM (230),
TRIGGER_CAPTURE_ANIMAL (231),
TRIGGER_DAILY_TASK (301),
TRIGGER_RAND_TASK (302),
TRIGGER_AVATAR_EXPEDITION (303),
TRIGGER_FINISH_TOWER_LEVEL (304),
TRIGGER_WORLD_BOSS_REWARD (306),
TRIGGER_FINISH_DUNGEON (307),
TRIGGER_START_AVATAR_EXPEDITION (308),
TRIGGER_OPEN_BLOSSOM_CHEST (309),
TRIGGER_FINISH_BLOSSOM_PROGRESS (310),
TRIGGER_DONE_TOWER_GADGET_UNHURT (311),
TRIGGER_DONE_TOWER_STARS (312),
TRIGGER_DONE_TOWER_UNHURT (313),
TRIGGER_STEAL_FOOD_TIMES (314),
TRIGGER_DONE_DUNGEON_WITH_SAME_ELEMENT_AVATARS (315),
TRIGGER_GROUP_FLIGHT_CHALLENGE_REACH_POINTS (316),
TRIGGER_FINISH_DAILY_DELIVERY_NUM (317),
TRIGGER_TOWER_STARS_NUM (318),
TRIGGER_FINISH_SPECIFED_TYPE_BLOSSOM_NUM (319),
TRIGGER_FINISH_SPECIFED_TYPE_BLOSSOM_CLIMATE_METER (320),
TRIGGER_FINISH_BLOSSOM_GROUP_VARIABLE_GT (321),
TRIGGER_EFFIGY_CHALLENGE_SCORE (322),
TRIGGER_FINISH_ROUTINE (323),
TRIGGER_ACTIVITY_EXPEDITION_FINISH (324),
TRIGGER_ACTIVITY_CHANNELLER_SLAB_FINISH_ALL_CAMP (325),
TRIGGER_ACTIVITY_CHANNELLER_SLAB_FINISH_ALL_ONEOFF_DUNGEON (326),
TRIGGER_ACTIVITY_CHANNELLER_SLAB_LOOP_DUNGEON_TOTAL_SCORE (327),
TRIGGER_GROUP_SUMMER_TIME_SPRINT_BOAT_REACH_POINTS (328),
TRIGGER_WEEKLY_BOSS_KILL (329),
TRIGGER_BOUNCE_CONJURING_FINISH_COUNT (330),
TRIGGER_BOUNCE_CONJURING_SCORE (331),
TRIGGER_GROUP_VARIABLE_SET_VALUE_TO (332),
TRIGGER_KILL_GADGETS_BY_SPECIFIC_SKILL (333),
TRIGGER_KILL_MONSTERS_WITHOUT_VEHICLE (334),
TRIGGER_KILL_MONSTER_IN_AREA (335),
TRIGGER_ENTER_VEHICLE (336),
TRIGGER_VEHICLE_DURATION (337),
TRIGGER_VEHICLE_FRIENDS (338),
TRIGGER_VEHICLE_KILLED_BY_MONSTER (339),
TRIGGER_VEHICLE_DASH (340),
TRIGGER_DO_COOK (401),
TRIGGER_DO_FORGE (402),
TRIGGER_DO_COMPOUND (403),
TRIGGER_DO_COMBINE (404),
TRIGGER_BUY_SHOP_GOODS (405),
TRIGGER_FORGE_WEAPON (406),
TRIGGER_MP_PLAY_BATTLE_WIN (421),
TRIGGER_KILL_GROUP_MONSTER (422),
TRIGGER_CRUCIBLE_ELEMENT_SCORE (423),
TRIGGER_MP_DUNGEON_TIMES (424),
TRIGGER_MP_KILL_MONSTER_NUM (425),
TRIGGER_CRUCIBLE_MAX_BALL (426),
TRIGGER_CRUCIBLE_MAX_SCORE (427),
TRIGGER_CRUCIBLE_SUBMIT_BALL (428),
TRIGGER_CRUCIBLE_WORLD_LEVEL_SCORE (429),
TRIGGER_MP_PLAY_GROUP_STATISTIC (430),
TRIGGER_KILL_GROUP_SPECIFIC_MONSTER (431),
TRIGGER_REACH_MP_PLAY_SCORE (432),
TRIGGER_REACH_MP_PLAY_RECORD (433),
TRIGGER_TREASURE_MAP_DONE_REGION (434),
TRIGGER_SEA_LAMP_MINI_QUEST (435),
TRIGGER_FINISH_FIND_HILICHURL_LEVEL (436),
TRIGGER_COMBINE_ITEM (437),
TRIGGER_FINISH_CHALLENGE_IN_DURATION (438),
TRIGGER_FINISH_CHALLENGE_LEFT_TIME (439),
TRIGGER_MP_KILL_MONSTER_ID_NUM (440),
TRIGGER_LOGIN (501),
TRIGGER_COST_MATERIAL (502),
TRIGGER_DELIVER_ITEM_TO_SALESMAN (503),
TRIGGER_USE_ITEM (504),
TRIGGER_ACCUMULATE_DAILY_LOGIN (505),
TRIGGER_FINISH_CHALLENGE (601),
TRIGGER_MECHANICUS_UNLOCK_GEAR (602),
TRIGGER_MECHANICUS_LEVELUP_GEAR (603),
TRIGGER_MECHANICUS_DIFFICULT (604),
TRIGGER_MECHANICUS_DIFFICULT_SCORE (605),
TRIGGER_MECHANICUS_KILL_MONSTER (606),
TRIGGER_MECHANICUS_BUILDING_POINT (607),
TRIGGER_MECHANICUS_DIFFICULT_EQ (608),
TRIGGER_MECHANICUS_BATTLE_END (609),
TRIGGER_MECHANICUS_BATTLE_END_EXCAPED_LESS_THAN (610),
TRIGGER_MECHANICUS_BATTLE_END_POINTS_MORE_THAN (611),
TRIGGER_MECHANICUS_BATTLE_END_GEAR_MORE_THAN (612),
TRIGGER_MECHANICUS_BATTLE_END_PURE_GEAR_DAMAGE (613),
TRIGGER_MECHANICUS_BATTLE_END_CARD_PICK_MORE_THAN (614),
TRIGGER_MECHANICUS_BATTLE_END_CARD_TARGET_MORE_THAN (615),
TRIGGER_MECHANICUS_BATTLE_END_BUILD_GEAR_MORE_THAN (616),
TRIGGER_MECHANICUS_BATTLE_END_GEAR_KILL_MORE_THAN (617),
TRIGGER_MECHANICUS_BATTLE_END_ROUND_MORE_THAN (618),
TRIGGER_MECHANICUS_BATTLE_END_ROUND (619),
TRIGGER_MECHANICUS_BATTLE_FIN_CHALLENGE_MORE_THAN (620),
TRIGGER_MECHANICUS_BATTLE_WATCHER_FINISH_COUNT (621),
TRIGGER_MECHANICUS_BATTLE_INTERACT_COUNT (622),
TRIGGER_MECHANICUS_BATTLE_DIFFICULT_ESCAPE (623),
TRIGGER_MECHANICUS_BATTLE_DIFFICULT_GEAR_NUM (624),
TRIGGER_MECHANICUS_BATTLE_DIFFICULT_GEAR_ID_NUM (625),
TRIGGER_FLEUR_FAIR_DUNGEON_FINISH_IN_LIMIT_TIME (626),
TRIGGER_FLEUR_FAIR_DUNGEON_FINISH_KEEP_ENERGY (627),
TRIGGER_FLEUR_FAIR_DUNGEON_FINISH_WITH_GROUP_VARIABLE (628),
TRIGGER_FLEUR_FAIR_DUNGEON_FINISH_WITH_BUFF_NUM (629),
TRIGGER_FLEUR_FAIR_DUNGEON_MISSION_FINISH (630),
TRIGGER_FINISH_DUNGEON_AND_CHALLENGE_REMAIN_TIME_GREATER_THAN (631),
TRIGGER_FINISH_DUNGEON_WITH_MIST_TRIAL_STAT (632),
TRIGGER_DUNGEON_MIST_TRIAL_STAT (633),
TRIGGER_DUNGEON_ELEMENT_REACTION_NUM (634),
TRIGGER_LEVEL_AVATAR_FINISH_DUNGEON_COUNT (635),
TRIGGER_CHESS_REACH_LEVEL (636),
TRIGGER_CHESS_DUNGEON_ADD_SCORE (637),
TRIGGER_CHESS_DUNGEON_SUCC_WITH_ESCAPED_MONSTERS_LESS_THAN (638),
TRIGGER_CHESS_DUNGEON_SUCC_WITH_TOWER_COUNT_LESS_OR_EQUAL (639),
TRIGGER_CHESS_DUNGEON_SUCC_WITH_CARD_COUNT_LESS_OR_EQUAL (640),
TRIGGER_CHESS_DUNGEON_SUCC_WITH_CARD_COUNT_GREATER_THAN (641),
TRIGGER_CHESS_KILL_MONSTERS (642),
TRIGGER_CHESS_COST_BUILDING_POINTS (643),
TRIGGER_SUMO_STAGE_SCORE_REACH (644),
TRIGGER_SUMO_TOTAL_MAX_SCORE_REACH (645),
TRIGGER_ROGUE_DESTROY_GADGET_NUM (646),
TRIGGER_ROGUE_KILL_MONSTER_NUM (647),
TRIGGER_ROGUE_FINISH_WITHOUT_USING_SPRING_CELL (649),
TRIGGER_ROGUE_FINISH_ALL_CHALLENGE_CELL (650),
TRIGGER_ROGUE_FINISH_WITH_AVATAR_ELEMENT_TYPE_NUM_LESS_THAN (651),
TRIGGER_ROGUE_FINISH_WITH_AVATAR_NUM_LESS_THAN (652),
TRIGGER_ROGUE_FINISH_NO_AVATAR_DEAD (653),
TRIGGER_ROGUE_SHIKIGAMI_UPGRADE (654),
TRIGGER_ROGUE_CURSE_NUM (655),
TRIGGER_ROGUE_SELECT_CARD_NUM (656),
TRIGGER_FINISH_QUEST_AND (700),
TRIGGER_FINISH_QUEST_OR (701),
TRIGGER_DAILY_TASK_VAR_EQUAL (702),
TRIGGER_QUEST_GLOBAL_VAR_EQUAL (703),
TRIGGER_TALK_NUM (704),
TRIGGER_FINISH_PARENT_QUEST_AND (705),
TRIGGER_FINISH_PARENT_QUEST_OR (706),
TRIGGER_ELEMENT_REACTION_TIMELIMIT_NUM (800),
TRIGGER_ELEMENT_REACTION_TIMELIMIT_KILL_NUM (801),
TRIGGER_ELEMENT_REACTION_TIMELIMIT_DAMAGE_NUM (802),
TRIGGER_ABILITY_STATE_PASS_TIME (803),
TRIGGER_MAX_CRITICAL_DAMAGE (804),
TRIGGER_FULL_SATIATION_TEAM_AVATAR_NUM (805),
TRIGGER_KILLED_BY_CERTAIN_MONSTER (806),
TRIGGER_CUR_AVATAR_HURT (807),
TRIGGER_CUR_AVATAR_ABILITY_STATE (808),
TRIGGER_USE_ENERGY_SKILL_NUM_TIMELIMIT (809),
TRIGGER_SHIELD_SOURCE_NUM (810),
TRIGGER_CUR_AVATAR_HURT_BY_SPECIFIC_ABILITY (811),
TRIGGER_KILLED_BY_SPECIFIC_ABILITY (812),
TRIGGER_MAX_DASH_TIME (900),
TRIGGER_MAX_FLY_TIME (901),
TRIGGER_MAX_FLY_MAP_DISTANCE (902),
TRIGGER_SIT_DOWN_IN_POINT (903),
TRIGGER_DASH (904),
TRIGGER_CLIMB (905),
TRIGGER_FLY (906),
TRIGGER_CITY_REPUTATION_LEVEL (930),
TRIGGER_CITY_REPUTATION_FINISH_REQUEST (931),
TRIGGER_HUNTING_FINISH_NUM (932),
TRIGGER_HUNTING_FAIL_NUM (933),
TRIGGER_OFFERING_LEVEL (934),
TRIGGER_MIRACLE_RING_DELIVER_ITEM (935),
TRIGGER_MIRACLE_RING_TAKE_REWARD (936),
TRIGGER_BLESSING_EXCHANGE_PIC_NUM (937),
TRIGGER_BLESSING_REDEEM_REWARD_NUM (938),
TRIGGER_GALLERY_BALLOON_REACH_SCORE (939),
TRIGGER_GALLERY_FALL_REACH_SCORE (940),
TRIGGER_FLEUR_FAIR_MUSIC_GAME_REACH_SCORE (941),
TRIGGER_MAIN_COOP_SAVE_POINT_AND (942),
TRIGGER_MAIN_COOP_SAVE_POINT_OR (943),
TRIGGER_MAIN_COOP_VAR_EQUAL (944),
TRIGGER_FINISH_ALL_ARENA_CHALLENGE_WATCHER_IN_SCHEDULE (945),
TRIGGER_GALLERY_BUOYANT_COMBAT_REACH_SCORE (946),
TRIGGER_BUOYANT_COMBAT_REACH_NEW_SCORE_LEVEL (947),
TRIGGER_PLACE_MIRACLE_RING (948),
TRIGGER_LUNA_RITE_SEARCH (949),
TRIGGER_GALLERY_FISH_REACH_SCORE (950),
TRIGGER_GALLERY_TRIATHLON_REACH_SCORE (951),
TRIGGER_WINTER_CAMP_SNOWMAN_COMPLEIET (952),
TRIGGER_CREATE_CUSTOM_DUNGEON (953),
TRIGGER_PUBLISH_CUSTOM_DUNGEON (954),
TRIGGER_PLAY_OTHER_CUSTOM_DUNGEON (955),
TRIGGER_FINISH_CUSTOM_DUNGEON_OFFICIAL (956),
TRIGGER_CUSTOM_DUNGEON_OFFICIAL_COIN (957),
TRIGGER_OBTAIN_WOOD_TYPE (1000),
TRIGGER_OBTAIN_WOOD_COUNT (1001),
TRIGGER_UNLOCK_FURNITURE_COUNT (1002),
TRIGGER_FURNITURE_MAKE (1003),
TRIGGER_HOME_LEVEL (1004),
TRIGGER_HOME_COIN (1005),
TRIGGER_HOME_COMFORT_LEVEL (1006),
TRIGGER_HOME_LIMITED_SHOP_BUY (1007),
TRIGGER_FURNITURE_SUITE_TYPE (1008),
TRIGGER_ARRANGEMENT_FURNITURE_COUNT (1009),
TRIGGER_ENTER_SELF_HOME (1010),
TRIGGER_HOME_MODULE_COMFORT_VALUE (1011),
TRIGGER_HOME_ENTER_ROOM (1012),
TRIGGER_HOME_AVATAR_IN (1013),
TRIGGER_HOME_AVATAR_REWARD_EVENT_COUNT (1014),
TRIGGER_HOME_AVATAR_TALK_FINISH_COUNT (1015),
TRIGGER_HOME_AVATAR_REWARD_EVENT_ALL_COUNT (1016),
TRIGGER_HOME_AVATAR_TALK_FINISH_ALL_COUNT (1017),
TRIGGER_HOME_AVATAR_FETTER_GET (1018),
TRIGGER_HOME_AVATAR_IN_COUNT (1019),
TRIGGER_HOME_DO_PLANT (1020),
TRIGGER_ARRANGEMENT_FURNITURE (1021),
TRIGGER_HOME_GATHER_COUNT (1022),
TRIGGER_HOME_FIELD_GATHER_COUNT (1023),
TRIGGER_HOME_UNLOCK_BGM_COUNT (1024),
TRIGGER_FISHING_SUCC_NUM (1100),
TRIGGER_FISHING_KEEP_BONUS (1101),
TRIGGER_EMPTY_FISH_POOL (1102),
TRIGGER_FISHING_FAIL_NUM (1103),
TRIGGER_SHOCK_FISH_NUM (1104),
TRIGGER_PLANT_FLOWER_SET_WISH (1105),
TRIGGER_PLANT_FLOWER_GIVE_FLOWER (1106),
TRIGGER_PLANT_FLOWER_OBTAIN_FLOWER_TYPE (1107),
TRIGGER_PLANT_FLOWER_COMMON_OBTAIN_FLOWER_TYPE (1108),
TRIGGER_FINISH_LANV2_PROJECTION_LEVEL (1111),
TRIGGER_GALLERY_SALVAGE_REACH_SCORE (1112),
TRIGGER_LANV2_FIREWORKS_CHALLENGE_REACH_SCORE (1113),
TRIGGER_POTION_STAGE_LEVEL_PASS_NUM (1115),
TRIGGER_POTION_STAGE_OBTAIN_MEDAL_NUM (1116),
TRIGGER_POTION_STAGE_REACH_TOTAL_SCORE (1117),
TRIGGER_BARTENDER_FINISH_STORY_MODULE (1120),
TRIGGER_BARTENDER_CHALLENGE_MODULE_LEVEL_SCORE (1121),
TRIGGER_BARTENDER_UNLOCK_FORMULA (1122),
TRIGGER_MICHIAE_MATSURI_UNLOCK_CRYSTAL_SKILL_REACH_NUM (1123),
TRIGGER_MICHIAE_MATSURI_FINISH_DARK_CHALLENGE_REACH_NUM (1124),
TRIGGER_CAPTURE_ENV_ANIMAL_REACH_NUM (1125),
TRIGGER_SPICE_MAKE_FORMULA_TIMES (1126),
TRIGGER_SPICE_GIVE_FOOD_TIMES (1127),
TRIGGER_SPICE_MAKE_FORMULA_SUCCESSFUL_TIMES (1128),
TRIGGER_IRODORI_FINISH_FLOWER_THEME (1131),
TRIGGER_IRODORI_FINISH_MASTER_STAGE (1132),
TRIGGER_IRODORI_CHESS_STAGE_REACH_SCORE (1133),
TRIGGER_IRODORI_FINISH_POETRY_THEME (1134),
TRIGGER_PHOTO_FINISH_POS_ID (1135),
TRIGGER_CRYSTAL_LINK_LEVEL_SCORE_REACH (1138),
TRIGGER_CRYSTAL_LINK_TOTAL_MAX_SCORE_REACH (1139);
private final int value;
private static final Int2ObjectMap<WatcherTriggerType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, WatcherTriggerType> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private WatcherTriggerType(int value) {
this.value = value;
}
TRIGGER_NONE(0),
TRIGGER_COMBAT_CONFIG_COMMON(1),
TRIGGER_ELEMENT_VIEW(2),
TRIGGER_ENTER_AIRFLOW(5),
TRIGGER_NEW_MONSTER(6),
TRIGGER_NEW_AFFIX(8),
TRIGGER_CHANGE_INPUT_DEVICE_TYPE(9),
TRIGGER_PAIMON_ANGRY_VOICE_EASTER_EGG(10),
TRIGGER_WIND_CRYSTAL(11),
TRIGGER_ELEMENT_BALL(101),
TRIGGER_WORLD_LEVEL_UP(102),
TRIGGER_DUNGEON_ENTRY_TO_BE_EXPLORED(103),
TRIGGER_UNLOCK_GATE_TEMPLE(104),
TRIGGER_UNLOCK_AREA(105),
TRIGGER_UNLOCK_TRANS_POINT(106),
TRIGGER_OPEN_CHEST_WITH_GADGET_ID(107),
TRIGGER_CITY_LEVEL_UP(108),
TRIGGER_MONSTER_DIE(109),
TRIGGER_PLATFORM_START_MOVE(110),
TRIGGER_GROUP_NOTIFY(111),
TRIGGER_ELEMENT_TYPE_CHANGE(112),
TRIGGER_GADGET_INTERACTABLE(113),
TRIGGER_COLLECT_SET_OF_READINGS(114),
TRIGGER_TELEPORT_WITH_CERTAIN_PORTAL(115),
TRIGGER_WORLD_GATHER(116),
TRIGGER_TAKE_GENERAL_REWARD(117),
TRIGGER_BATTLE_FOR_MONSTER_DIE_OR(118),
TRIGGER_BATTLE_FOR_MONSTER_DIE_AND(119),
TRIGGER_OPEN_WORLD_CHEST(120),
TRIGGER_ENTER_CLIMATE_AREA(121),
TRIGGER_UNLOCK_SCENE_POINT(122),
TRIGGER_INTERACT_GADGET_WITH_INTERACT_ID(123),
TRIGGER_OBTAIN_AVATAR(201),
TRIGGER_PLAYER_LEVEL(202),
TRIGGER_AVATAR_UPGRADE(203),
TRIGGER_AVATAR_PROMOTE(204),
TRIGGER_WEAPON_UPGRADE(205),
TRIGGER_WEAPON_PROMOTE(206),
TRIGGER_RELIQUARY_UPGRADE(207),
TRIGGER_WEAR_RELIQUARY(208),
TRIGGER_UPGRADE_TALENT(209),
TRIGGER_UNLOCK_RECIPE(210),
TRIGGER_RELIQUARY_SET_NUM(211),
TRIGGER_OBTAIN_MATERIAL_NUM(212),
TRIGGER_OBTAIN_RELIQUARY_NUM(213),
TRIGGER_GACHA_NUM(214),
TRIGGER_ANY_RELIQUARY_UPGRADE(215),
TRIGGER_FETTER_LEVEL_AVATAR_NUM(216),
TRIGGER_SKILLED_AT_RECIPE(217),
TRIGGER_RELIQUARY_UPGRADE_EQUAL_RANK_LEVEL(218),
TRIGGER_SPECIFIED_WEAPON_UPGRADE(219),
TRIGGER_SPECIFIED_WEAPON_AWAKEN(220),
TRIGGER_UNLOCK_SPECIFIC_RECIPE_OR(221),
TRIGGER_POSSESS_MATERIAL_NUM(222),
TRIGGER_EXHIBITION_ACCUMULABLE_VALUE(223),
TRIGGER_EXHIBITION_REPLACEABLE_VALUE_SETTLE_NUM(224),
TRIGGER_ANY_WEAPON_UPGRADE_NUM(225),
TRIGGER_ANY_RELIQUARY_UPGRADE_NUM(226),
TRIGGER_ACTIVITY_SCORE_EXCEED_VALUE(227),
TRIGGER_UNLOCK_SPECIFIC_FORGE_OR(228),
TRIGGER_UNLOCK_SPECIFIC_ANIMAL_CODEX(229),
TRIGGER_OBTAIN_ITEM_NUM(230),
TRIGGER_CAPTURE_ANIMAL(231),
TRIGGER_DAILY_TASK(301),
TRIGGER_RAND_TASK(302),
TRIGGER_AVATAR_EXPEDITION(303),
TRIGGER_FINISH_TOWER_LEVEL(304),
TRIGGER_WORLD_BOSS_REWARD(306),
TRIGGER_FINISH_DUNGEON(307),
TRIGGER_START_AVATAR_EXPEDITION(308),
TRIGGER_OPEN_BLOSSOM_CHEST(309),
TRIGGER_FINISH_BLOSSOM_PROGRESS(310),
TRIGGER_DONE_TOWER_GADGET_UNHURT(311),
TRIGGER_DONE_TOWER_STARS(312),
TRIGGER_DONE_TOWER_UNHURT(313),
TRIGGER_STEAL_FOOD_TIMES(314),
TRIGGER_DONE_DUNGEON_WITH_SAME_ELEMENT_AVATARS(315),
TRIGGER_GROUP_FLIGHT_CHALLENGE_REACH_POINTS(316),
TRIGGER_FINISH_DAILY_DELIVERY_NUM(317),
TRIGGER_TOWER_STARS_NUM(318),
TRIGGER_FINISH_SPECIFED_TYPE_BLOSSOM_NUM(319),
TRIGGER_FINISH_SPECIFED_TYPE_BLOSSOM_CLIMATE_METER(320),
TRIGGER_FINISH_BLOSSOM_GROUP_VARIABLE_GT(321),
TRIGGER_EFFIGY_CHALLENGE_SCORE(322),
TRIGGER_FINISH_ROUTINE(323),
TRIGGER_ACTIVITY_EXPEDITION_FINISH(324),
TRIGGER_ACTIVITY_CHANNELLER_SLAB_FINISH_ALL_CAMP(325),
TRIGGER_ACTIVITY_CHANNELLER_SLAB_FINISH_ALL_ONEOFF_DUNGEON(326),
TRIGGER_ACTIVITY_CHANNELLER_SLAB_LOOP_DUNGEON_TOTAL_SCORE(327),
TRIGGER_GROUP_SUMMER_TIME_SPRINT_BOAT_REACH_POINTS(328),
TRIGGER_WEEKLY_BOSS_KILL(329),
TRIGGER_BOUNCE_CONJURING_FINISH_COUNT(330),
TRIGGER_BOUNCE_CONJURING_SCORE(331),
TRIGGER_GROUP_VARIABLE_SET_VALUE_TO(332),
TRIGGER_KILL_GADGETS_BY_SPECIFIC_SKILL(333),
TRIGGER_KILL_MONSTERS_WITHOUT_VEHICLE(334),
TRIGGER_KILL_MONSTER_IN_AREA(335),
TRIGGER_ENTER_VEHICLE(336),
TRIGGER_VEHICLE_DURATION(337),
TRIGGER_VEHICLE_FRIENDS(338),
TRIGGER_VEHICLE_KILLED_BY_MONSTER(339),
TRIGGER_VEHICLE_DASH(340),
TRIGGER_DO_COOK(401),
TRIGGER_DO_FORGE(402),
TRIGGER_DO_COMPOUND(403),
TRIGGER_DO_COMBINE(404),
TRIGGER_BUY_SHOP_GOODS(405),
TRIGGER_FORGE_WEAPON(406),
TRIGGER_MP_PLAY_BATTLE_WIN(421),
TRIGGER_KILL_GROUP_MONSTER(422),
TRIGGER_CRUCIBLE_ELEMENT_SCORE(423),
TRIGGER_MP_DUNGEON_TIMES(424),
TRIGGER_MP_KILL_MONSTER_NUM(425),
TRIGGER_CRUCIBLE_MAX_BALL(426),
TRIGGER_CRUCIBLE_MAX_SCORE(427),
TRIGGER_CRUCIBLE_SUBMIT_BALL(428),
TRIGGER_CRUCIBLE_WORLD_LEVEL_SCORE(429),
TRIGGER_MP_PLAY_GROUP_STATISTIC(430),
TRIGGER_KILL_GROUP_SPECIFIC_MONSTER(431),
TRIGGER_REACH_MP_PLAY_SCORE(432),
TRIGGER_REACH_MP_PLAY_RECORD(433),
TRIGGER_TREASURE_MAP_DONE_REGION(434),
TRIGGER_SEA_LAMP_MINI_QUEST(435),
TRIGGER_FINISH_FIND_HILICHURL_LEVEL(436),
TRIGGER_COMBINE_ITEM(437),
TRIGGER_FINISH_CHALLENGE_IN_DURATION(438),
TRIGGER_FINISH_CHALLENGE_LEFT_TIME(439),
TRIGGER_MP_KILL_MONSTER_ID_NUM(440),
TRIGGER_LOGIN(501),
TRIGGER_COST_MATERIAL(502),
TRIGGER_DELIVER_ITEM_TO_SALESMAN(503),
TRIGGER_USE_ITEM(504),
TRIGGER_ACCUMULATE_DAILY_LOGIN(505),
TRIGGER_FINISH_CHALLENGE(601),
TRIGGER_MECHANICUS_UNLOCK_GEAR(602),
TRIGGER_MECHANICUS_LEVELUP_GEAR(603),
TRIGGER_MECHANICUS_DIFFICULT(604),
TRIGGER_MECHANICUS_DIFFICULT_SCORE(605),
TRIGGER_MECHANICUS_KILL_MONSTER(606),
TRIGGER_MECHANICUS_BUILDING_POINT(607),
TRIGGER_MECHANICUS_DIFFICULT_EQ(608),
TRIGGER_MECHANICUS_BATTLE_END(609),
TRIGGER_MECHANICUS_BATTLE_END_EXCAPED_LESS_THAN(610),
TRIGGER_MECHANICUS_BATTLE_END_POINTS_MORE_THAN(611),
TRIGGER_MECHANICUS_BATTLE_END_GEAR_MORE_THAN(612),
TRIGGER_MECHANICUS_BATTLE_END_PURE_GEAR_DAMAGE(613),
TRIGGER_MECHANICUS_BATTLE_END_CARD_PICK_MORE_THAN(614),
TRIGGER_MECHANICUS_BATTLE_END_CARD_TARGET_MORE_THAN(615),
TRIGGER_MECHANICUS_BATTLE_END_BUILD_GEAR_MORE_THAN(616),
TRIGGER_MECHANICUS_BATTLE_END_GEAR_KILL_MORE_THAN(617),
TRIGGER_MECHANICUS_BATTLE_END_ROUND_MORE_THAN(618),
TRIGGER_MECHANICUS_BATTLE_END_ROUND(619),
TRIGGER_MECHANICUS_BATTLE_FIN_CHALLENGE_MORE_THAN(620),
TRIGGER_MECHANICUS_BATTLE_WATCHER_FINISH_COUNT(621),
TRIGGER_MECHANICUS_BATTLE_INTERACT_COUNT(622),
TRIGGER_MECHANICUS_BATTLE_DIFFICULT_ESCAPE(623),
TRIGGER_MECHANICUS_BATTLE_DIFFICULT_GEAR_NUM(624),
TRIGGER_MECHANICUS_BATTLE_DIFFICULT_GEAR_ID_NUM(625),
TRIGGER_FLEUR_FAIR_DUNGEON_FINISH_IN_LIMIT_TIME(626),
TRIGGER_FLEUR_FAIR_DUNGEON_FINISH_KEEP_ENERGY(627),
TRIGGER_FLEUR_FAIR_DUNGEON_FINISH_WITH_GROUP_VARIABLE(628),
TRIGGER_FLEUR_FAIR_DUNGEON_FINISH_WITH_BUFF_NUM(629),
TRIGGER_FLEUR_FAIR_DUNGEON_MISSION_FINISH(630),
TRIGGER_FINISH_DUNGEON_AND_CHALLENGE_REMAIN_TIME_GREATER_THAN(631),
TRIGGER_FINISH_DUNGEON_WITH_MIST_TRIAL_STAT(632),
TRIGGER_DUNGEON_MIST_TRIAL_STAT(633),
TRIGGER_DUNGEON_ELEMENT_REACTION_NUM(634),
TRIGGER_LEVEL_AVATAR_FINISH_DUNGEON_COUNT(635),
TRIGGER_CHESS_REACH_LEVEL(636),
TRIGGER_CHESS_DUNGEON_ADD_SCORE(637),
TRIGGER_CHESS_DUNGEON_SUCC_WITH_ESCAPED_MONSTERS_LESS_THAN(638),
TRIGGER_CHESS_DUNGEON_SUCC_WITH_TOWER_COUNT_LESS_OR_EQUAL(639),
TRIGGER_CHESS_DUNGEON_SUCC_WITH_CARD_COUNT_LESS_OR_EQUAL(640),
TRIGGER_CHESS_DUNGEON_SUCC_WITH_CARD_COUNT_GREATER_THAN(641),
TRIGGER_CHESS_KILL_MONSTERS(642),
TRIGGER_CHESS_COST_BUILDING_POINTS(643),
TRIGGER_SUMO_STAGE_SCORE_REACH(644),
TRIGGER_SUMO_TOTAL_MAX_SCORE_REACH(645),
TRIGGER_ROGUE_DESTROY_GADGET_NUM(646),
TRIGGER_ROGUE_KILL_MONSTER_NUM(647),
TRIGGER_ROGUE_FINISH_WITHOUT_USING_SPRING_CELL(649),
TRIGGER_ROGUE_FINISH_ALL_CHALLENGE_CELL(650),
TRIGGER_ROGUE_FINISH_WITH_AVATAR_ELEMENT_TYPE_NUM_LESS_THAN(651),
TRIGGER_ROGUE_FINISH_WITH_AVATAR_NUM_LESS_THAN(652),
TRIGGER_ROGUE_FINISH_NO_AVATAR_DEAD(653),
TRIGGER_ROGUE_SHIKIGAMI_UPGRADE(654),
TRIGGER_ROGUE_CURSE_NUM(655),
TRIGGER_ROGUE_SELECT_CARD_NUM(656),
TRIGGER_FINISH_QUEST_AND(700),
TRIGGER_FINISH_QUEST_OR(701),
TRIGGER_DAILY_TASK_VAR_EQUAL(702),
TRIGGER_QUEST_GLOBAL_VAR_EQUAL(703),
TRIGGER_TALK_NUM(704),
TRIGGER_FINISH_PARENT_QUEST_AND(705),
TRIGGER_FINISH_PARENT_QUEST_OR(706),
TRIGGER_ELEMENT_REACTION_TIMELIMIT_NUM(800),
TRIGGER_ELEMENT_REACTION_TIMELIMIT_KILL_NUM(801),
TRIGGER_ELEMENT_REACTION_TIMELIMIT_DAMAGE_NUM(802),
TRIGGER_ABILITY_STATE_PASS_TIME(803),
TRIGGER_MAX_CRITICAL_DAMAGE(804),
TRIGGER_FULL_SATIATION_TEAM_AVATAR_NUM(805),
TRIGGER_KILLED_BY_CERTAIN_MONSTER(806),
TRIGGER_CUR_AVATAR_HURT(807),
TRIGGER_CUR_AVATAR_ABILITY_STATE(808),
TRIGGER_USE_ENERGY_SKILL_NUM_TIMELIMIT(809),
TRIGGER_SHIELD_SOURCE_NUM(810),
TRIGGER_CUR_AVATAR_HURT_BY_SPECIFIC_ABILITY(811),
TRIGGER_KILLED_BY_SPECIFIC_ABILITY(812),
TRIGGER_MAX_DASH_TIME(900),
TRIGGER_MAX_FLY_TIME(901),
TRIGGER_MAX_FLY_MAP_DISTANCE(902),
TRIGGER_SIT_DOWN_IN_POINT(903),
TRIGGER_DASH(904),
TRIGGER_CLIMB(905),
TRIGGER_FLY(906),
TRIGGER_CITY_REPUTATION_LEVEL(930),
TRIGGER_CITY_REPUTATION_FINISH_REQUEST(931),
TRIGGER_HUNTING_FINISH_NUM(932),
TRIGGER_HUNTING_FAIL_NUM(933),
TRIGGER_OFFERING_LEVEL(934),
TRIGGER_MIRACLE_RING_DELIVER_ITEM(935),
TRIGGER_MIRACLE_RING_TAKE_REWARD(936),
TRIGGER_BLESSING_EXCHANGE_PIC_NUM(937),
TRIGGER_BLESSING_REDEEM_REWARD_NUM(938),
TRIGGER_GALLERY_BALLOON_REACH_SCORE(939),
TRIGGER_GALLERY_FALL_REACH_SCORE(940),
TRIGGER_FLEUR_FAIR_MUSIC_GAME_REACH_SCORE(941),
TRIGGER_MAIN_COOP_SAVE_POINT_AND(942),
TRIGGER_MAIN_COOP_SAVE_POINT_OR(943),
TRIGGER_MAIN_COOP_VAR_EQUAL(944),
TRIGGER_FINISH_ALL_ARENA_CHALLENGE_WATCHER_IN_SCHEDULE(945),
TRIGGER_GALLERY_BUOYANT_COMBAT_REACH_SCORE(946),
TRIGGER_BUOYANT_COMBAT_REACH_NEW_SCORE_LEVEL(947),
TRIGGER_PLACE_MIRACLE_RING(948),
TRIGGER_LUNA_RITE_SEARCH(949),
TRIGGER_GALLERY_FISH_REACH_SCORE(950),
TRIGGER_GALLERY_TRIATHLON_REACH_SCORE(951),
TRIGGER_WINTER_CAMP_SNOWMAN_COMPLEIET(952),
TRIGGER_CREATE_CUSTOM_DUNGEON(953),
TRIGGER_PUBLISH_CUSTOM_DUNGEON(954),
TRIGGER_PLAY_OTHER_CUSTOM_DUNGEON(955),
TRIGGER_FINISH_CUSTOM_DUNGEON_OFFICIAL(956),
TRIGGER_CUSTOM_DUNGEON_OFFICIAL_COIN(957),
TRIGGER_OBTAIN_WOOD_TYPE(1000),
TRIGGER_OBTAIN_WOOD_COUNT(1001),
TRIGGER_UNLOCK_FURNITURE_COUNT(1002),
TRIGGER_FURNITURE_MAKE(1003),
TRIGGER_HOME_LEVEL(1004),
TRIGGER_HOME_COIN(1005),
TRIGGER_HOME_COMFORT_LEVEL(1006),
TRIGGER_HOME_LIMITED_SHOP_BUY(1007),
TRIGGER_FURNITURE_SUITE_TYPE(1008),
TRIGGER_ARRANGEMENT_FURNITURE_COUNT(1009),
TRIGGER_ENTER_SELF_HOME(1010),
TRIGGER_HOME_MODULE_COMFORT_VALUE(1011),
TRIGGER_HOME_ENTER_ROOM(1012),
TRIGGER_HOME_AVATAR_IN(1013),
TRIGGER_HOME_AVATAR_REWARD_EVENT_COUNT(1014),
TRIGGER_HOME_AVATAR_TALK_FINISH_COUNT(1015),
TRIGGER_HOME_AVATAR_REWARD_EVENT_ALL_COUNT(1016),
TRIGGER_HOME_AVATAR_TALK_FINISH_ALL_COUNT(1017),
TRIGGER_HOME_AVATAR_FETTER_GET(1018),
TRIGGER_HOME_AVATAR_IN_COUNT(1019),
TRIGGER_HOME_DO_PLANT(1020),
TRIGGER_ARRANGEMENT_FURNITURE(1021),
TRIGGER_HOME_GATHER_COUNT(1022),
TRIGGER_HOME_FIELD_GATHER_COUNT(1023),
TRIGGER_HOME_UNLOCK_BGM_COUNT(1024),
TRIGGER_FISHING_SUCC_NUM(1100),
TRIGGER_FISHING_KEEP_BONUS(1101),
TRIGGER_EMPTY_FISH_POOL(1102),
TRIGGER_FISHING_FAIL_NUM(1103),
TRIGGER_SHOCK_FISH_NUM(1104),
TRIGGER_PLANT_FLOWER_SET_WISH(1105),
TRIGGER_PLANT_FLOWER_GIVE_FLOWER(1106),
TRIGGER_PLANT_FLOWER_OBTAIN_FLOWER_TYPE(1107),
TRIGGER_PLANT_FLOWER_COMMON_OBTAIN_FLOWER_TYPE(1108),
TRIGGER_FINISH_LANV2_PROJECTION_LEVEL(1111),
TRIGGER_GALLERY_SALVAGE_REACH_SCORE(1112),
TRIGGER_LANV2_FIREWORKS_CHALLENGE_REACH_SCORE(1113),
TRIGGER_POTION_STAGE_LEVEL_PASS_NUM(1115),
TRIGGER_POTION_STAGE_OBTAIN_MEDAL_NUM(1116),
TRIGGER_POTION_STAGE_REACH_TOTAL_SCORE(1117),
TRIGGER_BARTENDER_FINISH_STORY_MODULE(1120),
TRIGGER_BARTENDER_CHALLENGE_MODULE_LEVEL_SCORE(1121),
TRIGGER_BARTENDER_UNLOCK_FORMULA(1122),
TRIGGER_MICHIAE_MATSURI_UNLOCK_CRYSTAL_SKILL_REACH_NUM(1123),
TRIGGER_MICHIAE_MATSURI_FINISH_DARK_CHALLENGE_REACH_NUM(1124),
TRIGGER_CAPTURE_ENV_ANIMAL_REACH_NUM(1125),
TRIGGER_SPICE_MAKE_FORMULA_TIMES(1126),
TRIGGER_SPICE_GIVE_FOOD_TIMES(1127),
TRIGGER_SPICE_MAKE_FORMULA_SUCCESSFUL_TIMES(1128),
TRIGGER_IRODORI_FINISH_FLOWER_THEME(1131),
TRIGGER_IRODORI_FINISH_MASTER_STAGE(1132),
TRIGGER_IRODORI_CHESS_STAGE_REACH_SCORE(1133),
TRIGGER_IRODORI_FINISH_POETRY_THEME(1134),
TRIGGER_PHOTO_FINISH_POS_ID(1135),
TRIGGER_CRYSTAL_LINK_LEVEL_SCORE_REACH(1138),
TRIGGER_CRYSTAL_LINK_TOTAL_MAX_SCORE_REACH(1139);
public int getValue() {
return value;
}
public static WatcherTriggerType getTypeByValue(int value) {
return map.getOrDefault(value, TRIGGER_NONE);
}
public static WatcherTriggerType getTypeByName(String name) {
return stringMap.getOrDefault(name, TRIGGER_NONE);
}
private static final Int2ObjectMap<WatcherTriggerType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, WatcherTriggerType> stringMap = new HashMap<>();
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private final int value;
WatcherTriggerType(int value) {
this.value = value;
}
public static WatcherTriggerType getTypeByValue(int value) {
return map.getOrDefault(value, TRIGGER_NONE);
}
public static WatcherTriggerType getTypeByName(String name) {
return stringMap.getOrDefault(name, TRIGGER_NONE);
}
public int getValue() {
return value;
}
}

View File

@@ -1,69 +1,70 @@
package emu.grasscutter.game.props;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public enum WeaponType {
WEAPON_NONE (0),
WEAPON_SWORD_ONE_HAND (1, 10, 5),
WEAPON_CROSSBOW (2),
WEAPON_STAFF (3),
WEAPON_DOUBLE_DAGGER (4),
WEAPON_KATANA (5),
WEAPON_SHURIKEN (6),
WEAPON_STICK (7),
WEAPON_SPEAR (8),
WEAPON_SHIELD_SMALL (9),
WEAPON_CATALYST (10, 0, 10),
WEAPON_CLAYMORE (11, 0, 10),
WEAPON_BOW (12, 0, 5),
WEAPON_POLE (13, 0, 4);
private final int value;
private int energyGainInitialProbability;
private int energyGainIncreaseProbability;
private static final Int2ObjectMap<WeaponType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, WeaponType> stringMap = new HashMap<>();
static {
Stream.of(values()).forEach(e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
private WeaponType(int value) {
this.value = value;
}
private WeaponType(int value, int energyGainInitialProbability, int energyGainIncreaseProbability) {
this.value = value;
this.energyGainInitialProbability = energyGainInitialProbability;
this.energyGainIncreaseProbability = energyGainIncreaseProbability;
}
WEAPON_NONE(0),
WEAPON_SWORD_ONE_HAND(1, 10, 5),
WEAPON_CROSSBOW(2),
WEAPON_STAFF(3),
WEAPON_DOUBLE_DAGGER(4),
WEAPON_KATANA(5),
WEAPON_SHURIKEN(6),
WEAPON_STICK(7),
WEAPON_SPEAR(8),
WEAPON_SHIELD_SMALL(9),
WEAPON_CATALYST(10, 0, 10),
WEAPON_CLAYMORE(11, 0, 10),
WEAPON_BOW(12, 0, 5),
WEAPON_POLE(13, 0, 4);
public int getValue() {
return value;
}
public int getEnergyGainInitialProbability() {
return energyGainInitialProbability;
}
private static final Int2ObjectMap<WeaponType> map = new Int2ObjectOpenHashMap<>();
private static final Map<String, WeaponType> stringMap = new HashMap<>();
public int getEnergyGainIncreaseProbability() {
return energyGainIncreaseProbability;
}
static {
Stream.of(values())
.forEach(
e -> {
map.put(e.getValue(), e);
stringMap.put(e.name(), e);
});
}
public static WeaponType getTypeByValue(int value) {
return map.getOrDefault(value, WEAPON_NONE);
}
public static WeaponType getTypeByName(String name) {
return stringMap.getOrDefault(name, WEAPON_NONE);
}
private final int value;
private int energyGainInitialProbability;
private int energyGainIncreaseProbability;
WeaponType(int value) {
this.value = value;
}
WeaponType(int value, int energyGainInitialProbability, int energyGainIncreaseProbability) {
this.value = value;
this.energyGainInitialProbability = energyGainInitialProbability;
this.energyGainIncreaseProbability = energyGainIncreaseProbability;
}
public static WeaponType getTypeByValue(int value) {
return map.getOrDefault(value, WEAPON_NONE);
}
public static WeaponType getTypeByName(String name) {
return stringMap.getOrDefault(name, WEAPON_NONE);
}
public int getValue() {
return value;
}
public int getEnergyGainInitialProbability() {
return energyGainInitialProbability;
}
public int getEnergyGainIncreaseProbability() {
return energyGainIncreaseProbability;
}
}