Compare commits

..

537 Commits

  • Fix issues with regions (#2177)
    Luckily, SceneRegion and TriggerExcelConfigData both have group numbers, so we can use those to differentiate regions!
  • Merge remote-tracking branch 'origin/unstable' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/game/ability/actions/ActionAvatarSkillStart.java
    #	src/main/java/emu/grasscutter/game/entity/EntityAvatar.java
  • Quick fix for questing, needs more investigation
    This would make the questing work again
  • Merge remote-tracking branch 'origin/unstable' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/game/entity/EntityWeapon.java
  • Merge remote-tracking branch 'origin/unstable' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/auth/DefaultAuthenticators.java
    #	src/main/java/emu/grasscutter/game/ability/AbilityManager.java
  • Merge remote-tracking branch 'origin/unstable' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/server/http/documentation/HandbookHandler.java
  • 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>
  • 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>
  • Merge remote-tracking branch 'origin/unstable' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/data/excels/MonsterSpecialNameData.java
  • Merge branch 'development' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/data/GameData.java
    #	src/main/java/emu/grasscutter/data/excels/monster/MonsterData.java
    #	src/main/java/emu/grasscutter/data/excels/monster/MonsterDescribeData.java
    #	src/main/java/emu/grasscutter/game/entity/EntityMonster.java
  • 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.
  • Implement fetching a player across servers & Add a chainable JsonObject
    useful for plugins! might be used in grasscutter eventually
  • Fix protocol definitions
    thank you Nazrin! (+ hiro for raw definitions)
  • Add initial startup message
    this is so the server appears like its preparing to start
  • Partially fix Chasing Shadows (#2159)
    * Partially fix Chasing Shadows
    
    * Go ahead and move it before the return before Magix tells me to.
  • fix NPC talk triggering main quest in 46101 (#2158)
    Make it so that only talks where the param matches the talkId are checked.
  • 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
  • Add/fix colors
    also fix tailwind
  • format imports
    this is really just to see if build handbook works kek
  • 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>
  • Separate the dispatch and game servers (pt. 3)
    implement handbook across servers!
  • Separate the dispatch and game servers (pt. 2)
    this commit fixes the gacha page
  • Separate the dispatch and game servers (pt. 1)
    gacha is still broken, handbook still needs to be done
  • Update translation (#2150)
    * Update translation
    
    * Update translation
  • Implement handbook teleporting
    also a few formatting changes and sort data by logical sense
  • 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>
  • Merge remote-tracking branch 'origin/unstable' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/game/talk/TalkManager.java
  • Fully fix fairy clock (#2146)
    * Fix scene transition
    
    * fully fix fairy clock
  • Merge pull request #2107 from Grasscutters/unstable-quests
    Merge `unstable-quests` into `unstable`
  • Remove setting the dungeon ID
    dungeon ID and dungeon enter will break things
  • Merge branch 'unstable' into unstable-quests
    # Conflicts:
    #	.gitignore
    #	src/generated/main/java/emu/grasscutter/net/proto/ABJDNCBDEKIOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AKFPAANICKGOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityActionGenerateElemBallOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityAppliedAbilityOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityAppliedModifierOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityAttachedModifierOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityControlBlockOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityEmbryoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityIdentifierOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityInvocationsNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityInvokeArgumentOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityInvokeEntryHeadOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityInvokeEntryOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityMetaAddAbilityOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityMetaModifierChangeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityMetaModifierDurabilityChangeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityMetaReInitOverrideMapOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityMixinRecoverInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityScalarTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityScalarValueEntryOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityStringOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilitySyncStateInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AchievementAllDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AchievementOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AchievementUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityPushTipsDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityPushTipsStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityScheduleInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityScheduleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityShopSheetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityTakeWatcherRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityTakeWatcherRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityUpdateWatcherNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityWatcherInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddBackupAvatarTeamReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddBackupAvatarTeamRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddNoGachaAvatarCardNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddNoGachaAvatarCardTransferItemOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddQuestContentProgressReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddQuestContentProgressRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AdjustTrackingInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AiSkillCdInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AiSyncInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AiThreatInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AkaFesDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AllWidgetDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AnchorPointDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AnimatorParameterValueInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AnimatorParameterValueInfoPairOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AnnounceDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AntiAddictNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ArenaChallengeActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ArenaChallengeMonsterLevelOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AskAddFriendNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AskAddFriendReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AskAddFriendRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AsterActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AsterLargeDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AsterLittleDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AsterLittleStageStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AsterMidCampInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AsterMidDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AsterProgressDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AttackHitEffectResultOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AttackResultOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarAddNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarChangeCostumeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarChangeCostumeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarChangeCostumeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarChangeElementTypeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarChangeElementTypeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarDelNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarDieAnimationEndReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarDieAnimationEndRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarEnterSceneInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarEquipAffixInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarEquipAffixStartNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarEquipChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExcelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionAllDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionAllDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionCallBackReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionCallBackRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionGetRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionGetRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionStartReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionStartRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFetterDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFetterInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFightPropNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFightPropUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFlycloakChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFollowRouteNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarGainCostumeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarGainFlycloakNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarLifeStateChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarPromoteReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarPromoteRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarPropChangeReasonNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarPropNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarRenameInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarRenameInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSatiationDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSatiationDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillDepotChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillMaxChargeCountNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillUpgradeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillUpgradeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarTeamAllDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarTeamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarTeamResonanceInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarTeamUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarUnlockTalentNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarUpgradeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarUpgradeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarWearFlycloakReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarWearFlycloakRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BEAMFIKPMLEOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BackMyWorldRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BartenderActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BartenderLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BartenderTaskInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BatchBuyGoodsReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BatchBuyGoodsRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassAllDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassCurScheduleUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassCycleOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassMissionDelNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassMissionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassMissionUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassProductOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassRewardTagOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassRewardTakeOptionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassScheduleOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassUnlockStatusOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BirthdayOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BlessingActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BlitzRushActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BlitzRushStageOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BlockInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BlossomBriefInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BlossomBriefInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BlossomChestInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BonusActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BonusActivityInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BonusActivityInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BonusOpActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BossChestInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BounceConjuringActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BounceConjuringChapterInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutActionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutBrickInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutElementReactionCounterOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutPhysicalObjectModifierOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutPhysicalObjectOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutSnapShotOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutSpawnPointOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutSyncConnectUidInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutVector2OuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BrickBreakerActivityStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BrickBreakerDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BrickBreakerLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuoyantCombatDailyInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuoyantCombatDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyBattlePassLevelReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyBattlePassLevelRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyGoodsParamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyGoodsReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyGoodsRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyResinReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyResinRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CFFFGFFKINKOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CKMJBOGJFMBOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CalcWeaponUpgradeReturnItemsReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CalcWeaponUpgradeReturnItemsRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CanUseSkillNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CancelFinishParentQuestNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CardProductRewardNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChallengeBriefOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChallengeDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChallengeFinishTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeAvatarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeAvatarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeEnergyReasonOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeGameTimeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeGameTimeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeHpReasonOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeMailStarNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeMpTeamAvatarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeMpTeamAvatarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeTeamNameReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeTeamNameRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannelerSlabActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannelerSlabCampOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannelerSlabChallengeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannelerSlabChallengeStageOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannelerSlabOneoffDungeonOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannellerSlabAssistInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannellerSlabBuffInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannellerSlabBuffSchemeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannellerSlabLoopDungeonInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannellerSlabLoopDungeonResultInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannellerSlabLoopDungeonStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChapterStateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChapterStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CharAmusementAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CharAmusementDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CharAmusementStageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChatEmojiCollectionDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChatInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CheckAddItemExceedLimitNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CheckUgcStateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CheckUgcStateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CheckUgcUpdateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CheckUgcUpdateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChessActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChildQuestOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChooseCurAvatarTeamReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChooseCurAvatarTeamRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CityReputationQuestInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientAIStateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientAbilityChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientAbilityInitFinishNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientCollectorDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientInputTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientLoadingCostumeVerificationNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientLockGameTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CloseCommonTipsNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClosedItemNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CodexDataFullNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CodexDataUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CodexTypeDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CodexTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CoinCollectDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CoinCollectLevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CoinCollectOperatorInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CoinCollectTeamAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CoinCollectTeamInfoDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombatInvocationsNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombatInvokeEntryOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombatTypeArgumentOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombineDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombineFormulaDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombineReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombineRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CompoundBoostTakeStatusTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CompoundDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CompoundQueueDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CookDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CookRecipeDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CookRecipeDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CoopCgOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CoopChapterOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CoopPointOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CoopRewardOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CreateEntityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CreateGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CreateVehicleReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CreateVehicleRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CrucibleActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CrucibleBattleUidInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CrystalLinkActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CrystalLinkAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CrystalLinkBuffInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CrystalLinkDungeonAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CrystalLinkDungeonSettleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CrystalLinkLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CrystalLinkTeamInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CurVehicleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CustomCommonNodeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CustomDungeonFinishTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CustomDungeonResultInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CustomGadgetTreeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CutSceneBeginNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CutSceneExtraParamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DKFDACEPNALOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyDungeonEntryInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskFilterCityReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskFilterCityRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskProgressNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskUnlockedCitiesNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DataResVersionNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DealAddFriendReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DealAddFriendResultTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DealAddFriendRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DelBackupAvatarTeamReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DelBackupAvatarTeamRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DelMailReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DelMailRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DelTeamEntityNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DeleteFriendNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DeleteFriendReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DeleteFriendRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DeliveryActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DeshretObeliskGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DestroyMaterialReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DestroyMaterialRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DigActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DigMarkPointOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DoGachaReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DoGachaRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DoSetPlayerBornDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DragonSpineActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DragonSpineChapterInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DropHintNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DropItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DropItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DuelHeartDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DuelHeartLevelDifficultyInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DuelHeartLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonCandidateTeamChangeAvatarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonCandidateTeamChangeAvatarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonChallengeBeginNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonChallengeFinishNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonEnterPosInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonEntryInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonEntryInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonEntryInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonEntryPointInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonPlayerDieNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonPlayerDieReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonPlayerDieRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonSettleExhibitionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonSettleNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonShowReminderNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonSlipRevivePointActivateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonSlipRevivePointActivateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonWayPointActivateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonWayPointActivateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonWayPointNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EchoShellDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EchoShellInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EffigyActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EffigyChallengeDungeonResultInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EffigyChallengeV2DetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EffigyChallengeV2LevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EffigyChallengeV2SettleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EffigyDailyInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ElectroherculesBattleDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ElectroherculesBattleLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ElectroherculesBattleStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EndCameraSceneLookNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterSceneDoneReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterSceneDoneRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterScenePeerNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterSceneReadyReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterSceneReadyRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterTransPointRegionNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterTrialAvatarActivityDungeonReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterTrialAvatarActivityDungeonRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterWorldAreaReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterWorldAreaRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityAbilityInvokeEntryOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityAiSyncNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityAuthorityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityClientDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityClientExtraInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityEnvironmentInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityFightPropChangeReasonNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityFightPropUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityMoveInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityRendererChangedInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EquipOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EquipParamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EquipRoguelikeRuneReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EquipRoguelikeRuneRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAiSyncCombatThreatInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAiSyncSkillCdNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAnimatorParameterInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAvatarLockChairReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAvatarLockChairRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAvatarSitDownNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAvatarStandUpNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtBeingHitInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtCreateGadgetNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtDestroyGadgetNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtDoSkillSuccNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtEntityRenderersChangedNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ExecuteGadgetLuaReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ExecuteGadgetLuaRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ExhibitionDisplayInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ExitTransPointRegionNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ExpeditionActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ExpeditionChallengeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ExpeditionPathInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ExpeditionStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FEEHAOJCNCGOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FeatureBlockInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FetterDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FightPropPairOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FindHilichurlAcceptQuestNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FindHilichurlDayContentInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FindHilichurlDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FindHilichurlFinishSecondQuestNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FinishedParentQuestNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FinishedParentQuestUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FishPoolInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FishtankFishInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairBalloonInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairChapterInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairDungeonSectionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairFallInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairMinigameInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairMusicGameInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairMusicGameSettleReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairMusicGameSettleRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairMusicGameStartReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairMusicGameStartRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairMusicRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairV2DetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairV2MusicGameInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairV2PacmanInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairV2PhotoInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairV2PhotoPosDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairV2StageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FlightActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FlightDailyRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForceUpdateInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeFormulaDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeGetQueueDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeGetQueueDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeQueueDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeQueueDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeQueueManipulateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeQueueManipulateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeQueueManipulateTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeStartReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeStartRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForwardTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FoundationInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FoundationStatusOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FriendBriefOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FriendEnterHomeOptionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FriendOnlineStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FungusDetailOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FungusFighterDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FungusFighterMonsterDetailOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FungusFighterV2DetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FungusFighterV2LevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FungusFighterV2SettleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FungusPlotStageDetailOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FungusTrainingDungeonDetailOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FungusTrainingMonsterPreviewDetailOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FungusTrainingPoolPreviewDetailOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FungusTrainingProgressDetailOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureCurModuleArrangeCountNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeBeHelpedDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeBeHelpedNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeCancelReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeCancelRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeFinishNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeHelpDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeHelpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeHelpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeMakeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeSlotOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeStartReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeStartRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GCGFestivalDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GCGTCTavernChallengeDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GCGTCTavernChallengeDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaItemOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaOpenWishNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaStageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaTransferItemOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaUpInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaWishReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaWishRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetAutoPickDropInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetBornTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetCrucibleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetGeneralRewardInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetInteractReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetInteractRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetPlayInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetStateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GalleryStopReasonOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GameplayRecommendationElementReliquaryRequestOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GameplayRecommendationElementReliquaryResponseOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GameplayRecommendationReliquaryMainPropDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GameplayRecommendationReliquaryRequestOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GameplayRecommendationReliquaryResponseOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GatherGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GearActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GearLevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetActivityInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetActivityInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllH5ActivityInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllH5ActivityInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllMailNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllMailReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllMailResultNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllMailRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllUnlockNameCardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllUnlockNameCardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAuthkeyReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAuthkeyRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetBlossomBriefInfoListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetBlossomBriefInfoListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetChatEmojiCollectionReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetChatEmojiCollectionRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetCompoundDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetCompoundDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetDailyDungeonEntryInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetDailyDungeonEntryInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetFriendShowAvatarInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetFriendShowAvatarInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetFriendShowNameCardInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetFriendShowNameCardInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetFurnitureCurModuleArrangeCountReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetGachaInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetGachaInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetHomeExchangeWoodInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetHomeLevelUpRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetHomeLevelUpRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetInvestigationMonsterReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetInvestigationMonsterRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetMailItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetMailItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetMapAreaRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOnlinePlayerInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOnlinePlayerInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOnlinePlayerListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOnlinePlayerListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOpActivityInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOpActivityInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetParentQuestVideoKeyReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetParentQuestVideoKeyRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerAskFriendListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerAskFriendListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerBlacklistRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerFriendListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerFriendListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerHomeCompInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerSocialDetailReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerSocialDetailRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerTokenReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerTokenRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetQuestLackingResourceReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetQuestLackingResourceRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetQuestTalkHistoryReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetQuestTalkHistoryRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetRegionSearchReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetSceneAreaReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetSceneAreaRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetScenePointReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetScenePointRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetShopReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetShopRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetShopmallDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetShopmallDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetUgcBriefInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetUgcBriefInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetUgcReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetUgcRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetUgcTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetWidgetSlotReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetWidgetSlotRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetWorldMpInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetWorldMpInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GravenInnocenceCampInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GravenInnocenceCampStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GravenInnocenceCarveInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GravenInnocenceCarveStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GravenInnocenceDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GravenInnocencePhotoInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GravenInnocencePhotoObjectInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GravenInnocencePhotoStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GravenInnocenceRaceInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GravenInnocenceRaceLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GroupSuiteNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GroupUnloadNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/H5ActivityIdsNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/H5ActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HDOMFAKCLHGOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HOKJIFJPJLBOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HachiActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HachiStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HideAndSeekActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HideAndSeekMapInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HitColliderTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HitCollisionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HitTreeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeAllUnlockedBgmIdListNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeAnimalDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBasicInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBasicInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBlockArrangementInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBlockDotPatternOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBlockFieldDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBlockSubFieldDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeBgmNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeBgmReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeBgmRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeEditModeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeEditModeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeModuleReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeModuleRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChooseModuleReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChooseModuleRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeComfortInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeCustomFurnitureInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeCustomFurnitureInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeEditCustomFurnitureReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeEditCustomFurnitureRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeEnterEditModeFinishReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeEnterEditModeFinishRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeFurnitureCustomSuiteDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeFurnitureDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeFurnitureGroupDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeFurnitureSuiteDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGetArrangementInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGetArrangementInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGetBasicInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGetOnlineStatusReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGetOnlineStatusRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGroupPlayerInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopBuyGoodsReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopBuyGoodsRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopGoodsListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopGoodsListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopGoodsOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopInfoChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeMarkPointFurnitureDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeMarkPointNPCDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeMarkPointNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeMarkPointSceneDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeMarkPointSuiteDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeModuleComfortInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeModuleSeenReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeModuleSeenRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeModuleUnlockNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeNewUnlockedBgmIdListNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeNpcDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomePlantFieldStatusOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomePreChangeEditModeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceTakeFetterExpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceTakeFetterExpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceTakeHomeCoinReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceTakeHomeCoinRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSceneArrangementInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSceneInitFinishReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSceneInitFinishRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSceneJumpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSceneJumpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSeekFurnitureAllRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSeekFurnitureGalleryScoreNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSeekFurnitureOneRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSeekFurniturePlayerScoreOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeUpdateArrangementInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeUpdateArrangementInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HostPlayerNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InferencePageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InfernceWordInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InstableSprayAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InstableSprayDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InstableSprayDungeonSettleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InstableSprayStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InstableSprayTeamInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InterOpTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InteractTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InvestigationMonsterOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InvestigationMonsterUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InvestigationOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InvestigationQuestDailyNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InvestigationReadQuestDailyNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InvestigationTargetOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriChessDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriChessEntranceDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriChessEntranceInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriChessEquipCardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriChessEquipCardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriChessLevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriChessMapDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriChessMonsterInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriFlowerDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriMasterLevelDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriMasterLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriPoetryDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriPoetryThemeDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IslandPartyDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IslandPartyStageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemAddHintNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemCdGroupTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemGivingReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemGivingRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemHintOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemParamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemRenameAvatarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemRenameAvatarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/JAAACKLMLHIOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/JILBANAJEEFOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/JKFJFNMCNDNOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/JNMLLBGCBOBOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/JigsawPictureDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LCMFDAHJIBKOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LLBFJGELKIBOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LanternProjectionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LanternProjectionLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LanternRiteActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LanternRiteFireworksChallengeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LanternRiteFireworksInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LanternRiteFireworksStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LevelupCityReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LifeStateChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LockedPersonallineDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LuminanceStoneChallengeActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LunaRiteAreaInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LunaRiteDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LunaRiteHintPointOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LunaRiteHintPointTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LunaRiteHintStatusTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LunchBoxDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MPLevelEntityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MailChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MailCollectStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MailDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MailItemOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MailTextContentOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MapAreaInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MapMarkFromTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MapMarkPointOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MapMarkPointTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MarkMapReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MarkMapRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MarkNewNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MarkTargetInvestigationMonsterNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MassivePropParamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MassivePropSyncInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialDeleteInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialDeleteReturnNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialDeleteReturnTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialDeleteUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MathQuaternionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/McoinExchangeHcoinReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/McoinExchangeHcoinRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MichiaeMatsuriActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MichiaeMatsuriChallengePositionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MichiaeMatsuriChestPositionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MichiaeMatsuriStageOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MiracleRingDeliverItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MiracleRingDeliverItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MistTrialActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MistTrialBestAvatarOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MistTrialLevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ModifierActionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ModifierDurabilityOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ModifierPropertyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MonsterAIConfigHashNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MonsterBornTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MonsterPointArrayRouteUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MonsterRouteOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MoonfinTrialActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MoonfinTrialLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MotionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MotionStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MovingPlatformTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MpPlayRewardInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MpSettingTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MuqadasPotionActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MuqadasPotionDungeonSettleNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MuqadasPotionLevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameSettleReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameSettleRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameStartReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameStartRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/NightCrowGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/NpcTalkReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/NpcTalkRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ObstacleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ObstacleModifyNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OfferingInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OfficialCustomDungeonOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OneoffGatherPointDetectorDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OnlinePlayerInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OpActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OpenStateChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OpenStateUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PGHIDDKHGALOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PIHDFMDILLFOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PSPlayerApplyEnterMpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PSPlayerApplyEnterMpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PacmanSettleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ParamListOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ParentQuestInferenceDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ParentQuestOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ParentQuestRandomInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ParkourLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PathfindingEnterSceneReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PathfindingEnterSceneRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PersonalLineAllDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PersonalLineAllDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PersonalSceneJumpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PersonalSceneJumpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PhotoActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PhotoPosDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PingReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PingRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlantFlowerActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlatformChangeRouteNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlatformInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlatformStartRouteNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlatformStopRouteNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlatformTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayTeamEntityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpResultNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpResultReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpResultRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerChatNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerChatReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerChatRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCompoundMaterialBoostReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCompoundMaterialBoostRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCompoundMaterialReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCompoundMaterialRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCookArgsReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCookArgsRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCookReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCookRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerDieTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerEnterDungeonReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerEnterDungeonRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerEnterSceneInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerEnterSceneNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerForceExitRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerGameTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerGetForceQuitBanInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerGetForceQuitBanInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerHomeCompInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerHomeCompInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerInvestigationAllInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerInvestigationNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerInvestigationTargetNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerLevelRewardUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerLocationInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerLoginReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerLoginRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerPropChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerPropChangeReasonNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerPropNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerQuitDungeonReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerRTTInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerSetPauseReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerSetPauseRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerStoreNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerWidgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerWorldLocationInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerWorldSceneInfoListNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerWorldSceneInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PostEnterSceneReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PostEnterSceneRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PotionActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PotionAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PotionDungeonResultInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PotionLevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PotionStageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PrivateChatNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PrivateChatReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ProfilePictureChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ProfilePictureOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PropChangeReasonOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PropPairOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PropValueOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ProtEntityTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ProudSkillChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ProudSkillExtraLevelNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PullPrivateChatReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PullPrivateChatRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PullRecentChatReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PullRecentChatRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryCodexMonsterBeKilledNumReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryCodexMonsterBeKilledNumRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryCurrRegionHttpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryFilterOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryPathReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryPathRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryRegionListHttpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestCreateEntityReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestCreateEntityRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestDelNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestDestroyEntityReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestDestroyEntityRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestDestroyNpcReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestDestroyNpcRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestGlobalVarNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestGlobalVarOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestListNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestListUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestProgressUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestRenameAvatarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestRenameAvatarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestTransmitReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestTransmitRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestUpdateQuestTimeVarNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestUpdateQuestVarNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestUpdateQuestVarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestUpdateQuestVarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestVarOpOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuickUseWidgetRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReadMailNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReadPrivateChatReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReceivedTrialAvatarActivityRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReceivedTrialAvatarActivityRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RecordUsageOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RegionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RegionSimpleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryDecomposeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryDecomposeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryFilterStateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryFilterStateSaveNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryPromoteReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryPromoteRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryUpgradeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryUpgradeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ResVersionConfigOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ResinChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ResinCostTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RobotPushPlayerDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RockBoardExploreDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RockBoardExploreStageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueDiaryActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueDiaryAvatarDisableStatusOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueDiaryDungeonRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueDiaryDungeonSettleNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueDiaryProgressOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueDiaryStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueShowAvatarTeamInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RoguelikeDungeonActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RoguelikeDungeonSettleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RoguelikeGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RoguelikeRuneRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RoguelikeSettleCoinInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RoguelikeShikigamiRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RouteOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RoutePointChangeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RoutePointOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalesmanActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalesmanDeliverItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalesmanDeliverItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalesmanStatusTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalvageBundleChallengeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalvageChallengeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalvageScoreChallengeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalvageStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SandwormCannonDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SaveUgcReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SaveUgcRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneAreaUnlockNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneAreaWeatherNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneAudioNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneAvatarStaminaStepReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityAiInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityAppearNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityDisappearNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityDrownReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityDrownRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityMoveNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneFishInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneForceLockNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneForceUnlockNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneGalleryHomeSeekFurnitureInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneInitFinishRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneKickPlayerReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneKickPlayerRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneMonsterInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneNpcInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ScenePlayerInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ScenePlayerInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ScenePlayerLocationNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ScenePlayerSoundNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ScenePointUnlockNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneReliquaryInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneRouteChangeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneRouteChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneTeamAvatarOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneTeamUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneTransToPointReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneTransToPointRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneWeaponInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ScreenInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampContributeItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampContributeItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampSectionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampV3CampInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampV3CampStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampV3DetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampV3RaceInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampV3RaceLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampV3ShadowInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampV3ShadowLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampV3ShadowStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeeMonsterReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SelectWorktopOptionReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SelectWorktopOptionRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServantInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerAnnounceNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerAnnounceRevokeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerBuffChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerBuffOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerCondMeetQuestListUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerGlobalValueChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetBattlePassViewedReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetBattlePassViewedRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetChatEmojiCollectionReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetChatEmojiCollectionRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetEntityClientDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetEquipLockStateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetEquipLockStateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetFriendEnterHomeOptionReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetFriendEnterHomeOptionRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetIsAutoUnlockSpecificEquipReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetIsAutoUnlockSpecificEquipRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetNameCardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetNameCardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetOpenStateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetOpenStateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerBirthdayReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerBirthdayRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerBornDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerBornDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerHeadImageReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerHeadImageRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerNameReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerNameRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerPropReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerPropRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerSignatureReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerSignatureRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetUpAvatarTeamReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetUpAvatarTeamRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetUpLunchBoxWidgetReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetUpLunchBoxWidgetRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetWidgetSlotReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetWidgetSlotRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShopCardProductOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShopConcertProductOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShopGoodsOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShopMcoinProductOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShopOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShortAbilityHashPairOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShowAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShowClientGuideNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShowCommonTipsNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShowEquipOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SkipPlayerGameTimeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SkipPlayerGameTimeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SkyCrystalDetectorDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SkyCrystalDetectorQuickUseResultOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SocialDetailOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SocialShowAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SorushTrialDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SpiceActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SpiceStageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StatueGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StopServerInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StoreItemChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StoreItemDelNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StoreTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StoreWeightLimitNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StrengthenPointDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SummerTimeDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SummerTimeDungeonInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SummerTimeSprintBoatInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SummerTimeSprintBoatRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SummerTimeStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SummerTimeV2BoatStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SummerTimeV2DetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SummerTimeV2DungeonSettleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SummerTimeV2DungeonStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SumoActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SumoAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SumoDungeonSettleNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SumoStageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SumoTeamDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SyncScenePlayTeamEntityNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SyncTeamEntityNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeAchievementGoalRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeAchievementGoalRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeAchievementRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeAchievementRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBackGivingItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBackGivingItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBattlePassMissionPointReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBattlePassMissionPointRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBattlePassRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBattlePassRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeCityReputationParentQuestReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeCityReputationParentQuestRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeCompoundOutputReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeCompoundOutputRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeFurnitureMakeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeFurnitureMakeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeInvestigationRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeInvestigationRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeInvestigationTargetRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeInvestigationTargetRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeMaterialDeleteReturnReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeMaterialDeleteReturnRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakePlayerLevelRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakePlayerLevelRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeoffEquipReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeoffEquipRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TanukiTravelActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TanukiTravelFinishGuideQuestNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TanukiTravelLevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TeamChainChooseAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TeamChainDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TeamChainSettleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TeamChainStageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TeamEnterSceneInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TeamEntityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ToTheMoonEnterSceneReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ToTheMoonQueryPathReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ToTheMoonQueryPathRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerAllDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerAllDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerBriefDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerCurLevelRecordChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerCurLevelRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerEnterLevelReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerEnterLevelRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerFloorRecordChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerFloorRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerLevelEndNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerLevelRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerLevelStarCondDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerLevelStarCondNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerMiddleLevelChangeTeamNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerMonthlyBriefOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerTeamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerTeamSelectReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerTeamSelectRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TrackingIOInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TreasureMapActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TreasureMapBonusChallengeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TreasureMapRegionInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TreasureMapRegionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TreasureSeelieActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TreasureSeelieRegionDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TrialAvatarActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TrialAvatarActivityRewardDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TrialAvatarFirstPassDungeonNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TrialAvatarGrantRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TrialAvatarInDungeonIndexNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TrialAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TriggerCreateGadgetToEquipPartNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TryEnterHomeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TryEnterHomeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcMusicBriefInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcMusicNoteOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcMusicRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcMusicTrackOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/Uint32PairOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnionCmdNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnionCmdOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockAvatarTalentReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockAvatarTalentRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockNameCardNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockPersonalLineReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockPersonalLineRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockTransPointReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockTransPointRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockedFurnitureFormulaDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockedFurnitureSuiteDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UpdateAbilityCreatedMovingPlatformNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UpdatePlayerShowAvatarListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UpdatePlayerShowAvatarListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UpdatePlayerShowNameCardListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UpdatePlayerShowNameCardListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UseItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UseItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/Vector3IntOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VectorOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VectorPlaneOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleInteractReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleInteractRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleInteractTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleLocationInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleMemberOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleStaminaNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageBoothUsedItemDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageCampChallengeLevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageCampChallengeStageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageHuntingStageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageMarketDealInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageMarketDeliverItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageMarketDeliverItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageMarketInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageMarketStoreInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageMarketTraderInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintagePresentLevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintagePresentStageDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VisionTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WaterSpiritActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponAwakenReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponAwakenRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponPromoteReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponPromoteRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponUpgradeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponUpgradeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WearEquipReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WearEquipRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeatherInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeatherWizardDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeekendDjinnInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeeklyBossResinDiscountInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetCoolDownDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetCoolDownNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetCreateLocationInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetCreatorInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetCreatorOpTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetDoBagReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetDoBagRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetGadgetAllDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetGadgetDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetGadgetDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetSlotChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetSlotDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetSlotOpOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetSlotTagOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WindFieldDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WindFieldDungeonFailReasonOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WindFieldDungeonSettleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WindFieldStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WindSeedClientNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WindSeedType1NotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampAcceptAllGiveItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampAcceptAllGiveItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampAcceptGiveItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampAcceptGiveItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampAcceptItemResultInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGetCanGiveFriendItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGetCanGiveFriendItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGetRecvItemListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGetRecvItemListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGiveFriendItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGiveFriendItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampRaceStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampRecvItemDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampRecvItemNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorktopInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorktopOptionNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldChestOpenNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldOwnerBlossomBriefInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldOwnerDailyTaskNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerDieNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerLocationNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerRTTNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerReviveReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerReviveRspOuterClass.java
    #	src/main/java/emu/grasscutter/GameConstants.java
    #	src/main/java/emu/grasscutter/Grasscutter.java
    #	src/main/java/emu/grasscutter/command/commands/SetPropCommand.java
    #	src/main/java/emu/grasscutter/config/ConfigContainer.java
    #	src/main/java/emu/grasscutter/config/Configuration.java
    #	src/main/java/emu/grasscutter/data/excels/ItemData.java
    #	src/main/java/emu/grasscutter/data/excels/SceneData.java
    #	src/main/java/emu/grasscutter/game/dungeons/DungeonSystem.java
    #	src/main/java/emu/grasscutter/game/managers/ResinManager.java
    #	src/main/java/emu/grasscutter/game/player/Player.java
    #	src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java
    #	src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java
    #	src/main/java/emu/grasscutter/server/packet/recv/HandlerCombatInvocationsNotify.java
    #	src/main/java/emu/grasscutter/tools/Dumpers.java
    #	src/main/java/emu/grasscutter/utils/Crypto.java
    #	src/main/java/emu/grasscutter/utils/FileUtils.java
    #	src/main/java/emu/grasscutter/utils/Language.java
    #	src/main/java/emu/grasscutter/utils/StartupArguments.java
    #	src/main/java/emu/grasscutter/utils/Utils.java
  • Implement game time locking
    implement for quests
  • Run spotlessApply
    also set line endings to native, no more line conflict errors!
  • Revert final's added by 15e2f3ca34 (#2144)
    * Revert final's added by 15e2f3ca34
    
    * Apply suggestions from code review
    
    Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>
    
    * Apply suggestions from code review
    
    Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>
  • Partially fix fairy clock (#2143)
    updatePlayerGameTime() expects time since game start not since day start.
  • Revert "Run spotlessApply"
    This reverts commit d67e2d0c5e.
  • Implement hiding in-game icons
    this will also enable exception showing if 'DEBUG' is enabled
  • Merge pull request Grasscutter-Quests#53
    'Updated with how talks are handle' by `mjolsic`
  • Mark dungeons as completed and trigger the event
    the event & completion were moved to the same location
  • Merge branch 'development' into unstable
    # Conflicts:
    #	build.gradle
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityActionGenerateElemBallOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityAppliedAbilityOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityAppliedModifierOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityAttachedModifierOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityControlBlockOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityEmbryoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityIdentifierOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityInvocationsNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityInvokeArgumentOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityInvokeEntryHeadOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityInvokeEntryOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityMetaModifierChangeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityMetaReInitOverrideMapOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityMixinRecoverInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityScalarTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityScalarValueEntryOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilityStringOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AbilitySyncStateInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AchievementAllDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AchievementOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AchievementUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityPushTipsDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityPushTipsStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityScheduleInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityScheduleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityShopSheetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityTakeWatcherRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityTakeWatcherRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityUpdateWatcherNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ActivityWatcherInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddBackupAvatarTeamReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddBackupAvatarTeamRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddNoGachaAvatarCardNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddNoGachaAvatarCardTransferItemOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddQuestContentProgressReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AddQuestContentProgressRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AdjustTrackingInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AiSkillCdInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AiSyncInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AiThreatInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AllWidgetDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AnchorPointDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AnimatorParameterValueInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AnimatorParameterValueInfoPairOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AnnounceDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AskAddFriendNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AskAddFriendReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AskAddFriendRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AttackHitEffectResultOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AttackResultOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarAddNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarChangeCostumeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarChangeCostumeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarChangeCostumeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarChangeElementTypeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarChangeElementTypeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarDieAnimationEndReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarDieAnimationEndRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarEnterSceneInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarEquipAffixInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarEquipAffixStartNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarEquipChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExcelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionAllDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionAllDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionCallBackReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionCallBackRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionGetRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionGetRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionStartReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionStartRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarExpeditionStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFetterDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFetterInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFightPropNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFightPropUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFlycloakChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarFollowRouteNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarGainCostumeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarGainFlycloakNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarLifeStateChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarPromoteReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarPromoteRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarPropChangeReasonNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarPropNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarRenameInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarRenameInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSatiationDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSatiationDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillDepotChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillMaxChargeCountNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillUpgradeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarSkillUpgradeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarTeamAllDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarTeamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarTeamResonanceInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarTeamUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarUnlockTalentNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarUpgradeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarUpgradeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarWearFlycloakReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarWearFlycloakRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BackMyWorldRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BatchBuyGoodsReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BatchBuyGoodsRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassAllDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassCurScheduleUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassCycleOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassMissionDelNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassMissionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassMissionUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassProductOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassRewardTagOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassRewardTakeOptionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassScheduleOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BattlePassUnlockStatusOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BirthdayOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BlockInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BlossomBriefInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BlossomBriefInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BlossomChestInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BonusActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BonusActivityInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BonusActivityInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BonusOpActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BossChestInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutActionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutBrickInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutElementReactionCounterOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutPhysicalObjectModifierOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutPhysicalObjectOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutSnapShotOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutSpawnPointOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutSyncConnectUidInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BreakoutVector2OuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyBattlePassLevelReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyBattlePassLevelRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyGoodsParamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyGoodsReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/BuyGoodsRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CalcWeaponUpgradeReturnItemsReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CalcWeaponUpgradeReturnItemsRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CanUseSkillNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CancelFinishParentQuestNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CardProductRewardNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChallengeBriefOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChallengeDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChallengeFinishTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeAvatarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeAvatarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeEnergyReasonOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeGameTimeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeGameTimeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeHpReasonOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeMailStarNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeMpTeamAvatarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeMpTeamAvatarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeTeamNameReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChangeTeamNameRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChannellerSlabLoopDungeonResultInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChapterStateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChapterStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CharAmusementAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChatEmojiCollectionDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChatInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CheckAddItemExceedLimitNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChildQuestOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChooseCurAvatarTeamReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ChooseCurAvatarTeamRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CityReputationQuestInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientAIStateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientAbilityChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientAbilityInitFinishNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientCollectorDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientInputTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientLoadingCostumeVerificationNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClientLockGameTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ClosedItemNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CodexDataFullNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CodexDataUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CodexTypeDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CodexTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CoinCollectOperatorInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CoinCollectTeamAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombatInvocationsNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombatInvokeEntryOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombatTypeArgumentOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombineDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombineFormulaDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombineReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CombineRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CompoundBoostTakeStatusTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CompoundDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CompoundQueueDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CookDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CookRecipeDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CookRecipeDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CreateEntityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CreateGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CreateVehicleReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CreateVehicleRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CrystalLinkAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CrystalLinkDungeonAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CurVehicleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CustomCommonNodeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CustomDungeonFinishTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CustomDungeonResultInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CustomGadgetTreeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CutSceneBeginNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/CutSceneExtraParamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyDungeonEntryInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskFilterCityReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskFilterCityRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskProgressNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DailyTaskUnlockedCitiesNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DealAddFriendReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DealAddFriendResultTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DealAddFriendRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DelBackupAvatarTeamReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DelBackupAvatarTeamRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DelMailReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DelMailRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DelTeamEntityNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DeleteFriendNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DeleteFriendReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DeleteFriendRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DeshretObeliskGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DestroyMaterialReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DestroyMaterialRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DoGachaReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DoGachaRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DoSetPlayerBornDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DropHintNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DropItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DropItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonCandidateTeamChangeAvatarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonCandidateTeamChangeAvatarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonChallengeBeginNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonChallengeFinishNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonEnterPosInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonEntryInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonEntryInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonEntryInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonEntryPointInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonSettleNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonShowReminderNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonSlipRevivePointActivateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonSlipRevivePointActivateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonWayPointActivateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonWayPointActivateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/DungeonWayPointNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EchoShellInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EffigyChallengeDungeonResultInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EndCameraSceneLookNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterSceneDoneReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterSceneDoneRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterScenePeerNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterSceneReadyReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterSceneReadyRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterTransPointRegionNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterWorldAreaReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EnterWorldAreaRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityAbilityInvokeEntryOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityAiSyncNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityAuthorityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityClientDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityClientExtraInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityEnvironmentInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityFightPropChangeReasonNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityFightPropUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityMoveInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EntityRendererChangedInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EquipOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EquipParamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EquipRoguelikeRuneReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EquipRoguelikeRuneRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAiSyncCombatThreatInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAiSyncSkillCdNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAnimatorParameterInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAvatarLockChairReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAvatarLockChairRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAvatarSitDownNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtAvatarStandUpNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtBeingHitInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtCreateGadgetNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtDestroyGadgetNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtDoSkillSuccNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/EvtEntityRenderersChangedNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ExitTransPointRegionNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FeatureBlockInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FetterDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FightPropPairOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FindHilichurlAcceptQuestNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FindHilichurlFinishSecondQuestNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FinishedParentQuestNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FinishedParentQuestUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FishPoolInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FishtankFishInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairMusicGameSettleReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairMusicGameSettleRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairMusicGameStartReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FleurFairMusicGameStartRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForceUpdateInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeFormulaDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeGetQueueDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeGetQueueDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeQueueDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeQueueDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeQueueManipulateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeQueueManipulateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeQueueManipulateTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeStartReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForgeStartRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ForwardTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FoundationInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FoundationStatusOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FriendBriefOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FriendEnterHomeOptionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FriendOnlineStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureCurModuleArrangeCountNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeBeHelpedDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeBeHelpedNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeCancelReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeCancelRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeFinishNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeHelpDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeHelpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeHelpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeMakeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeSlotOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeStartReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureMakeStartRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/FurnitureOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GCGTCTavernChallengeDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaItemOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaTransferItemOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaUpInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaWishReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GachaWishRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetAutoPickDropInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetBornTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetCrucibleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetGeneralRewardInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetInteractReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetInteractRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetPlayInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GadgetStateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GalleryStopReasonOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GameplayRecommendationElementReliquaryRequestOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GameplayRecommendationElementReliquaryResponseOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GameplayRecommendationReliquaryMainPropDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GameplayRecommendationReliquaryRequestOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GameplayRecommendationReliquaryResponseOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GatherGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetActivityInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetActivityInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetActivityShopSheetInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllH5ActivityInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllH5ActivityInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllMailNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllMailReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllMailResultNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllMailRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllUnlockNameCardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAllUnlockNameCardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAuthkeyReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetAuthkeyRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetBlossomBriefInfoListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetBlossomBriefInfoListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetChatEmojiCollectionReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetChatEmojiCollectionRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetCompoundDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetCompoundDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetDailyDungeonEntryInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetDailyDungeonEntryInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetFriendShowAvatarInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetFriendShowAvatarInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetFriendShowNameCardInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetFriendShowNameCardInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetFurnitureCurModuleArrangeCountReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetGachaInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetGachaInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetHomeLevelUpRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetHomeLevelUpRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetInvestigationMonsterReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetInvestigationMonsterRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetMailItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetMailItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetMapAreaRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOnlinePlayerInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOnlinePlayerInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOnlinePlayerListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOnlinePlayerListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOpActivityInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetOpActivityInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetParentQuestVideoKeyReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetParentQuestVideoKeyRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerAskFriendListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerAskFriendListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerBlacklistRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerFriendListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerFriendListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerHomeCompInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerSocialDetailReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerSocialDetailRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerTokenReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetPlayerTokenRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetQuestLackingResourceReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetQuestLackingResourceRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetQuestTalkHistoryReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetQuestTalkHistoryRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetRegionSearchReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetSceneAreaReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetSceneAreaRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetScenePointReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetScenePointRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetShopReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetShopRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetShopmallDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetShopmallDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetUgcReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetUgcRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetUgcTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetWidgetSlotReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetWidgetSlotRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetWorldMpInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GetWorldMpInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GroupSuiteNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/GroupUnloadNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/H5ActivityIdsNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/H5ActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HitColliderTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HitCollisionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HitTreeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeAllUnlockedBgmIdListNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeAnimalDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBasicInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBasicInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBlockArrangementInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBlockDotPatternOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBlockFieldDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeBlockSubFieldDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeBgmNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeBgmReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeBgmRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeEditModeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeEditModeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeModuleReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChangeModuleRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChooseModuleReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeChooseModuleRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeComfortInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeCustomFurnitureInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeCustomFurnitureInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeEditCustomFurnitureReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeEditCustomFurnitureRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeEnterEditModeFinishReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeEnterEditModeFinishRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeFurnitureCustomSuiteDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeFurnitureDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeFurnitureGroupDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeFurnitureSuiteDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGetArrangementInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGetArrangementInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGetBasicInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGetOnlineStatusReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGetOnlineStatusRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeGroupPlayerInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopBuyGoodsReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopBuyGoodsRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopGoodsListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopGoodsListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopGoodsOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopInfoChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeLimitedShopOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeMarkPointFurnitureDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeMarkPointNPCDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeMarkPointNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeMarkPointSceneDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeMarkPointSuiteDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeModuleComfortInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeModuleSeenReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeModuleSeenRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeModuleUnlockNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeNewUnlockedBgmIdListNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeNpcDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomePreChangeEditModeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceTakeFetterExpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceTakeFetterExpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceTakeHomeCoinReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeResourceTakeHomeCoinRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSceneArrangementInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSceneInitFinishReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSceneInitFinishRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSceneJumpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSceneJumpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSeekFurnitureAllRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSeekFurnitureGalleryScoreNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSeekFurnitureOneRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeSeekFurniturePlayerScoreOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeUpdateArrangementInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HomeUpdateArrangementInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/HostPlayerNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InferencePageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InfernceWordInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InstableSprayAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InterOpTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InteractTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InvestigationMonsterOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InvestigationMonsterUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InvestigationQuestDailyNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/InvestigationReadQuestDailyNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriChessEquipCardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/IrodoriChessEquipCardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemAddHintNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemCdGroupTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemGivingReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemGivingRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemHintOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemParamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemRenameAvatarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ItemRenameAvatarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LanternProjectionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LanternProjectionLevelInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LanternRiteFireworksChallengeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LanternRiteFireworksInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LanternRiteFireworksStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LevelupCityReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LifeStateChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LockedPersonallineDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LunaRiteHintStatusTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/LunchBoxDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MPLevelEntityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MailChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MailCollectStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MailDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MailItemOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MailTextContentOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MapAreaInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MapMarkFromTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MapMarkPointOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MapMarkPointTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MarkMapReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MarkMapRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MarkNewNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MarkTargetInvestigationMonsterNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MassivePropParamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MassivePropSyncInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialDeleteInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialDeleteReturnNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialDeleteReturnTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialDeleteUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MaterialOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MathQuaternionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/McoinExchangeHcoinReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/McoinExchangeHcoinRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MiracleRingDeliverItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MiracleRingDeliverItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MistTrialBestAvatarOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MistTrialLevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ModifierActionOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ModifierDurabilityOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ModifierPropertyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MonsterAIConfigHashNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MonsterBornTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MonsterPointArrayRouteUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MonsterRouteOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MotionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MotionStateOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MovingPlatformTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MpPlayRewardInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MpSettingTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MuqadasPotionDungeonSettleNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameActivityDetailInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameSettleReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameSettleRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameStartReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/MusicGameStartRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/NightCrowGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/NpcTalkReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/NpcTalkRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ObstacleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ObstacleModifyNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OfferingInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OneoffGatherPointDetectorDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OnlinePlayerInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OpActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OpenStateChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/OpenStateUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PSPlayerApplyEnterMpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PSPlayerApplyEnterMpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ParamListOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ParentQuestInferenceDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ParentQuestOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ParentQuestRandomInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PathfindingEnterSceneReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PathfindingEnterSceneRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PersonalLineAllDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PersonalLineAllDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PersonalSceneJumpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PersonalSceneJumpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PingReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PingRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlatformChangeRouteNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlatformInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlatformStartRouteNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlatformStopRouteNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlatformTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayTeamEntityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpResultNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpResultReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpResultRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerApplyEnterMpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerChatNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerChatReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerChatRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCompoundMaterialBoostReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCompoundMaterialBoostRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCompoundMaterialReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCompoundMaterialRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCookArgsReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCookArgsRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCookReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerCookRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerDieTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerEnterDungeonReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerEnterDungeonRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerEnterSceneInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerEnterSceneNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerForceExitRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerGameTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerGetForceQuitBanInfoReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerGetForceQuitBanInfoRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerHomeCompInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerHomeCompInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerLevelRewardUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerLocationInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerLoginReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerLoginRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerPropChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerPropChangeReasonNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerPropNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerQuitDungeonReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerRTTInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerSetPauseReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerSetPauseRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerStoreNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerWidgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerWorldLocationInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerWorldSceneInfoListNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PlayerWorldSceneInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PostEnterSceneReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PostEnterSceneRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PotionAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PotionDungeonResultInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PrivateChatNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PrivateChatReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ProfilePictureChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ProfilePictureOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PropChangeReasonOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PropPairOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PropValueOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ProtEntityTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ProudSkillChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ProudSkillExtraLevelNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PullPrivateChatReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PullPrivateChatRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PullRecentChatReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/PullRecentChatRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryCodexMonsterBeKilledNumReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryCodexMonsterBeKilledNumRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryCurrRegionHttpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryFilterOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryPathReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryPathRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QueryRegionListHttpRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestCreateEntityReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestCreateEntityRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestDelNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestDestroyEntityReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestDestroyEntityRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestDestroyNpcReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestDestroyNpcRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestGlobalVarNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestGlobalVarOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestListNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestListUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestProgressUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestRenameAvatarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestRenameAvatarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestTransmitReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestTransmitRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestUpdateQuestTimeVarNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestUpdateQuestVarNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestUpdateQuestVarReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestUpdateQuestVarRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuestVarOpOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/QuickUseWidgetRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReadMailNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReadPrivateChatReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RecordUsageOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RegionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RegionSimpleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryDecomposeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryDecomposeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryFilterStateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryFilterStateSaveNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryPromoteReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryPromoteRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryUpgradeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ReliquaryUpgradeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ResVersionConfigOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ResinChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ResinCostTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RobotPushPlayerDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueDiaryDungeonSettleNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RogueShowAvatarTeamInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RoguelikeGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RouteOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RoutePointChangeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/RoutePointOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalesmanDeliverItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalesmanDeliverItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalesmanStatusTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalvageBundleChallengeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalvageChallengeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalvageScoreChallengeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SalvageStageInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneAreaUnlockNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneAreaWeatherNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneAvatarStaminaStepReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityAiInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityAppearNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityDisappearNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityDrownReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityDrownRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneEntityMoveNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneFishInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneForceLockNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneForceUnlockNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneGalleryHomeSeekFurnitureInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneInitFinishRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneKickPlayerReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneKickPlayerRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneMonsterInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneNpcInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ScenePlayerInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ScenePlayerInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ScenePlayerLocationNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneReliquaryInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneRouteChangeInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneRouteChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneTeamAvatarOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneTeamUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneTransToPointReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneTransToPointRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SceneWeaponInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ScreenInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampActivityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampContributeItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampContributeItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeaLampSectionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SeeMonsterReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SelectWorktopOptionReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SelectWorktopOptionRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServantInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerAnnounceNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerAnnounceRevokeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerBuffChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerBuffOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerCondMeetQuestListUpdateNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerGlobalValueChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ServerTimeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetBattlePassViewedReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetBattlePassViewedRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetChatEmojiCollectionReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetChatEmojiCollectionRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetEntityClientDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetEquipLockStateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetEquipLockStateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetFriendEnterHomeOptionReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetFriendEnterHomeOptionRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetIsAutoUnlockSpecificEquipReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetIsAutoUnlockSpecificEquipRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetNameCardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetNameCardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetOpenStateReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetOpenStateRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerBirthdayReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerBirthdayRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerBornDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerBornDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerHeadImageReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerHeadImageRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerNameReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerNameRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerPropReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerPropRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerSignatureReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetPlayerSignatureRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetUpAvatarTeamReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetUpAvatarTeamRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetUpLunchBoxWidgetReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetUpLunchBoxWidgetRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetWidgetSlotReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SetWidgetSlotRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShopCardProductOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShopConcertProductOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShopGoodsOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShopMcoinProductOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShopOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShortAbilityHashPairOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShowAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ShowEquipOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SkipPlayerGameTimeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SkipPlayerGameTimeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SkyCrystalDetectorDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SkyCrystalDetectorQuickUseResultOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SocialDetailOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SocialShowAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StatueGadgetInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StopServerInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StoreItemChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StoreItemDelNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StoreTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StoreWeightLimitNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/StrengthenPointDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SumoAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SumoDungeonSettleNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SyncScenePlayTeamEntityNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/SyncTeamEntityNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeAchievementGoalRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeAchievementGoalRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeAchievementRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeAchievementRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBackGivingItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBackGivingItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBattlePassMissionPointReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBattlePassMissionPointRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBattlePassRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeBattlePassRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeCityReputationParentQuestReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeCityReputationParentQuestRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeCompoundOutputReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeCompoundOutputRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeFurnitureMakeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeFurnitureMakeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeMaterialDeleteReturnReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeMaterialDeleteReturnRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakePlayerLevelRewardReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakePlayerLevelRewardRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeoffEquipReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TakeoffEquipRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TanukiTravelFinishGuideQuestNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TanukiTravelLevelDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TeamChainChooseAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TeamEnterSceneInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TeamEntityInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ToTheMoonEnterSceneReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ToTheMoonQueryPathReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/ToTheMoonQueryPathRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerAllDataReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerAllDataRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerCurLevelRecordChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerCurLevelRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerEnterLevelReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerEnterLevelRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerFloorRecordChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerFloorRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerLevelEndNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerLevelRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerLevelStarCondDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerLevelStarCondNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerMiddleLevelChangeTeamNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerMonthlyBriefOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerTeamOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerTeamSelectReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TowerTeamSelectRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TrackingIOInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TreasureMapRegionInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TreasureMapRegionInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TrialAvatarFirstPassDungeonNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TrialAvatarGrantRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TrialAvatarInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TriggerCreateGadgetToEquipPartNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TryEnterHomeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/TryEnterHomeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcMusicBriefInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcMusicNoteOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcMusicRecordOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcMusicTrackOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UgcTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/Uint32PairOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnionCmdNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnionCmdOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockAvatarTalentReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockAvatarTalentRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockNameCardNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockPersonalLineReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockPersonalLineRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockTransPointReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockTransPointRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockedFurnitureFormulaDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UnlockedFurnitureSuiteDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UpdateAbilityCreatedMovingPlatformNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UpdatePlayerShowAvatarListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UpdatePlayerShowAvatarListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UpdatePlayerShowNameCardListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UpdatePlayerShowNameCardListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UseItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/UseItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/Vector3IntOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VectorOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VectorPlaneOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleInteractReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleInteractRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleInteractTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleLocationInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleMemberOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VehicleStaminaNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageBoothUsedItemDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageMarketDeliverItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VintageMarketDeliverItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/VisionTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponAwakenReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponAwakenRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponPromoteReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponPromoteRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponUpgradeReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeaponUpgradeRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WearEquipReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WearEquipRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeatherInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeatherWizardDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeekendDjinnInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WeeklyBossResinDiscountInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetCoolDownDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetCoolDownNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetCreateLocationInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetCreatorInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetCreatorOpTypeOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetDoBagReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetDoBagRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetGadgetAllDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetGadgetDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetGadgetDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetSlotChangeNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetSlotDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetSlotOpOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WidgetSlotTagOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WindSeedClientNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampAcceptAllGiveItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampAcceptAllGiveItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampAcceptGiveItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampAcceptGiveItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampAcceptItemResultInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGetCanGiveFriendItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGetCanGiveFriendItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGetRecvItemListReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGetRecvItemListRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGiveFriendItemReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampGiveFriendItemRspOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampRecvItemDataOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WinterCampRecvItemNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorktopInfoOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorktopOptionNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldChestOpenNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldDataNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldOwnerBlossomBriefInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldOwnerDailyTaskNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerDieNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerInfoNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerLocationNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerRTTNotifyOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerReviveReqOuterClass.java
    #	src/generated/main/java/emu/grasscutter/net/proto/WorldPlayerReviveRspOuterClass.java
    #	src/main/java/emu/grasscutter/GameConstants.java
    #	src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java
    #	src/main/java/emu/grasscutter/utils/Language.java
  • Fix trial avatar removal
    it is still *sort of* broken when combined with early leaving a domain
  • Fix removing trial avatars
    this prevents exceptions from being thrown. see questing thread for more information.
  • Fix some behavior of trial avatars
    investigation is required on the exceptions thrown
  • Attempt to correct PlayerSetPauseReq
    this is still broken; further investigation is required
  • Fix potential NPE
    this can occur if the player disconnects before logging in
  • Merge branch 'development' into unstable-quests
    # Conflicts:
    #	src/main/java/emu/grasscutter/command/commands/SetPropCommand.java
  • Merge branch 'development' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/command/commands/SetPropCommand.java
  • Add sub-quest data only in BinOutput
    could fix things sometimes
  • Fixing the starting world time
    the proper start time should be 9 game hours
  • Send avatar type to client
    also switch to lambda reference
  • Merge branch 'development' into unstable-quests
    # Conflicts:
    #	src/generated/main/java/emu/grasscutter/net/proto/ScenePointUnlockNotifyOuterClass.java
    #	src/main/java/emu/grasscutter/game/dungeons/DungeonSystem.java
    #	src/main/java/emu/grasscutter/server/packet/recv/HandlerCombatInvocationsNotify.java
    #	src/main/java/emu/grasscutter/server/packet/recv/HandlerDungeonEntryInfoReq.java
  • Merge branch 'development' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/game/dungeons/DungeonSystem.java
    #	src/main/java/emu/grasscutter/server/packet/recv/HandlerCombatInvocationsNotify.java
    #	src/main/java/emu/grasscutter/server/packet/recv/HandlerDungeonEntryInfoReq.java
  • implement getCachePath (#2121)
    * implement getCachePath
    
    for further use like grids cache.
    
    * Update src/main/java/emu/grasscutter/utils/FileUtils.java
    
    ---------
    
    Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>
  • Fix entity controllers not loading
    elemental monuments should now work
  • Fix issue with Amber not being added
    the field for an item's `useOnGain` was final!
  • Remove .gitattributes
    this should fix some line separator issues
  • Merge branch 'development' into unstable
    # Conflicts:
    #	src/generated/main/java/emu/grasscutter/net/proto/ScenePointUnlockNotifyOuterClass.java
  • Set CRLF as the default line separator
    this will be changed back to LF after unstable-quests is finished
  • Implement a new item drops system (#2112)
    * 1
    
    * Delete .gitattributes
    
    * implement
    
    * Update PacketDropHintNotify.java
    
    * Update PacketWorldChestOpenNotify.java
    
    * Update FileUtils.java
    
    * Update PacketDropHintNotify.java
    
    * Update WorldDataSystem.java
    
    ---------
    
    Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>
  • Fix Lua exec call (#2115)
    * Fix Lua exec call
    
    ## Description
    fix 352 should not have any slime spawns, its 353 and 351 has a single slime spawn
    
    Please carefully read the [Contributing note](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md) and [Code of conduct](https://github.com/Grasscutters/Grasscutter/blob/development/CODE_OF_CONDUCT.md) before making any pull requests.
    
    ## Issues fixed by this PR
    
    <!--- Put the links of issues that may be fixed by this PR here (if any). -->
    ## Type of changes
    
    <!--- Put an `x` in all the boxes that apply your changes. -->
    
    - [x] Bug fix
    - [ ] New feature 
    - [ ] Enhancement
    - [ ] Documentation
    
    ## Checklist:
    
    - [x] My code follows the style guidelines of this project
    - [x] My pull request is unique and no other pull requests have been opened for these changes
    - [x] I have read the [Contributing note](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md) and [Code of conduct](https://github.com/Grasscutters/Grasscutter/blob/development/CODE_OF_CONDUCT.md)
    - [x] I am responsible for any copyright issues with my code if it occurs in the future.
    
    * Update ExecNotifyGroupLua.java
    
    * Update ExecNotifyGroupLua.java
    
    * Update ExecNotifyGroupLua.java
    
    * new ScriptArgs(groupId, eventType, quest.getSubQuestId())          .setEventSource(String.valueOf(quest.getSubQuestId()));
  • Fix hanging on scene creation
    Invoke `SceneScriptManager#init` in a thread.
  • Enable 'big world scripts' by default
    this uses significantly more system resources, but in turn allows for the *quest* system to work!
  • Fix grid parsing
    now compatiable with Yukki's resources!
  • Merge branch 'development' into unstable-quests
    # Conflicts:
    #	src/generated/main/java/emu/grasscutter/net/proto/ResinChangeNotifyOuterClass.java
    #	src/main/java/emu/grasscutter/game/managers/ResinManager.java
    #	src/main/java/emu/grasscutter/game/player/Player.java
    #	src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseAddItem.java
    #	src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java
    #	src/main/java/emu/grasscutter/server/packet/send/PacketResinChangeNotify.java
    #	src/main/java/emu/grasscutter/utils/Crypto.java
  • Merge branch 'development' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java
    #	src/main/java/emu/grasscutter/utils/Crypto.java
  • Add packet for WindSeedClientNotify
    still a blacklisted packet however
  • Merge branch 'development' into unstable
    # Conflicts:
    #	src/generated/main/java/emu/grasscutter/net/proto/ResinChangeNotifyOuterClass.java
    #	src/main/java/emu/grasscutter/game/managers/ResinManager.java
    #	src/main/java/emu/grasscutter/game/player/Player.java
    #	src/main/java/emu/grasscutter/game/props/ItemUseAction/ItemUseAddItem.java
    #	src/main/java/emu/grasscutter/server/packet/send/PacketResinChangeNotify.java
  • Merge remote-tracking branch 'origin/unstable' into unstable
    # Conflicts:
    #	src/handbook/src/backend/types.ts
    #	src/handbook/src/ui/pages/ItemsPage.tsx
    #	src/handbook/src/ui/widgets/MiniCard.tsx
  • Continue merging quests (pt. 1)
    Finished last at: `World.java`, line `player.setAvatarsAbilityForScene(newScene);`
  • Remove duplicate item entries
    This filters items by name and ID.
  • Fix item icons to be more accurate
    Project Amber is now the primary icon source!
  • Add "react-virtualized"
    automatically patch it to remove unnecessary import
  • Implement avatars/characters page
    Handle edge-cases for avatar image rendering
  • Fix linting script
    (forgot that actions are in `src/handbook` already)
  • Implement the commands page
    additionally, clean-up imports
  • Add linter script
    Fix issue with running `cd src/handbook` while in the handbook directory for building
  • Attempt to fix handbook actions
    clearly running cd prior to setting up node doesnt work
  • Create initial handbook data dumpers
    these can be accessed by using `-dump=commands,en-us` or `-dump=avatars/items,EN` (all languages supported)
  • Merge branch 'development' into unstable-quests
    # Conflicts:
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarUpgradeRspOuterClass.java
  • Merge branch 'development' into unstable
    # Conflicts:
    #	src/generated/main/java/emu/grasscutter/net/proto/AvatarUpgradeRspOuterClass.java
  • Implement handbook sidebar
    only works on desktops atm, mobile support is non-existant
  • Add building for handbook
    also implement linting, ci for handbook, and change `.editorconfig` to do 2-line for .yml
  • Add more home buttons & Add content disclaimer
    i added a place to add credits; will do next probs
  • Merge branch 'development' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java
    #	src/main/java/emu/grasscutter/utils/Utils.java
  • Add basis of the content panel
    - Home buttons
    - Implement sidebar
    - Add home title
  • Scaffold class-based React + Tailwind project
    now configured with TypeScript aliases!
  • Merge branch 'development' into unstable-quests
    # Conflicts:
    #	src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java
    #	src/main/java/emu/grasscutter/utils/Utils.java
  • Merge branch 'fixmail' into unstable
    # Conflicts:
    #	src/main/java/emu/grasscutter/game/mail/Mail.java
    #	src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java
    #	src/main/java/emu/grasscutter/server/packet/recv/HandlerGetAllMailReq.java
    #	src/main/java/emu/grasscutter/server/packet/send/PacketGetAllMailRsp.java
    #	src/main/java/emu/grasscutter/utils/Utils.java
  • Continue updating/refactoring classes
    Most code is matched from `Grasscutter-Quests`.
  • Comment-out unknown packet handlers/encoders
    These are mostly related to the teapot, music game, and custom teams
  • Add additional protocol classes
    Using `gc-quest-fix`
  • Fix existing protocol classes
    Using `gc-quest-fix`
  • Copy some files from Grasscutter-Quests
    NOT completely finished, nor is it completely done. Protocol issues remain! (including lack of packet IDs)
  • Create files from Grasscutter-Quests
    these files are NOT directly compatible with Grasscutter, and require additional modifications to the codebase to work.
  • Remove reflowLongStrings
    Causes an issue with Spotless!
  • Add support for unit testing
    - Add argument `-testing`, which allows for a threaded console
108 changed files with 602 additions and 2405 deletions
+2 -1
View File
@@ -4,6 +4,7 @@ on:
pull_request_target:
types:
- opened
- reopened
branches:
- development
paths:
@@ -19,4 +20,4 @@ jobs:
steps:
- uses: superbrothers/close-pull-request@v3
with:
comment: "This PR has been closed for modifying protected files. See `CONTRIBUTING.md` for more information."
comment: "This PR has been closed for modifying protected files. See `CONTRIBUTING.md` for more information."
+45 -17
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
@@ -22,23 +22,51 @@
**Note**: For support please join our [Discord](https://discord.gg/T5vZU6UyeG).
### Quick Start (automatic)
### Requirements
- Get Java 17: https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html
- Get [MongoDB Community Server](https://www.mongodb.com/try/download/community)
- Get game version REL3.7 (3.7 client can be found here if you don't have it): https://github.com/MAnggiarMustofa/GI-Download-Library/blob/main/GenshinImpact/Client/3.7.0.md)
* [Java SE - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) or higher
- Download the [latest Cultivation version](https://github.com/Grasscutters/Cultivation/releases/latest). Use the `.msi` installer.
- After opening Culivation (as admin), press the download button in the upper right corner.
- Click `Download All-in-One`
- Click the gear in the upper right corner
- Set the game Install path to where your game is located.
- Set the Custom Java Path to `C:\Program Files\Java\jdk-17\bin\java.exe`
- Leave all other settings on default
**Note:** If you just want to **run it**, then **jre** only is fine.
- Click the small button next to launch.
- Click the launch button.
- Log in with whatever username you want. Password doesn't matter.
* [MongoDB](https://www.mongodb.com/try/download/community) (recommended 4.0+)
* Proxy Daemon: [mitmproxy](https://mitmproxy.org/) (mitmdump, recommended), [Fiddler Classic](https://telerik-fiddler.s3.amazonaws.com/fiddler/FiddlerSetup.exe), etc.
### Running
**Note:** If you updated from an older version, delete `config.json` to regenerate it.
1. Get `grasscutter.jar`
- Download from [releases](https://github.com/Grasscutters/Grasscutter/releases/latest) or [actions](https://github.com/Grasscutters/Grasscutter/actions/workflows/build.yml) or [build the server by yourself](#building).
2. Create a `resources` folder in the directory where grasscutter.jar is located and move your `BinOutput, ExcelBinOutput, Readables, Scripts, Subtitle, TextMap` folders there *(Check the [wiki](https://github.com/Grasscutters/Grasscutter/wiki) for more details how to get those.)*
3. Run Grasscutter with `java -jar grasscutter.jar`. **Make sure mongodb service is running as well.**
### Connecting with the client
½. Create an account in the server console using this [command](https://github.com/Grasscutters/Grasscutter/wiki/Commands#:~:text=account%20%3Ccreate|delete%3E%20%3Cusername%3E%20[UID]).
1. Redirect traffic: (choose one only)
- mitmdump: `mitmdump -s proxy.py -k`
- Trust CA certificate:
- The CA certificate is usually stored in `%USERPROFILE%\.mitmproxy`, double click `mitmproxy-ca-cert.cer` to [install](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate) or...
- Via command line *(needs administration privileges)*
```shell
certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer
```
- Fiddler Classic: Run Fiddler Classic, turn on `Decrypt HTTPS traffic` in (Tools -> Options -> HTTPS) and change the default port in (Tools -> Options -> Connections) to anything other than `8888`, load [this script](https://github.com/Grasscutters/Grasscutter/wiki/Resources#fiddler-classic-jscript) (copy and paste the script in the `FiddlerScript` tab) and click the `Save Script` button.
- [Hosts file](https://github.com/Grasscutters/Grasscutter/wiki/Resources#hosts-file)
2. Set network proxy to `127.0.0.1:8080` or the proxy port you specified.
- For mitmproxy: After setting up the network proxy and installing the certificate, check http://mitm.it/ if traffic is passing through mitmproxy.
**You can also use `start.cmd` to start servers and proxy daemons automatically, but you have to set up `JAVA_HOME` environment and configure the `start_config.cmd` file.**
### Building
@@ -52,7 +80,7 @@ Grasscutter uses Gradle to handle dependencies & building.
##### Windows
```shell
git clone --recurse-submodules https://github.com/Grasscutters/Grasscutter.git
git clone --recurse-submodules -b unstable https://github.com/Grasscutters/Grasscutter.git
cd Grasscutter
.\gradlew.bat # Setting up environments
.\gradlew jar # Compile
@@ -61,7 +89,7 @@ cd Grasscutter
##### Linux (GNU)
```bash
git clone --recurse-submodules https://github.com/Grasscutters/Grasscutter.git
git clone --recurse-submodules -b unstable https://github.com/Grasscutters/Grasscutter.git
cd Grasscutter
chmod +x gradlew
./gradlew jar # Compile
+6 -36
View File
@@ -57,7 +57,7 @@ sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
group = 'io.grasscutter'
version = '1.6.1'
version = '2.0.0-unstable'
java {
withJavadocJar()
@@ -335,48 +335,18 @@ tasks.register('generateHandbook') {
return
}
def npmVersion = {
def nodeVersion = {
try {
return 'npm --version'.execute().text.trim()
return 'node --version'.execute().text.trim()
} catch (ignored) {
return 'NPM_NOT_FOUND'
return 'NODE_NOT_FOUND'
}
}
// Check if Node is installed.
if (npmVersion() == 'NPM_NOT_FOUND') {
println('NPM is not installed. Skipping handbook generation.')
if (nodeVersion() == 'NODE_NOT_FOUND') {
println('Node is not installed. Skipping handbook generation.')
} else {
// Check if the handbook resources are present.
if (!file('src/handbook/data/commands.json')) {
println('Command data was not found. Skipping handbook generation.')
return
}
if (!file('src/handbook/data/avatars.csv')) {
println('Avatar data was not found. Skipping handbook generation.')
return
}
if (!file('src/handbook/data/entities.csv')) {
println('Entity data was not found. Skipping handbook generation.')
return
}
if (!file('src/handbook/data/items.csv')) {
println('Item data was not found. Skipping handbook generation.')
return
}
if (!file('src/handbook/data/mainquests.csv')) {
println('Main quest data was not found. Skipping handbook generation.')
return
}
if (!file('src/handbook/data/quests.csv')) {
println('Quest data was not found. Skipping handbook generation.')
return
}
if (!file('src/handbook/data/scenes.csv')) {
println('Scene data was not found. Skipping handbook generation.')
return
}
// Build the handbook.
var npm = 'npm'
if (Os.isFamily(Os.FAMILY_WINDOWS))
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documention" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documention" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documention" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documention" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documention" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documention" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
+63 -30
View File
@@ -1,11 +1,11 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documentation" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documention" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
[EN](../README.md) | [简中](README_zh-CN.md) | [繁中](README_zh-TW.md) | [FR](README_fr-FR.md) | [ES](README_es-ES.md) | [HE](README_HE.md) | [RU](README_ru-RU.md) | [PL](README_pl-PL.md) | [ID](README_id-ID.md) | [KR](README_ko-KR.md) | [FIL/PH](README_fil-PH.md) | [NL](README_NL.md) | [JP](README_ja-JP.md) | [IT](README_it-IT.md) | [VI](README_vi-VN.md)
**注意:** 我们始终欢迎项目的贡献者。但在做贡献之前,请仔细阅读我们的[代码规范](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md)。
**注意:** 欢迎成为本项目的贡献者。但在提交 PR 之前, 请仔细阅读 [代码规范](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md)。
## 当前功能
@@ -16,59 +16,92 @@
* 祈愿
* 多人游戏 *部分* 可用
* 从控制台生成魔物
* 背包功能(接收或升级物品、角色等)。
## 快速安装指南
* 物品 (接收或升级角色、武器等)
**注意:** 如需帮助,请加入我们的[Discord](https://discord.gg/T5vZU6UyeG)。
## 快速设置指南
### 快速开始(全自动)
**注意:** 如需帮助请加入 [Discord](https://discord.gg/T5vZU6UyeG)
- 获取Java 17https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html
- 获取[MongoDB社区版](https://www.mongodb.com/try/download/community)
- 获取游戏3.7正式版 (如果你没有3.7的客户端,可以在这里找到):https://github.com/MAnggiarMustofa/GI-Download-Library/blob/main/GenshinImpact/Client/3.7.0.md)
### 环境需求
- 下载[最新的Cultivation版本](https://github.com/Grasscutters/Cultivation/releases/latest)(使用以“.msi”为后缀的安装包)。
- 以管理员身份打开Culivation,按右上角的下载按钮。
- 点击“下载 Grasscutter 一体化”
- 点击右上角的齿轮
- 将游戏安装路径设置为你游戏所在的位置。
- 将自定义Java路径设置为`C:\Program Files\Java\jdk-17\bin\java.exe`
- 保持所有其它设置为默认值
* [Java SE - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
- 点击“启动”按钮旁边的小按钮。
- 点击“启动”按钮。
- 随便想一个用户名登录,不需要密码。
**注意:** 如果想仅**运行服务端**, 只下载 **jre** 即可
* [MongoDB](https://www.mongodb.com/try/download/community) (推荐 4.0+)
* 代理程序: [mitmproxy](https://mitmproxy.org/) (仅需 mitmdump;推荐使用), [Fiddler Classic](https://telerik-fiddler.s3.amazonaws.com/fiddler/FiddlerSetup.exe) 等
### 运行服务端
**注意:** 从旧版本升级到新版本, 需要删除 `config.json` 使其重新生成
1. 获取 `grasscutter.jar`
- 从 [actions](https://github.com/Grasscutters/Grasscutter/actions) 下载,或 [自行编译](#构建)
2. 在 JAR 文件根目录中创建 `resources` 文件夹并复制 `BinOutput``ExcelBinOutput` *(查看 [Wiki](https://github.com/Grasscutters/Grasscutter/wiki) 了解更多)*
3. **确认 MongoDB 服务运行正常后**,使用命令行 `java -jar grasscutter.jar` 运行 Grasscutter。
### 客户端连接
½. 在服务器控制台 [创建账户](https://github.com/Grasscutters/Grasscutter/wiki/Commands#targeting)
1. 重定向流量: (选择其中一个)
- mitmdump: `mitmdump -s proxy.py -k`
信任 CA 证书:
**注意:** mitmproxy 的 CA 证书通常存放在 `%USERPROFILE%\ .mitmproxy`, 或者从 `http://mitm.it` 下载证书
双击 [安装根证书](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate)或者...
- 使用命令行
```shell
certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer
```
- Fiddler Classic: 运行 Fiddler Classic, 在设置中开启 `解密 https 通信` 并将端口设为除 `8888` 以外的任意端口 (工具 -> 选项 -> 连接) 并加载 [此脚本](https://github.lunatic.moe/fiddlerscript)
- [Hosts 文件](https://github.com/Grasscutters/Grasscutter/wiki/Running#traffic-route-map)
2. 设置代理为 `127.0.0.1:8080` 或你设置的端口
**也可直接运行 `start.cmd` 一键启动服务端并设置代理, 但设置 `JAVA_HOME` 环境变量并配置 `start_config.cmd`**
### 构建
Grasscutter使用Gradle来处理依赖和构建
Grasscutter 使用 Gradle 来处理依赖及编译
**前置**
**前置依赖:**
- [Java SE Development Kits - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)或更高版本
- [Java SE Development Kits - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
- [Git](https://git-scm.com/downloads)
##### Windows
```shell
git clone --recurse-submodules https://github.com/Grasscutters/Grasscutter.git
git clone https://github.com/Grasscutters/Grasscutter.git
cd Grasscutter
.\gradlew.bat # 设置开发环境
.\gradlew.bat # 建立开发环境
.\gradlew jar # 编译
```
##### LinuxGNU
##### Linux
```bash
git clone --recurse-submodules https://github.com/Grasscutters/Grasscutter.git
git clone https://github.com/Grasscutters/Grasscutter.git
cd Grasscutter
chmod +x gradlew
./gradlew jar # 编译
```
你可以在项目的根目录找到输出的jar。
* 编译后的 JAR 文件会在源码根目录生成
### 故障排除
### 命令列表请到 [wiki](https://github.com/Grasscutters/Grasscutter/wiki/Commands) 查看
获取常见问题的解决方案或寻求帮助,请加入[我们的Discord服务器](https://discord.gg/T5vZU6UyeG)并进入“support”频道。
# 快速问题排除
* 如果编译失败, 请检查 JDK 安装是否正确 (需要 JDK 17 并确认 JDK 的 bin 文件夹处于环境变量 `PATH` 中)
* 客户端无法登录、连接、错误 4206 等其他问题... - 大部分情况是因为代理设置出现了*问题*。
如果使用 Fiddler,请确认 Fiddler 监听端口不是 `8888`
* 启动顺序: MongoDB > Grasscutter > 代理程序 (mitmdump, Fiddler 等) > 客户端
+1 -1
View File
@@ -1,5 +1,5 @@
![Grasscutter](https://socialify.git.ci/Grasscutters/Grasscutter/image?description=1&forks=1&issues=1&language=1&logo=https%3A%2F%2Fs2.loli.net%2F2022%2F04%2F25%2FxOiJn7lCdcT5Mw1.png&name=1&owner=1&pulls=1&stargazers=1&theme=Light)
<div align="center"><img alt="Documention" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Grasscutters/Grasscutter/build.yml?branch=development&logo=github&style=for-the-badge"></div>
<div align="center"><img alt="Documention" src="https://img.shields.io/badge/Wiki-Grasscutter-blue?style=for-the-badge&link=https://github.com/Grasscutters/Grasscutter/wiki&link=https://github.com/Grasscutters/Grasscutter/wiki"> <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/Grasscutters/Grasscutter?logo=java&style=for-the-badge"> <img alt="GitHub" src="https://img.shields.io/github/license/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Grasscutters/Grasscutter?style=for-the-badge"> <img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/Grasscutters/Grasscutter/Build?logo=github&style=for-the-badge"></div>
<div align="center"><a href="https://discord.gg/T5vZU6UyeG"><img alt="Discord - Grasscutter" src="https://img.shields.io/discord/965284035985305680?label=Discord&logo=discord&style=for-the-badge"></a></div>
@@ -1,539 +0,0 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: AbilityActionSetRandomOverrideMapValue.proto
package emu.grasscutter.net.proto;
public final class AbilityActionSetRandomOverrideMapValueOuterClass {
private AbilityActionSetRandomOverrideMapValueOuterClass() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistryLite registry) {
}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
registerAllExtensions(
(com.google.protobuf.ExtensionRegistryLite) registry);
}
public interface AbilityActionSetRandomOverrideMapValueOrBuilder extends
// @@protoc_insertion_point(interface_extends:AbilityActionSetRandomOverrideMapValue)
com.google.protobuf.MessageOrBuilder {
/**
* <code>float random_value = 1;</code>
* @return The randomValue.
*/
float getRandomValue();
}
/**
* Protobuf type {@code AbilityActionSetRandomOverrideMapValue}
*/
public static final class AbilityActionSetRandomOverrideMapValue extends
com.google.protobuf.GeneratedMessageV3 implements
// @@protoc_insertion_point(message_implements:AbilityActionSetRandomOverrideMapValue)
AbilityActionSetRandomOverrideMapValueOrBuilder {
private static final long serialVersionUID = 0L;
// Use AbilityActionSetRandomOverrideMapValue.newBuilder() to construct.
private AbilityActionSetRandomOverrideMapValue(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
super(builder);
}
private AbilityActionSetRandomOverrideMapValue() {
}
@java.lang.Override
@SuppressWarnings({"unused"})
protected java.lang.Object newInstance(
UnusedPrivateParameter unused) {
return new AbilityActionSetRandomOverrideMapValue();
}
@java.lang.Override
public final com.google.protobuf.UnknownFieldSet
getUnknownFields() {
return this.unknownFields;
}
private AbilityActionSetRandomOverrideMapValue(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
this();
if (extensionRegistry == null) {
throw new java.lang.NullPointerException();
}
com.google.protobuf.UnknownFieldSet.Builder unknownFields =
com.google.protobuf.UnknownFieldSet.newBuilder();
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
case 13: {
randomValue_ = input.readFloat();
break;
}
default: {
if (!parseUnknownField(
input, unknownFields, extensionRegistry, tag)) {
done = true;
}
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.InvalidProtocolBufferException(
e).setUnfinishedMessage(this);
} finally {
this.unknownFields = unknownFields.build();
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.internal_static_AbilityActionSetRandomOverrideMapValue_descriptor;
}
@java.lang.Override
protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internalGetFieldAccessorTable() {
return emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.internal_static_AbilityActionSetRandomOverrideMapValue_fieldAccessorTable
.ensureFieldAccessorsInitialized(
emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue.class, emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue.Builder.class);
}
public static final int RANDOM_VALUE_FIELD_NUMBER = 1;
private float randomValue_;
/**
* <code>float random_value = 1;</code>
* @return The randomValue.
*/
@java.lang.Override
public float getRandomValue() {
return randomValue_;
}
private byte memoizedIsInitialized = -1;
@java.lang.Override
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized == 1) return true;
if (isInitialized == 0) return false;
memoizedIsInitialized = 1;
return true;
}
@java.lang.Override
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
if (randomValue_ != 0F) {
output.writeFloat(1, randomValue_);
}
unknownFields.writeTo(output);
}
@java.lang.Override
public int getSerializedSize() {
int size = memoizedSize;
if (size != -1) return size;
size = 0;
if (randomValue_ != 0F) {
size += com.google.protobuf.CodedOutputStream
.computeFloatSize(1, randomValue_);
}
size += unknownFields.getSerializedSize();
memoizedSize = size;
return size;
}
@java.lang.Override
public boolean equals(final java.lang.Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue)) {
return super.equals(obj);
}
emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue other = (emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue) obj;
if (java.lang.Float.floatToIntBits(getRandomValue())
!= java.lang.Float.floatToIntBits(
other.getRandomValue())) return false;
if (!unknownFields.equals(other.unknownFields)) return false;
return true;
}
@java.lang.Override
public int hashCode() {
if (memoizedHashCode != 0) {
return memoizedHashCode;
}
int hash = 41;
hash = (19 * hash) + getDescriptor().hashCode();
hash = (37 * hash) + RANDOM_VALUE_FIELD_NUMBER;
hash = (53 * hash) + java.lang.Float.floatToIntBits(
getRandomValue());
hash = (29 * hash) + unknownFields.hashCode();
memoizedHashCode = hash;
return hash;
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
@java.lang.Override
public Builder newBuilderForType() { return newBuilder(); }
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@java.lang.Override
public Builder toBuilder() {
return this == DEFAULT_INSTANCE
? new Builder() : new Builder().mergeFrom(this);
}
@java.lang.Override
protected Builder newBuilderForType(
com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
Builder builder = new Builder(parent);
return builder;
}
/**
* Protobuf type {@code AbilityActionSetRandomOverrideMapValue}
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
// @@protoc_insertion_point(builder_implements:AbilityActionSetRandomOverrideMapValue)
emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValueOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.internal_static_AbilityActionSetRandomOverrideMapValue_descriptor;
}
@java.lang.Override
protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internalGetFieldAccessorTable() {
return emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.internal_static_AbilityActionSetRandomOverrideMapValue_fieldAccessorTable
.ensureFieldAccessorsInitialized(
emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue.class, emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue.Builder.class);
}
// Construct using emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private Builder(
com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
super(parent);
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
if (com.google.protobuf.GeneratedMessageV3
.alwaysUseFieldBuilders) {
}
}
@java.lang.Override
public Builder clear() {
super.clear();
randomValue_ = 0F;
return this;
}
@java.lang.Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
return emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.internal_static_AbilityActionSetRandomOverrideMapValue_descriptor;
}
@java.lang.Override
public emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue getDefaultInstanceForType() {
return emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue.getDefaultInstance();
}
@java.lang.Override
public emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue build() {
emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
@java.lang.Override
public emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue buildPartial() {
emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue result = new emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue(this);
result.randomValue_ = randomValue_;
onBuilt();
return result;
}
@java.lang.Override
public Builder clone() {
return super.clone();
}
@java.lang.Override
public Builder setField(
com.google.protobuf.Descriptors.FieldDescriptor field,
java.lang.Object value) {
return super.setField(field, value);
}
@java.lang.Override
public Builder clearField(
com.google.protobuf.Descriptors.FieldDescriptor field) {
return super.clearField(field);
}
@java.lang.Override
public Builder clearOneof(
com.google.protobuf.Descriptors.OneofDescriptor oneof) {
return super.clearOneof(oneof);
}
@java.lang.Override
public Builder setRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
int index, java.lang.Object value) {
return super.setRepeatedField(field, index, value);
}
@java.lang.Override
public Builder addRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
java.lang.Object value) {
return super.addRepeatedField(field, value);
}
@java.lang.Override
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue) {
return mergeFrom((emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue other) {
if (other == emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue.getDefaultInstance()) return this;
if (other.getRandomValue() != 0F) {
setRandomValue(other.getRandomValue());
}
this.mergeUnknownFields(other.unknownFields);
onChanged();
return this;
}
@java.lang.Override
public final boolean isInitialized() {
return true;
}
@java.lang.Override
public Builder mergeFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private float randomValue_ ;
/**
* <code>float random_value = 1;</code>
* @return The randomValue.
*/
@java.lang.Override
public float getRandomValue() {
return randomValue_;
}
/**
* <code>float random_value = 1;</code>
* @param value The randomValue to set.
* @return This builder for chaining.
*/
public Builder setRandomValue(float value) {
randomValue_ = value;
onChanged();
return this;
}
/**
* <code>float random_value = 1;</code>
* @return This builder for chaining.
*/
public Builder clearRandomValue() {
randomValue_ = 0F;
onChanged();
return this;
}
@java.lang.Override
public final Builder setUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.setUnknownFields(unknownFields);
}
@java.lang.Override
public final Builder mergeUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.mergeUnknownFields(unknownFields);
}
// @@protoc_insertion_point(builder_scope:AbilityActionSetRandomOverrideMapValue)
}
// @@protoc_insertion_point(class_scope:AbilityActionSetRandomOverrideMapValue)
private static final emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue();
}
public static emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue getDefaultInstance() {
return DEFAULT_INSTANCE;
}
private static final com.google.protobuf.Parser<AbilityActionSetRandomOverrideMapValue>
PARSER = new com.google.protobuf.AbstractParser<AbilityActionSetRandomOverrideMapValue>() {
@java.lang.Override
public AbilityActionSetRandomOverrideMapValue parsePartialFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return new AbilityActionSetRandomOverrideMapValue(input, extensionRegistry);
}
};
public static com.google.protobuf.Parser<AbilityActionSetRandomOverrideMapValue> parser() {
return PARSER;
}
@java.lang.Override
public com.google.protobuf.Parser<AbilityActionSetRandomOverrideMapValue> getParserForType() {
return PARSER;
}
@java.lang.Override
public emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
}
private static final com.google.protobuf.Descriptors.Descriptor
internal_static_AbilityActionSetRandomOverrideMapValue_descriptor;
private static final
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internal_static_AbilityActionSetRandomOverrideMapValue_fieldAccessorTable;
public static com.google.protobuf.Descriptors.FileDescriptor
getDescriptor() {
return descriptor;
}
private static com.google.protobuf.Descriptors.FileDescriptor
descriptor;
static {
java.lang.String[] descriptorData = {
"\n,AbilityActionSetRandomOverrideMapValue" +
".proto\">\n&AbilityActionSetRandomOverride" +
"MapValue\022\024\n\014random_value\030\001 \001(\002B\033\n\031emu.gr" +
"asscutter.net.protob\006proto3"
};
descriptor = com.google.protobuf.Descriptors.FileDescriptor
.internalBuildGeneratedFileFrom(descriptorData,
new com.google.protobuf.Descriptors.FileDescriptor[] {
});
internal_static_AbilityActionSetRandomOverrideMapValue_descriptor =
getDescriptor().getMessageTypes().get(0);
internal_static_AbilityActionSetRandomOverrideMapValue_fieldAccessorTable = new
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
internal_static_AbilityActionSetRandomOverrideMapValue_descriptor,
new java.lang.String[] { "RandomValue", });
}
// @@protoc_insertion_point(outer_class_scope)
}
@@ -1,545 +0,0 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: AbilityMetaSetKilledState.proto
package emu.grasscutter.net.proto;
public final class AbilityMetaSetKilledStateOuterClass {
private AbilityMetaSetKilledStateOuterClass() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistryLite registry) {
}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
registerAllExtensions(
(com.google.protobuf.ExtensionRegistryLite) registry);
}
public interface AbilityMetaSetKilledStateOrBuilder extends
// @@protoc_insertion_point(interface_extends:AbilityMetaSetKilledState)
com.google.protobuf.MessageOrBuilder {
/**
* <code>bool killed = 6;</code>
* @return The killed.
*/
boolean getKilled();
}
/**
* <pre>
* Handcrafted by Magix!
* </pre>
*
* Protobuf type {@code AbilityMetaSetKilledState}
*/
public static final class AbilityMetaSetKilledState extends
com.google.protobuf.GeneratedMessageV3 implements
// @@protoc_insertion_point(message_implements:AbilityMetaSetKilledState)
AbilityMetaSetKilledStateOrBuilder {
private static final long serialVersionUID = 0L;
// Use AbilityMetaSetKilledState.newBuilder() to construct.
private AbilityMetaSetKilledState(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
super(builder);
}
private AbilityMetaSetKilledState() {
}
@java.lang.Override
@SuppressWarnings({"unused"})
protected java.lang.Object newInstance(
UnusedPrivateParameter unused) {
return new AbilityMetaSetKilledState();
}
@java.lang.Override
public final com.google.protobuf.UnknownFieldSet
getUnknownFields() {
return this.unknownFields;
}
private AbilityMetaSetKilledState(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
this();
if (extensionRegistry == null) {
throw new java.lang.NullPointerException();
}
com.google.protobuf.UnknownFieldSet.Builder unknownFields =
com.google.protobuf.UnknownFieldSet.newBuilder();
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
case 48: {
killed_ = input.readBool();
break;
}
default: {
if (!parseUnknownField(
input, unknownFields, extensionRegistry, tag)) {
done = true;
}
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.InvalidProtocolBufferException(
e).setUnfinishedMessage(this);
} finally {
this.unknownFields = unknownFields.build();
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.internal_static_AbilityMetaSetKilledState_descriptor;
}
@java.lang.Override
protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internalGetFieldAccessorTable() {
return emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.internal_static_AbilityMetaSetKilledState_fieldAccessorTable
.ensureFieldAccessorsInitialized(
emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState.class, emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState.Builder.class);
}
public static final int KILLED_FIELD_NUMBER = 6;
private boolean killed_;
/**
* <code>bool killed = 6;</code>
* @return The killed.
*/
@java.lang.Override
public boolean getKilled() {
return killed_;
}
private byte memoizedIsInitialized = -1;
@java.lang.Override
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized == 1) return true;
if (isInitialized == 0) return false;
memoizedIsInitialized = 1;
return true;
}
@java.lang.Override
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
if (killed_ != false) {
output.writeBool(6, killed_);
}
unknownFields.writeTo(output);
}
@java.lang.Override
public int getSerializedSize() {
int size = memoizedSize;
if (size != -1) return size;
size = 0;
if (killed_ != false) {
size += com.google.protobuf.CodedOutputStream
.computeBoolSize(6, killed_);
}
size += unknownFields.getSerializedSize();
memoizedSize = size;
return size;
}
@java.lang.Override
public boolean equals(final java.lang.Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState)) {
return super.equals(obj);
}
emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState other = (emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState) obj;
if (getKilled()
!= other.getKilled()) return false;
if (!unknownFields.equals(other.unknownFields)) return false;
return true;
}
@java.lang.Override
public int hashCode() {
if (memoizedHashCode != 0) {
return memoizedHashCode;
}
int hash = 41;
hash = (19 * hash) + getDescriptor().hashCode();
hash = (37 * hash) + KILLED_FIELD_NUMBER;
hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
getKilled());
hash = (29 * hash) + unknownFields.hashCode();
memoizedHashCode = hash;
return hash;
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
@java.lang.Override
public Builder newBuilderForType() { return newBuilder(); }
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
public static Builder newBuilder(emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@java.lang.Override
public Builder toBuilder() {
return this == DEFAULT_INSTANCE
? new Builder() : new Builder().mergeFrom(this);
}
@java.lang.Override
protected Builder newBuilderForType(
com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
Builder builder = new Builder(parent);
return builder;
}
/**
* <pre>
* Handcrafted by Magix!
* </pre>
*
* Protobuf type {@code AbilityMetaSetKilledState}
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
// @@protoc_insertion_point(builder_implements:AbilityMetaSetKilledState)
emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledStateOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.internal_static_AbilityMetaSetKilledState_descriptor;
}
@java.lang.Override
protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internalGetFieldAccessorTable() {
return emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.internal_static_AbilityMetaSetKilledState_fieldAccessorTable
.ensureFieldAccessorsInitialized(
emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState.class, emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState.Builder.class);
}
// Construct using emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private Builder(
com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
super(parent);
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
if (com.google.protobuf.GeneratedMessageV3
.alwaysUseFieldBuilders) {
}
}
@java.lang.Override
public Builder clear() {
super.clear();
killed_ = false;
return this;
}
@java.lang.Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
return emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.internal_static_AbilityMetaSetKilledState_descriptor;
}
@java.lang.Override
public emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState getDefaultInstanceForType() {
return emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState.getDefaultInstance();
}
@java.lang.Override
public emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState build() {
emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
@java.lang.Override
public emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState buildPartial() {
emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState result = new emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState(this);
result.killed_ = killed_;
onBuilt();
return result;
}
@java.lang.Override
public Builder clone() {
return super.clone();
}
@java.lang.Override
public Builder setField(
com.google.protobuf.Descriptors.FieldDescriptor field,
java.lang.Object value) {
return super.setField(field, value);
}
@java.lang.Override
public Builder clearField(
com.google.protobuf.Descriptors.FieldDescriptor field) {
return super.clearField(field);
}
@java.lang.Override
public Builder clearOneof(
com.google.protobuf.Descriptors.OneofDescriptor oneof) {
return super.clearOneof(oneof);
}
@java.lang.Override
public Builder setRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
int index, java.lang.Object value) {
return super.setRepeatedField(field, index, value);
}
@java.lang.Override
public Builder addRepeatedField(
com.google.protobuf.Descriptors.FieldDescriptor field,
java.lang.Object value) {
return super.addRepeatedField(field, value);
}
@java.lang.Override
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState) {
return mergeFrom((emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState other) {
if (other == emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState.getDefaultInstance()) return this;
if (other.getKilled() != false) {
setKilled(other.getKilled());
}
this.mergeUnknownFields(other.unknownFields);
onChanged();
return this;
}
@java.lang.Override
public final boolean isInitialized() {
return true;
}
@java.lang.Override
public Builder mergeFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private boolean killed_ ;
/**
* <code>bool killed = 6;</code>
* @return The killed.
*/
@java.lang.Override
public boolean getKilled() {
return killed_;
}
/**
* <code>bool killed = 6;</code>
* @param value The killed to set.
* @return This builder for chaining.
*/
public Builder setKilled(boolean value) {
killed_ = value;
onChanged();
return this;
}
/**
* <code>bool killed = 6;</code>
* @return This builder for chaining.
*/
public Builder clearKilled() {
killed_ = false;
onChanged();
return this;
}
@java.lang.Override
public final Builder setUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.setUnknownFields(unknownFields);
}
@java.lang.Override
public final Builder mergeUnknownFields(
final com.google.protobuf.UnknownFieldSet unknownFields) {
return super.mergeUnknownFields(unknownFields);
}
// @@protoc_insertion_point(builder_scope:AbilityMetaSetKilledState)
}
// @@protoc_insertion_point(class_scope:AbilityMetaSetKilledState)
private static final emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState DEFAULT_INSTANCE;
static {
DEFAULT_INSTANCE = new emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState();
}
public static emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState getDefaultInstance() {
return DEFAULT_INSTANCE;
}
private static final com.google.protobuf.Parser<AbilityMetaSetKilledState>
PARSER = new com.google.protobuf.AbstractParser<AbilityMetaSetKilledState>() {
@java.lang.Override
public AbilityMetaSetKilledState parsePartialFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return new AbilityMetaSetKilledState(input, extensionRegistry);
}
};
public static com.google.protobuf.Parser<AbilityMetaSetKilledState> parser() {
return PARSER;
}
@java.lang.Override
public com.google.protobuf.Parser<AbilityMetaSetKilledState> getParserForType() {
return PARSER;
}
@java.lang.Override
public emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
}
private static final com.google.protobuf.Descriptors.Descriptor
internal_static_AbilityMetaSetKilledState_descriptor;
private static final
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
internal_static_AbilityMetaSetKilledState_fieldAccessorTable;
public static com.google.protobuf.Descriptors.FileDescriptor
getDescriptor() {
return descriptor;
}
private static com.google.protobuf.Descriptors.FileDescriptor
descriptor;
static {
java.lang.String[] descriptorData = {
"\n\037AbilityMetaSetKilledState.proto\"+\n\031Abi" +
"lityMetaSetKilledState\022\016\n\006killed\030\006 \001(\010B\033" +
"\n\031emu.grasscutter.net.protob\006proto3"
};
descriptor = com.google.protobuf.Descriptors.FileDescriptor
.internalBuildGeneratedFileFrom(descriptorData,
new com.google.protobuf.Descriptors.FileDescriptor[] {
});
internal_static_AbilityMetaSetKilledState_descriptor =
getDescriptor().getMessageTypes().get(0);
internal_static_AbilityMetaSetKilledState_fieldAccessorTable = new
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
internal_static_AbilityMetaSetKilledState_descriptor,
new java.lang.String[] { "Killed", });
}
// @@protoc_insertion_point(outer_class_scope)
}
@@ -19,11 +19,11 @@ public final class AvatarUpgradeRspOuterClass {
com.google.protobuf.MessageOrBuilder {
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
int getOldFightPropMapCount();
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
boolean containsOldFightPropMap(
int key);
@@ -34,19 +34,19 @@ public final class AvatarUpgradeRspOuterClass {
java.util.Map<java.lang.Integer, java.lang.Float>
getOldFightPropMap();
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
java.util.Map<java.lang.Integer, java.lang.Float>
getOldFightPropMapMap();
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
float getOldFightPropMapOrDefault(
int key,
float defaultValue);
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
float getOldFightPropMapOrThrow(
@@ -65,11 +65,11 @@ public final class AvatarUpgradeRspOuterClass {
int getCurLevel();
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
int getCurFightPropMapCount();
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
boolean containsCurFightPropMap(
int key);
@@ -80,19 +80,19 @@ public final class AvatarUpgradeRspOuterClass {
java.util.Map<java.lang.Integer, java.lang.Float>
getCurFightPropMap();
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
java.util.Map<java.lang.Integer, java.lang.Float>
getCurFightPropMapMap();
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
float getCurFightPropMapOrDefault(
int key,
float defaultValue);
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
float getCurFightPropMapOrThrow(
@@ -177,19 +177,6 @@ public final class AvatarUpgradeRspOuterClass {
break;
}
case 98: {
if (!((mutable_bitField0_ & 0x00000002) != 0)) {
curFightPropMap_ = com.google.protobuf.MapField.newMapField(
CurFightPropMapDefaultEntryHolder.defaultEntry);
mutable_bitField0_ |= 0x00000002;
}
com.google.protobuf.MapEntry<java.lang.Integer, java.lang.Float>
curFightPropMap__ = input.readMessage(
CurFightPropMapDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
curFightPropMap_.getMutableMap().put(
curFightPropMap__.getKey(), curFightPropMap__.getValue());
break;
}
case 106: {
if (!((mutable_bitField0_ & 0x00000001) != 0)) {
oldFightPropMap_ = com.google.protobuf.MapField.newMapField(
OldFightPropMapDefaultEntryHolder.defaultEntry);
@@ -202,6 +189,19 @@ public final class AvatarUpgradeRspOuterClass {
oldFightPropMap__.getKey(), oldFightPropMap__.getValue());
break;
}
case 106: {
if (!((mutable_bitField0_ & 0x00000002) != 0)) {
curFightPropMap_ = com.google.protobuf.MapField.newMapField(
CurFightPropMapDefaultEntryHolder.defaultEntry);
mutable_bitField0_ |= 0x00000002;
}
com.google.protobuf.MapEntry<java.lang.Integer, java.lang.Float>
curFightPropMap__ = input.readMessage(
CurFightPropMapDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
curFightPropMap_.getMutableMap().put(
curFightPropMap__.getKey(), curFightPropMap__.getValue());
break;
}
case 112: {
curLevel_ = input.readUInt32();
@@ -236,9 +236,9 @@ public final class AvatarUpgradeRspOuterClass {
protected com.google.protobuf.MapField internalGetMapField(
int number) {
switch (number) {
case 13:
return internalGetOldFightPropMap();
case 12:
return internalGetOldFightPropMap();
case 13:
return internalGetCurFightPropMap();
default:
throw new RuntimeException(
@@ -253,7 +253,7 @@ public final class AvatarUpgradeRspOuterClass {
emu.grasscutter.net.proto.AvatarUpgradeRspOuterClass.AvatarUpgradeRsp.class, emu.grasscutter.net.proto.AvatarUpgradeRspOuterClass.AvatarUpgradeRsp.Builder.class);
}
public static final int OLD_FIGHT_PROP_MAP_FIELD_NUMBER = 13;
public static final int OLD_FIGHT_PROP_MAP_FIELD_NUMBER = 12;
private static final class OldFightPropMapDefaultEntryHolder {
static final com.google.protobuf.MapEntry<
java.lang.Integer, java.lang.Float> defaultEntry =
@@ -280,7 +280,7 @@ public final class AvatarUpgradeRspOuterClass {
return internalGetOldFightPropMap().getMap().size();
}
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
@java.lang.Override
@@ -298,7 +298,7 @@ public final class AvatarUpgradeRspOuterClass {
return getOldFightPropMapMap();
}
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
@java.lang.Override
@@ -306,7 +306,7 @@ public final class AvatarUpgradeRspOuterClass {
return internalGetOldFightPropMap().getMap();
}
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
@java.lang.Override
@@ -319,7 +319,7 @@ public final class AvatarUpgradeRspOuterClass {
return map.containsKey(key) ? map.get(key) : defaultValue;
}
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
@java.lang.Override
@@ -356,7 +356,7 @@ public final class AvatarUpgradeRspOuterClass {
return curLevel_;
}
public static final int CUR_FIGHT_PROP_MAP_FIELD_NUMBER = 12;
public static final int CUR_FIGHT_PROP_MAP_FIELD_NUMBER = 13;
private static final class CurFightPropMapDefaultEntryHolder {
static final com.google.protobuf.MapEntry<
java.lang.Integer, java.lang.Float> defaultEntry =
@@ -383,7 +383,7 @@ public final class AvatarUpgradeRspOuterClass {
return internalGetCurFightPropMap().getMap().size();
}
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
@java.lang.Override
@@ -401,7 +401,7 @@ public final class AvatarUpgradeRspOuterClass {
return getCurFightPropMapMap();
}
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
@java.lang.Override
@@ -409,7 +409,7 @@ public final class AvatarUpgradeRspOuterClass {
return internalGetCurFightPropMap().getMap();
}
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
@java.lang.Override
@@ -422,7 +422,7 @@ public final class AvatarUpgradeRspOuterClass {
return map.containsKey(key) ? map.get(key) : defaultValue;
}
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
@java.lang.Override
@@ -485,14 +485,14 @@ public final class AvatarUpgradeRspOuterClass {
com.google.protobuf.GeneratedMessageV3
.serializeIntegerMapTo(
output,
internalGetCurFightPropMap(),
CurFightPropMapDefaultEntryHolder.defaultEntry,
internalGetOldFightPropMap(),
OldFightPropMapDefaultEntryHolder.defaultEntry,
12);
com.google.protobuf.GeneratedMessageV3
.serializeIntegerMapTo(
output,
internalGetOldFightPropMap(),
OldFightPropMapDefaultEntryHolder.defaultEntry,
internalGetCurFightPropMap(),
CurFightPropMapDefaultEntryHolder.defaultEntry,
13);
if (curLevel_ != 0) {
output.writeUInt32(14, curLevel_);
@@ -518,16 +518,6 @@ public final class AvatarUpgradeRspOuterClass {
size += com.google.protobuf.CodedOutputStream
.computeInt32Size(10, retcode_);
}
for (java.util.Map.Entry<java.lang.Integer, java.lang.Float> entry
: internalGetCurFightPropMap().getMap().entrySet()) {
com.google.protobuf.MapEntry<java.lang.Integer, java.lang.Float>
curFightPropMap__ = CurFightPropMapDefaultEntryHolder.defaultEntry.newBuilderForType()
.setKey(entry.getKey())
.setValue(entry.getValue())
.build();
size += com.google.protobuf.CodedOutputStream
.computeMessageSize(12, curFightPropMap__);
}
for (java.util.Map.Entry<java.lang.Integer, java.lang.Float> entry
: internalGetOldFightPropMap().getMap().entrySet()) {
com.google.protobuf.MapEntry<java.lang.Integer, java.lang.Float>
@@ -536,7 +526,17 @@ public final class AvatarUpgradeRspOuterClass {
.setValue(entry.getValue())
.build();
size += com.google.protobuf.CodedOutputStream
.computeMessageSize(13, oldFightPropMap__);
.computeMessageSize(12, oldFightPropMap__);
}
for (java.util.Map.Entry<java.lang.Integer, java.lang.Float> entry
: internalGetCurFightPropMap().getMap().entrySet()) {
com.google.protobuf.MapEntry<java.lang.Integer, java.lang.Float>
curFightPropMap__ = CurFightPropMapDefaultEntryHolder.defaultEntry.newBuilderForType()
.setKey(entry.getKey())
.setValue(entry.getValue())
.build();
size += com.google.protobuf.CodedOutputStream
.computeMessageSize(13, curFightPropMap__);
}
if (curLevel_ != 0) {
size += com.google.protobuf.CodedOutputStream
@@ -713,9 +713,9 @@ public final class AvatarUpgradeRspOuterClass {
protected com.google.protobuf.MapField internalGetMapField(
int number) {
switch (number) {
case 13:
return internalGetOldFightPropMap();
case 12:
return internalGetOldFightPropMap();
case 13:
return internalGetCurFightPropMap();
default:
throw new RuntimeException(
@@ -726,9 +726,9 @@ public final class AvatarUpgradeRspOuterClass {
protected com.google.protobuf.MapField internalGetMutableMapField(
int number) {
switch (number) {
case 13:
return internalGetMutableOldFightPropMap();
case 12:
return internalGetMutableOldFightPropMap();
case 13:
return internalGetMutableCurFightPropMap();
default:
throw new RuntimeException(
@@ -927,7 +927,7 @@ public final class AvatarUpgradeRspOuterClass {
return internalGetOldFightPropMap().getMap().size();
}
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
@java.lang.Override
@@ -945,7 +945,7 @@ public final class AvatarUpgradeRspOuterClass {
return getOldFightPropMapMap();
}
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
@java.lang.Override
@@ -953,7 +953,7 @@ public final class AvatarUpgradeRspOuterClass {
return internalGetOldFightPropMap().getMap();
}
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
@java.lang.Override
@@ -966,7 +966,7 @@ public final class AvatarUpgradeRspOuterClass {
return map.containsKey(key) ? map.get(key) : defaultValue;
}
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
@java.lang.Override
@@ -987,7 +987,7 @@ public final class AvatarUpgradeRspOuterClass {
return this;
}
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
public Builder removeOldFightPropMap(
@@ -1006,7 +1006,7 @@ public final class AvatarUpgradeRspOuterClass {
return internalGetMutableOldFightPropMap().getMutableMap();
}
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
public Builder putOldFightPropMap(
int key,
@@ -1018,7 +1018,7 @@ public final class AvatarUpgradeRspOuterClass {
return this;
}
/**
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 13;</code>
* <code>map&lt;uint32, float&gt; old_fight_prop_map = 12;</code>
*/
public Builder putAllOldFightPropMap(
@@ -1117,7 +1117,7 @@ public final class AvatarUpgradeRspOuterClass {
return internalGetCurFightPropMap().getMap().size();
}
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
@java.lang.Override
@@ -1135,7 +1135,7 @@ public final class AvatarUpgradeRspOuterClass {
return getCurFightPropMapMap();
}
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
@java.lang.Override
@@ -1143,7 +1143,7 @@ public final class AvatarUpgradeRspOuterClass {
return internalGetCurFightPropMap().getMap();
}
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
@java.lang.Override
@@ -1156,7 +1156,7 @@ public final class AvatarUpgradeRspOuterClass {
return map.containsKey(key) ? map.get(key) : defaultValue;
}
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
@java.lang.Override
@@ -1177,7 +1177,7 @@ public final class AvatarUpgradeRspOuterClass {
return this;
}
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
public Builder removeCurFightPropMap(
@@ -1196,7 +1196,7 @@ public final class AvatarUpgradeRspOuterClass {
return internalGetMutableCurFightPropMap().getMutableMap();
}
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
public Builder putCurFightPropMap(
int key,
@@ -1208,7 +1208,7 @@ public final class AvatarUpgradeRspOuterClass {
return this;
}
/**
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 12;</code>
* <code>map&lt;uint32, float&gt; cur_fight_prop_map = 13;</code>
*/
public Builder putAllCurFightPropMap(
@@ -1357,10 +1357,10 @@ public final class AvatarUpgradeRspOuterClass {
static {
java.lang.String[] descriptorData = {
"\n\026AvatarUpgradeRsp.proto\"\326\002\n\020AvatarUpgra" +
"deRsp\022B\n\022old_fight_prop_map\030\r \003(\0132&.Avat" +
"deRsp\022B\n\022old_fight_prop_map\030\014 \003(\0132&.Avat" +
"arUpgradeRsp.OldFightPropMapEntry\022\023\n\013ava" +
"tar_guid\030\010 \001(\004\022\021\n\tcur_level\030\016 \001(\r\022B\n\022cur" +
"_fight_prop_map\030\014 \003(\0132&.AvatarUpgradeRsp" +
"_fight_prop_map\030\r \003(\0132&.AvatarUpgradeRsp" +
".CurFightPropMapEntry\022\017\n\007retcode\030\n \001(\005\022\021" +
"\n\told_level\030\004 \001(\r\0326\n\024OldFightPropMapEntr" +
"y\022\013\n\003key\030\001 \001(\r\022\r\n\005value\030\002 \001(\002:\0028\001\0326\n\024Cur" +
@@ -224,123 +224,6 @@ public final class ChatInfoOuterClass {
emu.grasscutter.net.proto.ChatInfoOuterClass.ChatInfo.class, emu.grasscutter.net.proto.ChatInfoOuterClass.ChatInfo.Builder.class);
}
/**
* Protobuf enum {@code ChatInfo.SystemHintType}
*/
public enum SystemHintType
implements com.google.protobuf.ProtocolMessageEnum {
/**
* <code>SYSTEM_HINT_TYPE_CHAT_NONE = 0;</code>
*/
SYSTEM_HINT_TYPE_CHAT_NONE(0),
/**
* <code>SYSTEM_HINT_TYPE_CHAT_ENTER_WORLD = 1;</code>
*/
SYSTEM_HINT_TYPE_CHAT_ENTER_WORLD(1),
/**
* <code>SYSTEM_HINT_TYPE_CHAT_LEAVE_WORLD = 2;</code>
*/
SYSTEM_HINT_TYPE_CHAT_LEAVE_WORLD(2),
UNRECOGNIZED(-1),
;
/**
* <code>SYSTEM_HINT_TYPE_CHAT_NONE = 0;</code>
*/
public static final int SYSTEM_HINT_TYPE_CHAT_NONE_VALUE = 0;
/**
* <code>SYSTEM_HINT_TYPE_CHAT_ENTER_WORLD = 1;</code>
*/
public static final int SYSTEM_HINT_TYPE_CHAT_ENTER_WORLD_VALUE = 1;
/**
* <code>SYSTEM_HINT_TYPE_CHAT_LEAVE_WORLD = 2;</code>
*/
public static final int SYSTEM_HINT_TYPE_CHAT_LEAVE_WORLD_VALUE = 2;
public final int getNumber() {
if (this == UNRECOGNIZED) {
throw new java.lang.IllegalArgumentException(
"Can't get the number of an unknown enum value.");
}
return value;
}
/**
* @param value The numeric wire value of the corresponding enum entry.
* @return The enum associated with the given numeric wire value.
* @deprecated Use {@link #forNumber(int)} instead.
*/
@java.lang.Deprecated
public static SystemHintType valueOf(int value) {
return forNumber(value);
}
/**
* @param value The numeric wire value of the corresponding enum entry.
* @return The enum associated with the given numeric wire value.
*/
public static SystemHintType forNumber(int value) {
switch (value) {
case 0: return SYSTEM_HINT_TYPE_CHAT_NONE;
case 1: return SYSTEM_HINT_TYPE_CHAT_ENTER_WORLD;
case 2: return SYSTEM_HINT_TYPE_CHAT_LEAVE_WORLD;
default: return null;
}
}
public static com.google.protobuf.Internal.EnumLiteMap<SystemHintType>
internalGetValueMap() {
return internalValueMap;
}
private static final com.google.protobuf.Internal.EnumLiteMap<
SystemHintType> internalValueMap =
new com.google.protobuf.Internal.EnumLiteMap<SystemHintType>() {
public SystemHintType findValueByNumber(int number) {
return SystemHintType.forNumber(number);
}
};
public final com.google.protobuf.Descriptors.EnumValueDescriptor
getValueDescriptor() {
if (this == UNRECOGNIZED) {
throw new java.lang.IllegalStateException(
"Can't get the descriptor of an unrecognized enum value.");
}
return getDescriptor().getValues().get(ordinal());
}
public final com.google.protobuf.Descriptors.EnumDescriptor
getDescriptorForType() {
return getDescriptor();
}
public static final com.google.protobuf.Descriptors.EnumDescriptor
getDescriptor() {
return emu.grasscutter.net.proto.ChatInfoOuterClass.ChatInfo.getDescriptor().getEnumTypes().get(0);
}
private static final SystemHintType[] VALUES = values();
public static SystemHintType valueOf(
com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
if (desc.getType() != getDescriptor()) {
throw new java.lang.IllegalArgumentException(
"EnumValueDescriptor is not for this type.");
}
if (desc.getIndex() == -1) {
return UNRECOGNIZED;
}
return VALUES[desc.getIndex()];
}
private final int value;
private SystemHintType(int value) {
this.value = value;
}
// @@protoc_insertion_point(enum_scope:ChatInfo.SystemHintType)
}
public interface SystemHintOrBuilder extends
// @@protoc_insertion_point(interface_extends:ChatInfo.SystemHint)
com.google.protobuf.MessageOrBuilder {
@@ -2024,16 +1907,13 @@ public final class ChatInfoOuterClass {
descriptor;
static {
java.lang.String[] descriptorData = {
"\n\016ChatInfo.proto\"\317\002\n\010ChatInfo\022\014\n\004time\030\007 " +
"\n\016ChatInfo.proto\"\317\001\n\010ChatInfo\022\014\n\004time\030\007 " +
"\001(\r\022\016\n\006to_uid\030\006 \001(\r\022\017\n\007is_read\030\004 \001(\010\022\013\n\003" +
"uid\030\005 \001(\r\022\020\n\010sequence\030\014 \001(\r\022\017\n\004text\030\230\003 \001" +
"(\tH\000\022\017\n\004icon\030\234\n \001(\rH\000\022,\n\013system_hint\030\246\001 " +
"\001(\0132\024.ChatInfo.SystemHintH\000\032\032\n\nSystemHin" +
"t\022\014\n\004type\030\r \001(\r\"~\n\016SystemHintType\022\036\n\032SYS" +
"TEM_HINT_TYPE_CHAT_NONE\020\000\022%\n!SYSTEM_HINT" +
"_TYPE_CHAT_ENTER_WORLD\020\001\022%\n!SYSTEM_HINT_" +
"TYPE_CHAT_LEAVE_WORLD\020\002B\t\n\007contentB\033\n\031em" +
"u.grasscutter.net.protob\006proto3"
"t\022\014\n\004type\030\r \001(\rB\t\n\007contentB\033\n\031emu.grassc" +
"utter.net.protob\006proto3"
};
descriptor = com.google.protobuf.Descriptors.FileDescriptor
.internalBuildGeneratedFileFrom(descriptorData,
+1 -20
View File
@@ -8,7 +8,7 @@ import emu.grasscutter.auth.*;
import emu.grasscutter.command.*;
import emu.grasscutter.config.ConfigContainer;
import emu.grasscutter.data.ResourceLoader;
import emu.grasscutter.database.*;
import emu.grasscutter.database.DatabaseManager;
import emu.grasscutter.plugin.PluginManager;
import emu.grasscutter.plugin.api.ServerHelper;
import emu.grasscutter.server.dispatch.DispatchServer;
@@ -183,25 +183,6 @@ public final class Grasscutter {
private static void onShutdown() {
// Disable all plugins.
if (pluginManager != null) pluginManager.disablePlugins();
// Shutdown the game server.
if (gameServer != null) gameServer.onServerShutdown();
try {
// Wait for Grasscutter's thread pool to finish.
var executor = Grasscutter.getThreadPool();
executor.shutdown();
if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
// Wait for database operations to finish.
var dbExecutor = DatabaseHelper.getEventExecutor();
dbExecutor.shutdown();
if (!dbExecutor.awaitTermination(5, TimeUnit.SECONDS)) {
dbExecutor.shutdownNow();
}
} catch (InterruptedException ignored) {
}
}
/*
@@ -5,7 +5,8 @@ import static emu.grasscutter.config.Configuration.SERVER;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.player.Player;
import it.unimi.dsi.fastutil.objects.*;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import java.util.*;
import org.reflections.Reflections;
@@ -11,8 +11,8 @@ import lombok.val;
label = "cutscene",
aliases = {"c"},
usage = {"[<cutsceneId>]"},
permission = "player.cutscene",
permissionTargeted = "player.cutscene.others")
permission = "player.group",
permissionTargeted = "player.group.others")
public final class CutsceneCommand implements CommandHandler {
@Override
@@ -12,7 +12,7 @@ import java.util.Map;
@Command(
label = "list",
aliases = {"players"},
usage = {"[uid]"},
usage = {"[<UID>]"},
targetRequirement = Command.TargetRequirement.NONE)
public final class ListCommand implements CommandHandler {
@@ -2,23 +2,23 @@ package emu.grasscutter.command.commands;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.command.*;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.quest.GameQuest;
import java.util.List;
import java.util.stream.Collectors;
@Command(
label = "quest",
aliases = {"q"},
usage = {"(add|finish|running|talking|debug|triggers|grouptriggers) [<questId>]", "dungeons"},
usage = {"(add|finish) [<questId>]"},
permission = "player.quest",
permissionTargeted = "player.quest.others")
public final class QuestCommand implements CommandHandler {
@Override
public void execute(Player sender, Player targetPlayer, List<String> args) {
if (args.size() != 2 || (args.size() == 1 && !args.get(0).toLowerCase().equals("dungeons"))) {
if (args.size() != 2) {
sendUsageMessage(sender);
return;
}
@@ -112,7 +112,7 @@ public final class QuestCommand implements CommandHandler {
var shouldAdd = !loggedQuests.contains(questId);
if (shouldAdd) loggedQuests.add(questId);
else loggedQuests.remove(loggedQuests.indexOf(questId));
else loggedQuests.remove(questId);
CommandHandler.sendMessage(
sender,
@@ -131,22 +131,6 @@ public final class QuestCommand implements CommandHandler {
"Triggers registered for %s: %s."
.formatted(questId, String.join(", ", quest.getTriggers().keySet())));
}
case "grouptriggers" -> {
var scene = targetPlayer.getScene();
var scriptManager = scene.getScriptManager();
var group = scriptManager.getGroupById(questId);
if (group == null) {
CommandHandler.sendMessage(sender, "The group does not exist.");
return;
}
CommandHandler.sendMessage(
sender,
group.triggers.entrySet().stream()
.map(entry -> "%s: %s".formatted(entry.getKey(), entry.getValue()))
.collect(Collectors.joining(", ")));
}
default -> this.sendUsageMessage(sender);
}
}
@@ -12,7 +12,6 @@ import emu.grasscutter.server.packet.send.PacketScenePointUnlockNotify;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.IntStream;
@Command(
@@ -108,7 +107,6 @@ public final class SetPropCommand implements CommandHandler {
case "on", "true" -> 1;
case "off", "false" -> 0;
case "toggle" -> -1;
case "all" -> -2;
default -> Integer.parseInt(valueStr);
};
} catch (NumberFormatException ignored) {
@@ -128,7 +126,7 @@ public final class SetPropCommand implements CommandHandler {
sender, targetPlayer, prop.pseudoProp, value);
case SET_OPENSTATE -> this.setOpenState(targetPlayer, value, 1);
case UNSET_OPENSTATE -> this.setOpenState(targetPlayer, value, 0);
case UNLOCK_MAP -> unlockMap(targetPlayer, value);
case UNLOCK_MAP -> unlockMap(targetPlayer);
default -> targetPlayer.setProperty(prop.prop, value);
};
@@ -219,30 +217,13 @@ public final class SetPropCommand implements CommandHandler {
return true;
}
private boolean unlockMap(Player targetPlayer, int value) {
private boolean unlockMap(Player targetPlayer) {
// Unlock.
GameData.getScenePointsPerScene()
.forEach(
(sceneId, scenePoints) -> {
if (value == -2) {
// Unlock trans points.
targetPlayer.getUnlockedScenePoints(sceneId).addAll(scenePoints);
} else {
var scenePointsBackup = new CopyOnWriteArrayList<>(scenePoints);
for (var p : scenePointsBackup) {
var scenePointEentry = GameData.getScenePointEntryById(sceneId, p);
var pointData = scenePointEentry.getPointData();
boolean forbidSimpleUnlock = pointData.isForbidSimpleUnlock();
boolean sceneBuildingPointLocked =
pointData.getType().equals("SceneBuildingPoint") && !pointData.isUnlocked();
if (forbidSimpleUnlock || sceneBuildingPointLocked) scenePointsBackup.remove(p);
}
// Unlock trans points.
targetPlayer.getUnlockedScenePoints(sceneId).addAll(scenePointsBackup);
}
// Unlock trans points.
targetPlayer.getUnlockedScenePoints(sceneId).addAll(scenePoints);
// Unlock map areas.
targetPlayer.getUnlockedSceneAreas(sceneId).addAll(sceneAreas);
@@ -14,8 +14,8 @@ import lombok.val;
label = "sound",
aliases = {"s", "audio"},
usage = {"[<audioname>] [<x><y><z>]"},
permission = "player.sound",
permissionTargeted = "player.sound.others")
permission = "player.group",
permissionTargeted = "player.group.others")
public final class SoundCommand implements CommandHandler {
@Override
@@ -17,21 +17,19 @@ import static emu.grasscutter.Grasscutter.*;
public class ConfigContainer {
/*
* Configuration changes:
* Version 5 - 'questing' has been changed from a boolean
* to a container of options ('questOptions').
* This field will be removed in future versions.
* Version 6 - 'questing' has been fully replaced with 'questOptions'.
* The field for 'legacyResources' has been removed.
* Version 7 - 'regionKey' is being added for authentication
* with the new dispatch server.
* Version 8 - 'server' is being added for enforcing handbook server
* addresses.
* Version 9 - 'limits' was added for handbook requests.
* Version 10 - 'trialCostumes' was added for enabling costumes
* on trial avatars.
* Version 5 - 'questing' has been changed from a boolean
* to a container of options ('questOptions').
* This field will be removed in future versions.
* Version 6 - 'questing' has been fully replaced with 'questOptions'.
* The field for 'legacyResources' has been removed.
* Version 7 - 'regionKey' is being added for authentication
* with the new dispatch server.
* Version 8 - 'server' is being added for enforcing handbook server
* addresses.
* Version 9 - 'limits' was added for handbook requests.
*/
private static int version() {
return 10;
return 9;
}
/**
@@ -257,8 +255,6 @@ public class ConfigContainer {
public boolean staminaUsage = true;
public boolean energyUsage = true;
public boolean fishhookTeleport = true;
public boolean trialCostumes = false;
@SerializedName(value = "questing", alternate = "questOptions")
public Questing questing = new Questing();
public ResinOptions resinOptions = new ResinOptions();
@@ -37,11 +37,8 @@ import emu.grasscutter.data.excels.world.WeatherData;
import emu.grasscutter.data.excels.world.WorldAreaData;
import emu.grasscutter.data.excels.world.WorldLevelData;
import emu.grasscutter.data.server.ActivityCondGroup;
import emu.grasscutter.data.server.DropSubfieldMapping;
import emu.grasscutter.data.server.DropTableExcelConfigData;
import emu.grasscutter.data.server.GadgetMapping;
import emu.grasscutter.data.server.MonsterMapping;
import emu.grasscutter.data.server.SubfieldMapping;
import emu.grasscutter.game.dungeons.DungeonDropEntry;
import emu.grasscutter.game.quest.QuestEncryptionKey;
import emu.grasscutter.game.quest.RewindData;
@@ -454,18 +451,6 @@ public final class GameData {
private static final Int2ObjectMap<GadgetMapping> gadgetMappingMap =
new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<SubfieldMapping> subfieldMappingMap =
new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<DropSubfieldMapping> dropSubfieldMappingMap =
new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<DropTableExcelConfigData> dropTableExcelConfigDataMap =
new Int2ObjectOpenHashMap<>();
@Getter
private static final Int2ObjectMap<MonsterMapping> monsterMappingMap =
new Int2ObjectOpenHashMap<>();
@@ -116,7 +116,6 @@ public final class ResourceLoader {
loadConfigLevelEntityData();
loadQuestShareConfig();
loadGadgetMappings();
loadSubfieldMappings();
loadMonsterMappings();
loadActivityCondGroups();
loadGroupReplacements();
@@ -806,51 +805,6 @@ public final class ResourceLoader {
}
}
private static void loadSubfieldMappings() {
try {
val subfieldMap = GameData.getSubfieldMappingMap();
try {
JsonUtils.loadToList(getResourcePath("Server/SubfieldMapping.json"), SubfieldMapping.class)
.forEach(entry -> subfieldMap.put(entry.getEntityId(), entry));
;
} catch (IOException | NullPointerException ignored) {
}
Grasscutter.getLogger().debug("Loaded {} subfield mappings.", subfieldMap.size());
} catch (Exception e) {
Grasscutter.getLogger().error("Unable to load subfield mappings.", e);
}
try {
val dropSubfieldMap = GameData.getDropSubfieldMappingMap();
try {
JsonUtils.loadToList(
getResourcePath("Server/DropSubfieldMapping.json"), DropSubfieldMapping.class)
.forEach(entry -> dropSubfieldMap.put(entry.getDropId(), entry));
;
} catch (IOException | NullPointerException ignored) {
}
Grasscutter.getLogger().debug("Loaded {} drop subfield mappings.", dropSubfieldMap.size());
} catch (Exception e) {
Grasscutter.getLogger().error("Unable to load drop subfield mappings.", e);
}
try {
val dropTableExcelConfigDataMap = GameData.getDropTableExcelConfigDataMap();
try {
JsonUtils.loadToList(
getResourcePath("Server/DropTableExcelConfigData.json"),
DropTableExcelConfigData.class)
.forEach(entry -> dropTableExcelConfigDataMap.put(entry.getId(), entry));
;
} catch (IOException | NullPointerException ignored) {
}
Grasscutter.getLogger()
.debug("Loaded {} drop table configs.", dropTableExcelConfigDataMap.size());
} catch (Exception e) {
Grasscutter.getLogger().error("Unable to load drop table config data.", e);
}
}
private static void loadMonsterMappings() {
try {
var monsterMap = GameData.getMonsterMappingMap();
@@ -87,10 +87,7 @@ public class AbilityData {
}
private void initializeModifiers() {
if (modifiers == null) {
this.modifiers = new HashMap<>();
return;
}
if (modifiers == null) return;
var _modifiers =
modifiers.entrySet().stream()
@@ -323,28 +323,9 @@ public class AbilityModifier implements Serializable {
public int skillID;
public AbilityModifierAction[] actions;
public AbilityModifierAction[] successActions;
public AbilityModifierAction[] failActions;
public DropType dropType = DropType.LevelControl;
public DynamicFloat baseEnergy;
public DynamicFloat ratio = DynamicFloat.ONE;
public int configID;
public DynamicFloat valueRangeMin;
public DynamicFloat valueRangeMax;
public String overrideMapKey;
public int param1;
public int param2;
public int param3;
public enum DropType {
LevelControl,
BigWorldOnly,
ForceDrop
}
}
// The following should be implemented into DynamicFloat if older resource formats need to be
@@ -11,6 +11,4 @@ public class ConfigLevelEntity {
@Getter private List<ConfigAbilityData> avatarAbilities;
@Getter private List<ConfigAbilityData> teamAbilities;
@Getter private List<Integer> preloadMonsterEntityIDs;
@Getter private String dropElemControlType;
}
@@ -19,8 +19,6 @@ public final class PointData {
@Getter private Position pos;
@Getter private Position rot;
@Getter private Position size;
@Getter private boolean forbidSimpleUnlock;
@Getter private boolean unlocked;
@SerializedName(
value = "dungeonIds",
@@ -1,10 +1,12 @@
package emu.grasscutter.data.excels;
import com.google.gson.annotations.SerializedName;
import emu.grasscutter.data.*;
import emu.grasscutter.data.GameResource;
import emu.grasscutter.data.ResourceType;
import emu.grasscutter.game.talk.TalkExec;
import java.util.List;
import lombok.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ResourceType(name = "TalkExcelConfigData.json")
@EqualsAndHashCode(callSuper = false)
@@ -36,11 +38,6 @@ public final class TalkConfigData extends GameResource {
this.finishExec == null
? List.of()
: this.finishExec.stream().filter(x -> x.getType() != null).toList();
if (this.questId <= 0) {
var id = String.valueOf(this.getId());
this.questId = Integer.parseInt(id.length() < 5 ? "0" : id.substring(0, 3));
}
}
@Data
@@ -32,7 +32,6 @@ public class DungeonData extends GameResource {
@Getter private int passRewardPreviewID;
@Getter private int statueCostID;
@Getter private int statueCostCount;
@Getter private int statueDrop;
// not part of DungeonExcelConfigData
@Getter private RewardPreviewData rewardPreviewData;
@@ -1,10 +0,0 @@
package emu.grasscutter.data.server;
import lombok.Data;
@Data
public final class DropSubfieldMapping {
private int dropId;
private int levelLimit;
private int itemId;
}
@@ -1,24 +0,0 @@
package emu.grasscutter.data.server;
import lombok.Data;
@Data
public final class DropTableExcelConfigData {
private int id;
private int randomType;
private int dropLevel;
private DropVectorEntry[] dropVec;
private int nodeType;
private boolean fallToGround;
private int sourceType;
private int everydayLimit;
private int historyLimit;
private int activityLimit;
@Data
public static class DropVectorEntry {
private int itemId;
private String countRange;
private int weight;
}
}
@@ -1,15 +0,0 @@
package emu.grasscutter.data.server;
import lombok.Data;
@Data
public final class SubfieldMapping {
private int entityId;
private SubfieldMappingEntry[] subfields;
@Data
public static class SubfieldMappingEntry {
private String subfieldName;
private int drop_id;
}
}
@@ -2,9 +2,11 @@ package emu.grasscutter.database;
import static com.mongodb.client.model.Filters.eq;
import dev.morphia.query.*;
import dev.morphia.query.FindOptions;
import dev.morphia.query.Sort;
import dev.morphia.query.experimental.filters.Filters;
import emu.grasscutter.*;
import emu.grasscutter.GameConstants;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.achievement.Achievements;
import emu.grasscutter.game.activity.PlayerActivityData;
@@ -24,10 +26,8 @@ import io.netty.util.concurrent.FastThreadLocalThread;
import java.util.List;
import java.util.concurrent.*;
import java.util.stream.Stream;
import lombok.Getter;
public final class DatabaseHelper {
@Getter
private static final ExecutorService eventExecutor =
new ThreadPoolExecutor(
6,
@@ -30,50 +30,30 @@ public class AbilityLocalIdGenerator {
}
public void initializeActionLocalIds(
AbilityModifierAction actions[], Map<Integer, AbilityModifierAction> localIdToAction) {
this.initializeActionLocalIds(actions, localIdToAction, false);
}
public void initializeActionLocalIds(
AbilityModifierAction[] actions,
Map<Integer, AbilityModifierAction> localIdToAction,
boolean preserveActionIndex) {
AbilityModifierAction[] actions, Map<Integer, AbilityModifierAction> localIdToAction) {
if (actions == null) return;
if (!preserveActionIndex) this.actionIndex = 0;
for (int i = 0; i < actions.length; i++) {
this.actionIndex++;
var id = GetLocalId();
localIdToAction.put((int) id, actions[i]);
if (actions[i].actions != null)
this.initializeActionLocalIds(actions[i].actions, localIdToAction, true);
else {
if (actions[i].successActions != null)
this.initializeActionLocalIds(
actions[i].successActions,
localIdToAction,
true); // Need to check this specific order
if (actions[i].failActions != null)
this.initializeActionLocalIds(actions[i].failActions, localIdToAction, true);
}
actionIndex = 0;
for (AbilityModifierAction action : actions) {
actionIndex++;
long id = GetLocalId();
localIdToAction.put((int) id, action);
}
if (!preserveActionIndex) actionIndex = 0;
actionIndex = 0;
}
public void initializeMixinsLocalIds(
AbilityMixinData[] mixins, Map<Integer, AbilityMixinData> localIdToAction) {
if (mixins == null) return;
this.mixinIndex = 0;
for (var mixin : mixins) {
var id = GetLocalId();
mixinIndex = 0;
for (AbilityMixinData mixin : mixins) {
long id = GetLocalId();
localIdToAction.put((int) id, mixin);
this.mixinIndex++;
mixinIndex++;
}
this.mixinIndex = 0;
mixinIndex = 0;
}
public long GetLocalId() {
@@ -9,12 +9,10 @@ import emu.grasscutter.game.ability.actions.*;
import emu.grasscutter.game.ability.mixins.*;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.game.player.*;
import emu.grasscutter.game.props.FightProperty;
import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry;
import emu.grasscutter.net.proto.AbilityMetaAddAbilityOuterClass.AbilityMetaAddAbility;
import emu.grasscutter.net.proto.AbilityMetaModifierChangeOuterClass.AbilityMetaModifierChange;
import emu.grasscutter.net.proto.AbilityMetaReInitOverrideMapOuterClass.AbilityMetaReInitOverrideMap;
import emu.grasscutter.net.proto.AbilityMetaSetKilledStateOuterClass.AbilityMetaSetKilledState;
import emu.grasscutter.net.proto.AbilityScalarTypeOuterClass.AbilityScalarType;
import emu.grasscutter.net.proto.AbilityScalarValueEntryOuterClass.AbilityScalarValueEntry;
import emu.grasscutter.net.proto.ModifierActionOuterClass.ModifierAction;
@@ -176,7 +174,6 @@ public final class AbilityManager extends BasePlayerManager {
case ABILITY_INVOKE_ARGUMENT_META_MODIFIER_DURABILITY_CHANGE -> this
.handleModifierDurabilityChange(invoke);
case ABILITY_INVOKE_ARGUMENT_META_ADD_NEW_ABILITY -> this.handleAddNewAbility(invoke);
case ABILITY_INVOKE_ARGUMENT_META_SET_KILLED_SETATE -> this.handleKillState(invoke);
default -> {}
}
}
@@ -538,25 +535,6 @@ public final class AbilityManager extends BasePlayerManager {
entity.getInstancedAbilities().size());
}
private void handleKillState(AbilityInvokeEntry invoke) throws InvalidProtocolBufferException {
var scene = this.getPlayer().getScene();
var entity = scene.getEntityById(invoke.getEntityId());
if (entity == null) {
Grasscutter.getLogger()
.trace("Entity of ID {} was not found in the scene.", invoke.getEntityId());
return;
}
var killState = AbilityMetaSetKilledState.parseFrom(invoke.getAbilityData());
if (killState.getKilled()) {
scene.killEntity(entity);
} else if (!entity.isAlive()) {
entity.setFightProperty(
FightProperty.FIGHT_PROP_CUR_HP,
entity.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP));
}
}
public void addAbilityToEntity(GameEntity entity, String name) {
AbilityData data = GameData.getAbilityData(name);
if (data != null) addAbilityToEntity(entity, data);
@@ -3,7 +3,7 @@ package emu.grasscutter.game.ability.actions;
import com.google.protobuf.ByteString;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
import emu.grasscutter.game.ability.Ability;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.entity.GameEntity;
@AbilityAction(AbilityModifierAction.Type.ExecuteGadgetLua)
public class ActionExecuteGadgetLua extends AbilityActionHandler {
@@ -1,100 +0,0 @@
package emu.grasscutter.game.ability.actions;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction.DropType;
import emu.grasscutter.data.binout.config.ConfigLevelEntity;
import emu.grasscutter.game.ability.Ability;
import emu.grasscutter.game.entity.EntityAvatar;
import emu.grasscutter.game.entity.EntityItem;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.game.props.SceneType;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.net.proto.AbilityActionGenerateElemBallOuterClass.AbilityActionGenerateElemBall;
@AbilityAction(AbilityModifierAction.Type.GenerateElemBall)
public final class ActionGenerateElemBall extends AbilityActionHandler {
@Override
public boolean execute(
Ability ability, AbilityModifierAction action, ByteString abilityData, GameEntity target) {
GameEntity owner = ability.getOwner();
AbilityActionGenerateElemBall generateElemBall;
try {
generateElemBall = AbilityActionGenerateElemBall.parseFrom(abilityData);
} catch (InvalidProtocolBufferException e) {
return false;
}
// Check if we should allow elem ball generation
if (action.dropType == DropType.LevelControl) {
String levelEntityConfig = owner.getScene().getSceneData().getLevelEntityConfig();
ConfigLevelEntity config = GameData.getConfigLevelEntityDataMap().get(levelEntityConfig);
if (config != null
&& config.getDropElemControlType() != null
&& config.getDropElemControlType().compareTo("None") == 0) {
Grasscutter.getLogger().warn("This level config don't allow element balls");
return true;
}
} else if (action.dropType == DropType.BigWorldOnly) {
if (owner.getScene().getSceneData().getSceneType() != SceneType.SCENE_WORLD) {
Grasscutter.getLogger().warn("This level config only allows element balls on big world");
return true;
}
} // Else the drop is forced
var energy = action.baseEnergy.get(ability) * action.ratio.get(ability);
if (energy <= 0.0) return true;
var itemData = GameData.getItemDataMap().get(action.configID);
if (itemData == null) {
Grasscutter.getLogger().warn("configID {} not found", action.configID);
return false;
}
if (itemData.getItemUse() == null || itemData.getItemUse().isEmpty()) {
Grasscutter.getLogger().warn("Item {} has no item use array", action.configID);
return true;
}
var itemUse = itemData.getItemUse().get(0);
double requiredEnergy;
switch (itemUse.getUseOp()) {
case ITEM_USE_ADD_ELEM_ENERGY:
requiredEnergy = Integer.parseInt(itemUse.getUseParam()[1]);
break;
case ITEM_USE_ADD_ALL_ENERGY:
requiredEnergy = Integer.parseInt(itemUse.getUseParam()[0]);
break;
default:
Grasscutter.getLogger().warn("UseOp not implemented", itemUse.getUseOp());
return false;
}
var amountGenerated = (int) Math.ceil(energy / requiredEnergy);
if (amountGenerated >= 21) {
Grasscutter.getLogger()
.warn("Attempt to generate more than 20 element balls {}", amountGenerated);
return false;
}
Grasscutter.getLogger()
.debug("Generating {} of {} element balls", amountGenerated, action.configID);
for (int i = 0; i < amountGenerated; i++) {
EntityItem energyBall =
new EntityItem(
owner.getScene(),
(owner instanceof EntityAvatar avatar) ? avatar.getPlayer() : null,
itemData,
new Position(generateElemBall.getPos()),
new Position(generateElemBall.getRot()),
1);
owner.getScene().addEntity(energyBall);
}
return true;
}
}
@@ -1,7 +1,6 @@
package emu.grasscutter.game.ability.actions;
import com.google.protobuf.ByteString;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
import emu.grasscutter.game.ability.Ability;
import emu.grasscutter.game.entity.GameEntity;
@@ -11,14 +10,9 @@ public final class ActionKillSelf extends AbilityActionHandler {
@Override
public boolean execute(
Ability ability, AbilityModifierAction action, ByteString abilityData, GameEntity target) {
// KillSelf should not have a target field, so target it's the actual entity to be applied.
// TODO: Check if this is always true.
if (target == null) {
Grasscutter.getLogger().warn("Tried killing null target");
return false;
}
GameEntity owner = ability.getOwner();
owner.getScene().killEntity(owner);
target.getScene().killEntity(target);
return true;
}
}
@@ -1,10 +1,11 @@
package emu.grasscutter.game.ability.actions;
import com.google.protobuf.ByteString;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
import emu.grasscutter.game.ability.Ability;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.entity.EntityClientGadget;
import emu.grasscutter.game.entity.EntityGadget;
import emu.grasscutter.game.entity.GameEntity;
@AbilityAction(AbilityModifierAction.Type.SetGlobalValueToOverrideMap)
public class ActionSetGlobalValueToOverrideMap extends AbilityActionHandler {
@@ -22,20 +23,15 @@ public class ActionSetGlobalValueToOverrideMap extends AbilityActionHandler {
var globalValueKey = action.globalValueKey;
var abilityFormula = action.abilityFormula;
if (!entity.getGlobalAbilityValues().containsKey(globalValueKey)) {
Grasscutter.getLogger().debug("Action does not contains {} global key", globalValueKey);
return true;
}
if (!entity.getGlobalAbilityValues().containsKey(globalValueKey)) return false;
var globalValue = entity.getGlobalAbilityValues().getOrDefault(globalValueKey, 0.0f);
if (abilityFormula.compareTo("DummyThrowSpeed") == 0) {
globalValue = ((globalValue * 30.0f) / ((float) Math.sin(0.9424778) * 100.0f)) - 1.0f;
}
entity.getGlobalAbilityValues().put(globalValueKey, globalValue); // Research if this is needed.
ability
.getAbilitySpecials()
.put(action.overrideMapKey, globalValue.floatValue()); // Override our own.
entity.getGlobalAbilityValues().put(globalValueKey, globalValue);
entity.onAbilityValueUpdate();
// TODO: ChangeServerGlobalValueNotify
@@ -1,41 +0,0 @@
package emu.grasscutter.game.ability.actions;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
import emu.grasscutter.game.ability.Ability;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.net.proto.AbilityActionSetRandomOverrideMapValueOuterClass.AbilityActionSetRandomOverrideMapValue;
@AbilityAction(AbilityModifierAction.Type.SetRandomOverrideMapValue)
public class ActionSetRandomOverrideMapValue extends AbilityActionHandler {
@Override
public boolean execute(
Ability ability, AbilityModifierAction action, ByteString abilityData, GameEntity target) {
AbilityActionSetRandomOverrideMapValue valueProto;
try {
valueProto = AbilityActionSetRandomOverrideMapValue.parseFrom(abilityData);
} catch (InvalidProtocolBufferException e) {
return false;
}
float value = valueProto.getRandomValue();
float valueRangeMin = action.valueRangeMin.get(ability);
float valueRangeMax = action.valueRangeMax.get(ability);
if (value < valueRangeMin || value > valueRangeMax) {
Grasscutter.getLogger()
.warn(
"Tried setting value out of range: {} inside [{}, {}]",
value,
valueRangeMin,
valueRangeMax);
return true;
}
ability.getAbilitySpecials().put(action.overrideMapKey, value);
return true;
}
}
@@ -1243,15 +1243,13 @@ public class Avatar {
});
// Add costume if avatar has a costume.
if (GAME_OPTIONS.trialCostumes) {
GameData.getAvatarCostumeDataItemIdMap()
.values()
.forEach(
costumeData -> {
if (costumeData.getCharacterId() != this.getAvatarId()) return;
this.setCostume(costumeData.getId());
});
}
GameData.getAvatarCostumeDataItemIdMap()
.values()
.forEach(
costumeData -> {
if (costumeData.getCharacterId() != this.getAvatarId()) return;
this.setCostume(costumeData.getId());
});
}
/** Equips the items applied from {@link Avatar#applyTrialItems()}. */
@@ -80,14 +80,6 @@ public final class DropSystem extends BaseGameSystem {
return dropData.getDropId();
}
public List<GameItem> handleDungeonRewardDrop(int dropId, boolean doubleReward) {
if (!dropTable.containsKey(dropId)) return List.of();
var dropData = dropTable.get(dropId);
List<GameItem> items = new ArrayList<>();
processDrop(dropData, doubleReward ? 2 : 1, items);
return items;
}
public boolean handleMonsterDrop(EntityMonster monster) {
int dropId;
int level = monster.getLevel();
@@ -134,16 +134,7 @@ public final class DungeonManager {
}
// Get and roll rewards.
List<GameItem> rewards =
player
.getServer()
.getDropSystem()
.handleDungeonRewardDrop(dungeonData.getStatueDrop(), useCondensed);
if (rewards.isEmpty()) {
// fallback to legacy drop system
Grasscutter.getLogger().debug("dungeon drop failed for {}", dungeonData.getId());
rewards = new ArrayList<>(this.rollRewards(useCondensed));
}
List<GameItem> rewards = new ArrayList<>(this.rollRewards(useCondensed));
// Add rewards to player and send notification.
player.getInventory().addItems(rewards, ActionReason.DungeonStatueDrop);
player.sendPacket(new PacketGadgetAutoPickDropInfoNotify(rewards));
@@ -196,7 +187,7 @@ public final class DungeonManager {
amount += Utils.drawRandomListElement(candidateAmounts, entry.getProbabilities());
}
// Double rewards in multiply mode, if specified.
// Double rewards in multiplay mode, if specified.
if (entry.isMpDouble() && this.getScene().getPlayerCount() > 1) {
amount *= 2;
}
@@ -8,9 +8,11 @@ import emu.grasscutter.data.excels.GadgetData;
import emu.grasscutter.game.entity.gadget.*;
import emu.grasscutter.game.entity.gadget.platform.BaseRoute;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.*;
import emu.grasscutter.game.world.*;
import emu.grasscutter.net.proto.*;
import emu.grasscutter.game.props.EntityIdType;
import emu.grasscutter.game.props.PlayerProperty;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.game.world.Scene;
import emu.grasscutter.game.world.SceneGroupInstance;
import emu.grasscutter.net.proto.AbilitySyncStateInfoOuterClass.AbilitySyncStateInfo;
import emu.grasscutter.net.proto.AnimatorParameterValueInfoPairOuterClass.AnimatorParameterValueInfoPair;
import emu.grasscutter.net.proto.EntityAuthorityInfoOuterClass.EntityAuthorityInfo;
@@ -18,21 +20,31 @@ import emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData;
import emu.grasscutter.net.proto.EntityRendererChangedInfoOuterClass.EntityRendererChangedInfo;
import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
import emu.grasscutter.net.proto.MotionInfoOuterClass.MotionInfo;
import emu.grasscutter.net.proto.PlatformInfoOuterClass;
import emu.grasscutter.net.proto.PropPairOuterClass.PropPair;
import emu.grasscutter.net.proto.ProtEntityTypeOuterClass.ProtEntityType;
import emu.grasscutter.net.proto.SceneEntityAiInfoOuterClass.SceneEntityAiInfo;
import emu.grasscutter.net.proto.SceneEntityInfoOuterClass.SceneEntityInfo;
import emu.grasscutter.net.proto.SceneGadgetInfoOuterClass.SceneGadgetInfo;
import emu.grasscutter.net.proto.VectorOuterClass.Vector;
import emu.grasscutter.net.proto.VisionTypeOuterClass;
import emu.grasscutter.scripts.EntityControllerScriptManager;
import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.data.*;
import emu.grasscutter.server.packet.send.*;
import emu.grasscutter.scripts.data.SceneGadget;
import emu.grasscutter.scripts.data.ScriptArgs;
import emu.grasscutter.server.packet.send.PacketGadgetStateNotify;
import emu.grasscutter.server.packet.send.PacketPlatformStartRouteNotify;
import emu.grasscutter.server.packet.send.PacketPlatformStopRouteNotify;
import emu.grasscutter.server.packet.send.PacketSceneTimeNotify;
import emu.grasscutter.utils.helpers.ProtoHelper;
import it.unimi.dsi.fastutil.ints.*;
import java.util.*;
import it.unimi.dsi.fastutil.ints.Int2FloatMap;
import it.unimi.dsi.fastutil.ints.Int2FloatOpenHashMap;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;
import lombok.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@ToString(callSuper = true)
public class EntityGadget extends EntityBaseGadget {
@@ -37,30 +37,14 @@ public class EntityItem extends EntityBaseGadget {
this(scene, player, itemData, pos, count, true);
}
public EntityItem(
Scene scene, Player player, ItemData itemData, Position pos, Position rotation, int count) {
this(scene, player, itemData, pos, rotation, count, true);
}
public EntityItem(
Scene scene, Player player, ItemData itemData, Position pos, int count, boolean share) {
this(scene, player, itemData, pos, null, count, share);
}
// In official game, some drop items are shared to all players, and some other items are
// independent to all players
// For example, if you killed a monster in MP mode, all players could get drops but rarity and
// number of them are different
// but if you broke regional mine, when someone picked up the drop then it disappeared
public EntityItem(
Scene scene,
Player player,
ItemData itemData,
Position pos,
Position rotation,
int count,
boolean share) {
super(scene, pos, rotation);
Scene scene, Player player, ItemData itemData, Position pos, int count, boolean share) {
super(scene, pos, null);
this.id = getScene().getWorld().getNextEntityId(EntityIdType.GADGET);
this.guid =
player == null ? scene.getWorld().getHost().getNextGameGuid() : player.getNextGameGuid();
@@ -113,13 +113,7 @@ public class EntityMonster extends GameEntity {
if(monster != null) affixes = monster.affix;
}
if (monsterData != null) {
// TODO: Research if group affixes goes first
if (affixes == null) affixes = monsterData.getAffix();
else affixes.addAll(monsterData.getAffix());
}
if(affixes != null) {
if (affixes != null) {
for(var affixId : affixes) {
var affix = GameData.getMonsterAffixDataMap().get(affixId.intValue());
if (!affix.isPreAdd()) continue;
@@ -1,6 +1,5 @@
package emu.grasscutter.game.entity;
import emu.grasscutter.data.GameData;
import emu.grasscutter.game.ability.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.*;
@@ -52,8 +51,8 @@ public abstract class GameEntity {
public abstract void initAbilities();
public EntityType getEntityType() {
return EntityIdType.toEntityType(this.getId() >> 24);
public int getEntityType() {
return this.getId() >> 24;
}
public abstract int getEntityTypeId();
@@ -227,82 +226,6 @@ public abstract class GameEntity {
public void onRemoved() {}
private int[] parseCountRange(String range) {
var split = range.split(";");
if (split.length == 1)
return new int[] {Integer.parseInt(split[0]), Integer.parseInt(split[0])};
return new int[] {Integer.parseInt(split[0]), Integer.parseInt(split[1])};
}
public boolean dropSubfieldItem(int dropId) {
var drop = GameData.getDropSubfieldMappingMap().get(dropId);
if (drop == null) return false;
var dropTableEntry = GameData.getDropTableExcelConfigDataMap().get(drop.getItemId());
if (dropTableEntry == null) return false;
Int2ObjectMap<Integer> itemsToDrop = new Int2ObjectOpenHashMap<>();
switch (dropTableEntry.getRandomType()) {
case 0: // select one
{
int weightCount = 0;
for (var entry : dropTableEntry.getDropVec()) weightCount += entry.getWeight();
int randomValue = new Random().nextInt(weightCount);
weightCount = 0;
for (var entry : dropTableEntry.getDropVec()) {
if (randomValue >= weightCount && randomValue < (weightCount + entry.getWeight())) {
var countRange = parseCountRange(entry.getCountRange());
itemsToDrop.put(
entry.getItemId(),
Integer.valueOf((new Random().nextBoolean() ? countRange[0] : countRange[1])));
}
}
}
break;
case 1: // Select various
{
for (var entry : dropTableEntry.getDropVec()) {
if (entry.getWeight() < new Random().nextInt(10000)) {
var countRange = parseCountRange(entry.getCountRange());
itemsToDrop.put(
entry.getItemId(),
Integer.valueOf((new Random().nextBoolean() ? countRange[0] : countRange[1])));
}
}
}
break;
}
for (var entry : itemsToDrop.int2ObjectEntrySet()) {
var item =
new EntityItem(
scene,
null,
GameData.getItemDataMap().get(entry.getIntKey()),
getPosition().nearby2d(1f).addY(0.5f),
entry.getValue(),
true);
scene.addEntity(item);
}
return true;
}
public boolean dropSubfield(String subfieldName) {
var subfieldMapping = GameData.getSubfieldMappingMap().get(getEntityTypeId());
if (subfieldMapping == null || subfieldMapping.getSubfields() == null) return false;
for (var entry : subfieldMapping.getSubfields()) {
if (entry.getSubfieldName().compareTo(subfieldName) == 0) {
return dropSubfieldItem(entry.getDrop_id());
}
}
return false;
}
public void onTick(int sceneTime) {
if (entityController != null) {
entityController.onTimer(this, sceneTime);
@@ -75,7 +75,6 @@ public class GadgetChest extends GadgetContent {
} else if (chest.chest_drop_id != 0) {
status = dropSystem.handleChestDrop(chest.chest_drop_id, chest.drop_count, getGadget());
}
if (status) {
getGadget().updateState(ScriptGadgetState.ChestOpened);
player.sendPacket(
@@ -14,8 +14,6 @@ import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
import emu.grasscutter.net.proto.GatherGadgetInfoOuterClass.GatherGadgetInfo;
import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType;
import emu.grasscutter.net.proto.SceneGadgetInfoOuterClass.SceneGadgetInfo;
import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.data.ScriptArgs;
import emu.grasscutter.server.packet.send.PacketGadgetInteractRsp;
import emu.grasscutter.utils.Utils;
@@ -59,13 +57,6 @@ public final class GadgetGatherObject extends GadgetContent {
GameItem item = new GameItem(itemData, 1);
player.getInventory().addItem(item, ActionReason.Gather);
getGadget()
.getScene()
.getScriptManager()
.callEvent(
new ScriptArgs(
getGadget().getGroupId(), EventType.EVENT_GATHER, getGadget().getConfigId()));
getGadget()
.getScene()
.broadcastPacket(
@@ -133,9 +133,13 @@ public class Inventory extends BasePlayerManager implements Iterable<GameItem> {
for (var item : items) {
if (item.getItemId() == 0) continue;
GameItem result = null;
result = putItem(item);
try {
// putItem might throw exception
// ignore that exception and continue
result = putItem(item);
} catch (Exception e) {
e.printStackTrace();
}
if (result != null) {
this.triggerAddItemEvents(result);
changedItems.add(result);
@@ -151,33 +155,22 @@ public class Inventory extends BasePlayerManager implements Iterable<GameItem> {
}
private void triggerAddItemEvents(GameItem result) {
try {
getPlayer()
.getBattlePassManager()
.triggerMission(
WatcherTriggerType.TRIGGER_OBTAIN_MATERIAL_NUM,
result.getItemId(),
result.getCount());
getPlayer()
.getQuestManager()
.queueEvent(
QuestContent.QUEST_CONTENT_OBTAIN_ITEM, result.getItemId(), result.getCount());
} catch (Exception e) {
Grasscutter.getLogger().debug("triggerAddItemEvents failed", e);
}
getPlayer()
.getBattlePassManager()
.triggerMission(
WatcherTriggerType.TRIGGER_OBTAIN_MATERIAL_NUM, result.getItemId(), result.getCount());
getPlayer()
.getQuestManager()
.queueEvent(QuestContent.QUEST_CONTENT_OBTAIN_ITEM, result.getItemId(), result.getCount());
}
private void triggerRemItemEvents(GameItem item, int removeCount) {
try {
getPlayer()
.getBattlePassManager()
.triggerMission(WatcherTriggerType.TRIGGER_COST_MATERIAL, item.getItemId(), removeCount);
getPlayer()
.getQuestManager()
.queueEvent(QuestContent.QUEST_CONTENT_ITEM_LESS_THAN, item.getItemId(), item.getCount());
} catch (Exception e) {
Grasscutter.getLogger().debug("triggerRemItemEvents failed", e);
}
getPlayer()
.getBattlePassManager()
.triggerMission(WatcherTriggerType.TRIGGER_COST_MATERIAL, item.getItemId(), removeCount);
getPlayer()
.getQuestManager()
.queueEvent(QuestContent.QUEST_CONTENT_ITEM_LESS_THAN, item.getItemId(), item.getCount());
}
public void addItemParams(Collection<ItemParam> items) {
@@ -200,11 +193,8 @@ public class Inventory extends BasePlayerManager implements Iterable<GameItem> {
// Dont add items that dont have a valid item definition.
var data = item.getItemData();
if (data == null) return null;
try {
this.player.getProgressManager().addItemObtainedHistory(item.getItemId(), item.getCount());
} catch (Exception e) {
Grasscutter.getLogger().debug("addItemObtainedHistory failed", e);
}
this.player.getProgressManager().addItemObtainedHistory(item.getItemId(), item.getCount());
if (data.isUseOnGain()) {
var params = new UseItemParams(this.player, data.getUseTarget());
@@ -317,9 +317,7 @@ public class StaminaManager extends BasePlayerManager {
entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP));
entity.getWorld().broadcastPacket(new PacketLifeStateChangeNotify(0, entity, LifeState.LIFE_DEAD));
player.getScene().removeEntity(entity);
if (entity instanceof EntityAvatar avatar)
avatar.onDeath(dieType, 0);
((EntityAvatar) entity).onDeath(dieType, 0);
}
public void startSustainedStaminaHandler() {
@@ -345,11 +345,16 @@ public class Player implements PlayerHook, FieldFetch {
this.playerGameTime = gameTime;
// If the player is the host of the world, update the game time as well.
var world = this.getWorld();
if (world != null && world.getHost() == this) {
world.changeTime(gameTime);
if (this.getWorld().getHost() == this) {
this.getWorld().changeTime(gameTime);
}
// Trigger the script event for game time update.
var questManager = this.getQuestManager();
questManager.queueEvent(QuestCond.QUEST_COND_IS_DAYTIME);
questManager.queueEvent(QuestCond.QUEST_COND_TIME_VAR_GT_EQ);
questManager.queueEvent(QuestCond.QUEST_COND_TIME_VAR_PASS_DAY);
this.save();
}
@@ -702,16 +707,14 @@ public class Player implements PlayerHook, FieldFetch {
}
public void onEnterRegion(SceneRegion region) {
var enterRegionName = "ENTER_REGION_" + region.config_id;
this.getQuestManager().forEachActiveQuest(quest -> {
if (quest.getTriggerData() != null &&
quest.getTriggers().containsKey(enterRegionName) &&
region.getGroupId() == quest.getTriggerData().get(enterRegionName).getGroupId()) {
quest.getTriggers().containsKey("ENTER_REGION_"+ region.config_id)) {
// If trigger hasn't been fired yet
if (!Boolean.TRUE.equals(quest.getTriggers().put(enterRegionName, true))) {
if (!Boolean.TRUE.equals(quest.getTriggers().put("ENTER_REGION_" + region.config_id, true))) {
this.getSession().send(new PacketServerCondMeetQuestListUpdateNotify());
this.getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_TRIGGER_FIRE,
quest.getTriggerData().get(enterRegionName).getId(), 0);
quest.getTriggerData().get("ENTER_REGION_" + region.config_id).getId(), 0);
}
}
});
@@ -719,15 +722,13 @@ public class Player implements PlayerHook, FieldFetch {
}
public void onLeaveRegion(SceneRegion region) {
var leaveRegionName = "LEAVE_REGION_" + region.config_id;
this.getQuestManager().forEachActiveQuest(quest -> {
if (quest.getTriggers().containsKey(leaveRegionName) &&
region.getGroupId() == quest.getTriggerData().get(leaveRegionName).getGroupId()) {
if (quest.getTriggers().containsKey("LEAVE_REGION_" + region.config_id)) {
// If trigger hasn't been fired yet
if (!Boolean.TRUE.equals(quest.getTriggers().put(leaveRegionName, true))) {
if (!Boolean.TRUE.equals(quest.getTriggers().put("LEAVE_REGION_" + region.config_id, true))) {
this.getSession().send(new PacketServerCondMeetQuestListUpdateNotify());
this.getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_TRIGGER_FIRE,
quest.getTriggerData().get(leaveRegionName).getId(), 0);
quest.getTriggerData().get("LEAVE_REGION_" + region.config_id).getId(), 0);
}
}
});
@@ -4,10 +4,10 @@ import dev.morphia.annotations.Entity;
import dev.morphia.annotations.Transient;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.quest.enums.QuestContent;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@@ -29,10 +29,10 @@ public class PlayerProgress {
// keep track of EXEC_ADD_QUEST_PROGRESS count, will be used in CONTENT_ADD_QUEST_PROGRESS
// not sure where to put this, this should be saved to DB but not to individual quest, since
// it will be hard to loop and compare
private Map<String, Integer> questProgressCountMap;
private Map<Integer, Integer> questProgressCountMap;
public PlayerProgress() {
this.questProgressCountMap = new ConcurrentHashMap<>();
this.questProgressCountMap = new Int2IntOpenHashMap();
this.completedDungeons = new IntArrayList();
this.itemHistory = new Int2ObjectOpenHashMap<>();
}
@@ -70,15 +70,15 @@ public class PlayerProgress {
return itemEntry.addToObtainedCount(count);
}
public int getCurrentProgress(String progressId) {
public int getCurrentProgress(int progressId) {
return questProgressCountMap.getOrDefault(progressId, -1);
}
public int addToCurrentProgress(String progressId, int count) {
public int addToCurrentProgress(int progressId, int count) {
return questProgressCountMap.merge(progressId, count, Integer::sum);
}
public int resetCurrentProgress(String progressId) {
public int resetCurrentProgress(int progressId) {
return questProgressCountMap.merge(progressId, 0, Integer::min);
}
@@ -300,7 +300,7 @@ public final class PlayerProgressManager extends BasePlayerDataManager {
/** Quest progress */
public void addQuestProgress(int id, int count) {
var newCount = player.getPlayerProgress().addToCurrentProgress(String.valueOf(id), count);
var newCount = player.getPlayerProgress().addToCurrentProgress(id, count);
player.save();
player
.getQuestManager()
@@ -5,7 +5,8 @@ import static emu.grasscutter.config.Configuration.GAME_OPTIONS;
import dev.morphia.annotations.Entity;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.net.proto.AvatarTeamOuterClass.AvatarTeam;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
@Entity
public final class TeamInfo {
@@ -86,8 +87,6 @@ public final class TeamInfo {
for (int i = 0; i < this.getAvatars().size(); i++) {
Avatar avatar = player.getAvatars().getAvatarById(this.getAvatars().get(i));
if (avatar == null) continue;
avatarTeam.addAvatarGuidList(avatar.getGuid());
}
@@ -1,8 +1,5 @@
package emu.grasscutter.game.props;
import java.util.HashMap;
import java.util.Map;
public enum EntityIdType {
AVATAR(0x01),
MONSTER(0x02),
@@ -15,27 +12,10 @@ public enum EntityIdType {
private final int id;
private static final Map<Integer, EntityType> map = new HashMap<>();
static {
map.put(EntityIdType.AVATAR.getId(), EntityType.Avatar);
map.put(EntityIdType.MONSTER.getId(), EntityType.Monster);
map.put(EntityIdType.NPC.getId(), EntityType.NPC);
map.put(EntityIdType.GADGET.getId(), EntityType.Gadget);
map.put(EntityIdType.REGION.getId(), EntityType.Region);
map.put(EntityIdType.WEAPON.getId(), EntityType.Equip);
map.put(EntityIdType.TEAM.getId(), EntityType.Team);
map.put(EntityIdType.MPLEVEL.getId(), EntityType.MPLevel);
}
EntityIdType(int id) {
this.id = id;
}
public static EntityType toEntityType(int entityId) {
return map.getOrDefault(entityId, EntityType.None);
}
public int getId() {
return id;
}
@@ -75,7 +75,6 @@ public enum EntityType implements IntValueEnum {
Screen(64),
EchoShell(65),
UIInteractGadget(66),
Region(98),
PlaceHolder(99);
private static final Int2ObjectMap<EntityType> map = new Int2ObjectOpenHashMap<>();
@@ -314,7 +314,7 @@ public class GameMainQuest {
0, new Position(avatarPosPos.get(0), avatarPosPos.get(1), avatarPosPos.get(2))); // position
posAndRot.add(
1, new Position(avatarPosRot.get(0), avatarPosRot.get(1), avatarPosRot.get(2))); // rotation
Grasscutter.getLogger().debug("Successfully loaded rewind data for quest {}.", subId);
Grasscutter.getLogger().info("Succesfully loaded rewind data for subQuest {}", subId);
return true;
}
@@ -51,12 +51,10 @@ public class GameQuest {
this.state = QuestState.QUEST_STATE_UNSTARTED;
this.triggerData = new HashMap<>();
this.triggers = new HashMap<>();
this.finishProgressList = new int[questData.getFinishCond().size()];
this.failProgressList = new int[questData.getFailCond().size()];
this.finishTime = 0;
}
public void start() {
this.clearProgress(false);
this.acceptTime = Utils.getCurrentSeconds();
this.startTime = this.acceptTime;
this.startGameDay = getOwner().getWorld().getTotalGameTimeDays();
@@ -144,7 +142,7 @@ public class GameQuest {
}
public void setFinishProgress(int index, int value) {
this.finishProgressList[index] = value;
finishProgressList[index] = value;
}
public void setFailProgress(int index, int value) {
@@ -155,30 +153,17 @@ public class GameQuest {
// TODO improve
var oldState = state;
if (questData.getFinishCond() != null && questData.getFinishCond().size() != 0) {
for (var condition : questData.getFinishCond()) {
if (condition.getType() == QuestContent.QUEST_CONTENT_LUA_NOTIFY) {
this.getOwner().getPlayerProgress().resetCurrentProgress(condition.getParamStr());
}
}
this.finishProgressList = new int[questData.getFinishCond().size()];
}
if (questData.getFailCond() != null && questData.getFailCond().size() != 0) {
for (var condition : questData.getFailCond()) {
if (condition.getType() == QuestContent.QUEST_CONTENT_LUA_NOTIFY) {
this.getOwner().getPlayerProgress().resetCurrentProgress(condition.getParamStr());
}
}
this.failProgressList = new int[questData.getFailCond().size()];
}
this.getOwner().getPlayerProgress().resetCurrentProgress(String.valueOf(this.subQuestId));
setState(QuestState.QUEST_STATE_UNSTARTED);
finishTime = 0;
acceptTime = 0;
startTime = 0;
this.getOwner().getPlayerProgress().resetCurrentProgress(this.subQuestId);
if (oldState == QuestState.QUEST_STATE_UNSTARTED) {
return false;
}
@@ -111,9 +111,7 @@ public class QuestManager extends BasePlayerManager {
30700, // Quest which is responsible for unlocking Crash Course.
30800, // Quest which is responsible for unlocking Sparks Amongst the Pages.
47001, 47002, 47003, 47004,
2010103, 2010144 // Prologue Act 2: Chasing Shadows
47001, 47002, 47003, 47004
));
}
}
@@ -14,8 +14,7 @@ public class ContentAddQuestProgress extends BaseContent {
public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
val progressId = condition.getParam()[0];
val currentCount =
quest.getOwner().getPlayerProgress().getCurrentProgress(String.valueOf(progressId));
val currentCount = quest.getOwner().getPlayerProgress().getCurrentProgress(progressId);
// if the condition count is 0 I think it is safe to assume that the
// condition count from EXEC only needs to be 1
@@ -3,7 +3,8 @@ package emu.grasscutter.game.quest.content;
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_COMPLETE_TALK;
import emu.grasscutter.data.excels.quest.QuestData;
import emu.grasscutter.game.quest.*;
import emu.grasscutter.game.quest.GameQuest;
import emu.grasscutter.game.quest.QuestValueContent;
import lombok.val;
@QuestValueContent(QUEST_CONTENT_COMPLETE_TALK)
@@ -2,16 +2,20 @@ package emu.grasscutter.game.quest.content;
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_FINISH_PLOT;
import emu.grasscutter.data.binout.MainQuestData;
import emu.grasscutter.data.excels.quest.QuestData;
import emu.grasscutter.game.quest.*;
import emu.grasscutter.game.quest.GameQuest;
import emu.grasscutter.game.quest.QuestValueContent;
@QuestValueContent(QUEST_CONTENT_FINISH_PLOT)
public class ContentFinishPlot extends BaseContent {
@Override
public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
var talkData = quest.getMainQuest().getTalks().get(params[0]);
var subQuest = quest.getMainQuest().getChildQuestById(params[0]);
MainQuestData.TalkData talkData =
quest.getMainQuest().getTalks().get(Integer.valueOf(params[0]));
GameQuest subQuest = quest.getMainQuest().getChildQuestById(params[0]);
return (talkData != null && subQuest != null || condition.getParamStr().equals(paramStr))
&& condition.getParam()[0] == params[0];
}
@@ -12,8 +12,6 @@ public class ContentLuaNotify extends BaseContent {
@Override
public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
return condition.getParamStr().equals(paramStr)
&& condition.getCount()
<= quest.getOwner().getPlayerProgress().getCurrentProgress(paramStr);
return condition.getParamStr().equals(paramStr);
}
}
@@ -3,16 +3,22 @@ package emu.grasscutter.game.quest.content;
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_NOT_FINISH_PLOT;
import emu.grasscutter.data.excels.quest.QuestData;
import emu.grasscutter.game.quest.*;
import emu.grasscutter.game.quest.GameQuest;
import emu.grasscutter.game.quest.QuestValueContent;
import lombok.val;
@QuestValueContent(QUEST_CONTENT_NOT_FINISH_PLOT)
public class ContentNotFinishPlot extends BaseContent {
@Override
public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
var talkData = quest.getMainQuest().getTalks().get(params[0]);
var subQuest = quest.getMainQuest().getChildQuestById(params[0]);
return (talkData == null && subQuest != null || condition.getParamStr().equals(paramStr))
&& condition.getParam()[0] == params[0];
val talkId = condition.getParam()[0];
val checkMainQuest = quest.getOwner().getQuestManager().getMainQuestByTalkId(talkId);
if (checkMainQuest == null) {
return true;
}
val talkData = checkMainQuest.getTalks().get(talkId);
return talkData == null;
}
}
@@ -1,5 +1,6 @@
package emu.grasscutter.game.quest.exec;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.excels.quest.QuestData;
import emu.grasscutter.game.quest.GameQuest;
import emu.grasscutter.game.quest.QuestValueExec;
@@ -26,16 +27,33 @@ public class ExecNotifyGroupLua extends QuestExecHandler {
}
scene.runWhenFinished(
() -> {
val groupInstance = scriptManager.getGroupInstanceById(groupId);
if (groupInstance != null) {
// workaround to make sure the triggers are still there todo find better way of trigger
// handling
scriptManager.refreshGroup(groupInstance);
Grasscutter.getLogger()
.trace(
"group: {} \ncondition: {} \nparamStr {}",
groupInstance.getLuaGroup(),
condition,
paramStr);
} else {
Grasscutter.getLogger()
.debug(
"notify, no group instance for:\n group: {} \ncondition: {} \nparamStr {}",
groupId,
condition,
paramStr);
}
val eventType =
quest.getState() == QuestState.QUEST_STATE_FINISHED
? EventType.EVENT_QUEST_FINISH
: EventType.EVENT_QUEST_START;
scriptManager.callEvent(
new ScriptArgs(
groupId,
eventType,
quest.getSubQuestId(),
quest.getState() == QuestState.QUEST_STATE_FINISHED ? 1 : 0)
new ScriptArgs(groupId, eventType, quest.getSubQuestId())
.setEventSource(quest.getSubQuestId()));
});
@@ -25,7 +25,6 @@ public class ExecRefreshGroupSuite extends QuestExecHandler {
if (!scriptManager.refreshGroupSuite(groupId, suiteId, quest)) {
result = false;
}
scriptManager.getGroupById(groupId).dontUnload = true;
}
return result;
@@ -1,11 +1,13 @@
package emu.grasscutter.game.talk;
import static emu.grasscutter.game.quest.enums.QuestCond.QUEST_COND_COMPLETE_TALK;
import static emu.grasscutter.game.quest.enums.QuestContent.*;
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_COMPLETE_ANY_TALK;
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_COMPLETE_TALK;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.binout.MainQuestData.TalkData;
import emu.grasscutter.game.player.*;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import lombok.NonNull;
public final class TalkManager extends BasePlayerManager {
@@ -20,31 +22,30 @@ public final class TalkManager extends BasePlayerManager {
* @param npcEntityId The entity ID of the NPC being talked to.
*/
public void triggerTalkAction(int talkId, int npcEntityId) {
var player = this.getPlayer();
var talkData = GameData.getTalkConfigDataMap().get(talkId);
if (talkData != null) {
// Check if the NPC id is valid.
var entity = player.getScene().getEntityById(npcEntityId);
if (entity != null) {
// The config ID of the entity is the NPC's ID.
if (!talkData.getNpcId().contains(entity.getConfigId())) return;
}
if (talkData == null) return;
// Execute the talk action on associated handlers.
talkData
.getFinishExec()
.forEach(e -> player.getServer().getTalkSystem().triggerExec(player, talkData, e));
// Save the talk value to the quest's data.
this.saveTalkToQuest(talkId, talkData.getQuestId());
var player = this.getPlayer();
// Check if the NPC id is valid.
var entity = player.getScene().getEntityById(npcEntityId);
if (entity != null) {
// The config ID of the entity is the NPC's ID.
if (!talkData.getNpcId().contains(entity.getConfigId())) return;
}
// Execute the talk action on associated handlers.
talkData
.getFinishExec()
.forEach(e -> player.getServer().getTalkSystem().triggerExec(player, talkData, e));
// Invoke the talking events for quests.
var questManager = player.getQuestManager();
questManager.queueEvent(QUEST_CONTENT_COMPLETE_ANY_TALK, talkId);
questManager.queueEvent(QUEST_CONTENT_COMPLETE_TALK, talkId);
questManager.queueEvent(QUEST_COND_COMPLETE_TALK, talkId);
// Save the talk value to the quest's data.
this.saveTalkToQuest(talkId, talkData.getQuestId());
}
public void saveTalkToQuest(int talkId, int mainQuestId) {
@@ -1,43 +1,54 @@
package emu.grasscutter.game.world;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.*;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.GameDepot;
import emu.grasscutter.data.binout.SceneNpcBornEntry;
import emu.grasscutter.data.binout.routes.Route;
import emu.grasscutter.data.excels.*;
import emu.grasscutter.data.excels.ItemData;
import emu.grasscutter.data.excels.SceneData;
import emu.grasscutter.data.excels.codex.CodexAnimalData;
import emu.grasscutter.data.excels.monster.MonsterData;
import emu.grasscutter.data.excels.world.WorldLevelData;
import emu.grasscutter.data.server.Grid;
import emu.grasscutter.game.avatar.Avatar;
import emu.grasscutter.game.dungeons.*;
import emu.grasscutter.game.dungeons.DungeonManager;
import emu.grasscutter.game.dungeons.DungeonSettleListener;
import emu.grasscutter.game.dungeons.challenge.WorldChallenge;
import emu.grasscutter.game.dungeons.enums.DungeonPassConditionType;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.entity.gadget.GadgetWorktop;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.managers.blossom.BlossomManager;
import emu.grasscutter.game.player.*;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.player.TeamInfo;
import emu.grasscutter.game.props.*;
import emu.grasscutter.game.quest.QuestGroupSuite;
import emu.grasscutter.game.world.data.TeleportProperties;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.proto.*;
import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult;
import emu.grasscutter.net.proto.EnterTypeOuterClass;
import emu.grasscutter.net.proto.SelectWorktopOptionReqOuterClass;
import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType;
import emu.grasscutter.scripts.*;
import emu.grasscutter.scripts.SceneIndexManager;
import emu.grasscutter.scripts.SceneScriptManager;
import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.data.*;
import emu.grasscutter.scripts.data.SceneBlock;
import emu.grasscutter.scripts.data.SceneGroup;
import emu.grasscutter.scripts.data.ScriptArgs;
import emu.grasscutter.server.event.entity.EntityCreationEvent;
import emu.grasscutter.server.event.player.PlayerTeleportEvent;
import emu.grasscutter.server.packet.send.*;
import emu.grasscutter.utils.objects.KahnsSort;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import lombok.*;
import lombok.Getter;
import lombok.Setter;
import lombok.val;
public final class Scene {
@Getter private final World world;
@@ -540,22 +551,19 @@ public final class Scene {
}
var sceneTime = getSceneTimeSeconds();
var entities = Map.copyOf(this.getEntities());
entities.forEach(
(eid, e) -> {
if (!e.isAlive()) {
this.getEntities().remove(eid);
} else e.onTick(sceneTime);
});
getEntities().forEach((eid, e) -> e.onTick(sceneTime));
blossomManager.onTick();
this.checkNpcGroup();
checkNpcGroup();
this.finishLoading();
this.checkPlayerRespawn();
if (this.tickCount++ % 10 == 0) this.broadcastPacket(new PacketSceneTimeNotify(this));
if (this.getPlayerCount() <= 0 && !this.dontDestroyWhenEmpty) {
this.getScriptManager().onDestroy();
this.getWorld().deregisterScene(this);
}
}
/** Validates a player's current position. Teleports the player if the player is out of bounds. */
@@ -692,6 +700,18 @@ public final class Scene {
npcBornEntries.addAll(loadNpcForPlayer(player));
}
// clear the unreachable group for client
var toUnload =
this.npcBornEntrySet.stream()
.filter(i -> !npcBornEntries.contains(i))
.map(SceneNpcBornEntry::getGroupId)
.toList();
if (toUnload.size() > 0) {
broadcastPacket(new PacketGroupUnloadNotify(toUnload));
Grasscutter.getLogger().trace("Unload NPC Group {}", toUnload);
}
// exchange the new npcBornEntry Set
this.npcBornEntrySet = npcBornEntries;
}
@@ -838,7 +858,7 @@ public final class Scene {
.collect(Collectors.toSet());
for (var group : this.loadedGroups) {
if (!visible.contains(group.id) && !group.dynamic_load && !group.dontUnload)
if (!visible.contains(group.id) && !group.dynamic_load)
unloadGroup(scriptManager.getBlocks().get(group.block_id), group.id);
}
@@ -1144,27 +1164,14 @@ public final class Scene {
pos.toDoubleArray(),
Grasscutter.getConfig().server.game.loadEntitiesForPlayerRange);
var sceneNpcBornCanidates =
var sceneNpcBornEntries =
npcList.stream().filter(i -> !this.npcBornEntrySet.contains(i)).toList();
List<SceneNpcBornEntry> sceneNpcBornEntries = new ArrayList<>();
sceneNpcBornCanidates.forEach(
i -> {
var groupInstance = scriptManager.getGroupInstanceById(i.getGroupId());
if (groupInstance == null) return;
if (i.getSuiteIdList() != null
&& !i.getSuiteIdList().contains(groupInstance.getActiveSuiteId())) return;
sceneNpcBornEntries.add(i);
});
if (sceneNpcBornEntries.size() > 0) {
this.broadcastPacket(new PacketGroupSuiteNotify(sceneNpcBornEntries));
Grasscutter.getLogger().trace("Loaded Npc Group Suite {}", sceneNpcBornEntries);
}
return npcList.stream()
.filter(i -> this.npcBornEntrySet.contains(i) || sceneNpcBornEntries.contains(i))
.toList();
return npcList;
}
public void loadGroupForQuest(List<QuestGroupSuite> sceneGroupSuite) {
@@ -4,14 +4,17 @@ import static emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportTy
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.dungeon.DungeonData;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.entity.EntityTeam;
import emu.grasscutter.game.entity.EntityWorld;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.player.Player.SceneLoadState;
import emu.grasscutter.game.props.*;
import emu.grasscutter.game.props.EnterReason;
import emu.grasscutter.game.props.EntityIdType;
import emu.grasscutter.game.props.PlayerProperty;
import emu.grasscutter.game.props.SceneType;
import emu.grasscutter.game.quest.enums.QuestContent;
import emu.grasscutter.game.world.data.TeleportProperties;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.proto.ChatInfoOuterClass.ChatInfo.*;
import emu.grasscutter.net.proto.EnterTypeOuterClass.EnterType;
import emu.grasscutter.scripts.data.SceneConfig;
import emu.grasscutter.server.event.player.PlayerTeleportEvent;
@@ -19,9 +22,15 @@ import emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportType;
import emu.grasscutter.server.game.GameServer;
import emu.grasscutter.server.packet.send.*;
import emu.grasscutter.utils.ConversionUtils;
import it.unimi.dsi.fastutil.ints.*;
import java.util.*;
import lombok.*;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import lombok.Getter;
import lombok.val;
import org.jetbrains.annotations.NotNull;
public class World implements Iterable<Player> {
@@ -35,8 +44,7 @@ public class World implements Iterable<Player> {
private int nextPeerId = 0;
private int worldLevel;
@Getter private boolean isMultiplayer = false;
@Getter private boolean timeLocked;
@Getter private boolean isMultiplayer, timeLocked = false;
private long lastUpdateTime;
@Getter private int tickCount = 0;
@@ -57,7 +65,6 @@ public class World implements Iterable<Player> {
this.entity = new EntityWorld(this);
this.worldLevel = player.getWorldLevel();
this.isMultiplayer = isMultiplayer;
this.timeLocked = player.getProperty(PlayerProperty.PROP_IS_GAME_TIME_LOCKED) != 0;
this.lastUpdateTime = System.currentTimeMillis();
this.currentWorldTime = host.getPlayerGameTime();
@@ -157,16 +164,6 @@ public class World implements Iterable<Player> {
player.getTeamManager().getCurrentSinglePlayerTeamInfo(),
player.getTeamManager().getMaxTeamSize());
player.getTeamManager().setCurrentCharacterIndex(0);
if (player != this.getHost()) {
this.broadcastPacket(
new PacketPlayerChatNotify(
player,
0,
SystemHint.newBuilder()
.setType(SystemHintType.SYSTEM_HINT_TYPE_CHAT_ENTER_WORLD.getNumber())
.build()));
}
}
// Add to scene
@@ -220,14 +217,6 @@ public class World implements Iterable<Player> {
victim.getSceneId(),
victim.getPosition()));
}
} else {
this.broadcastPacket(
new PacketPlayerChatNotify(
player,
0,
SystemHint.newBuilder()
.setType(SystemHintType.SYSTEM_HINT_TYPE_CHAT_LEAVE_WORLD.getNumber())
.build()));
}
}
@@ -437,11 +426,7 @@ public class World implements Iterable<Player> {
// Check if there are players in this world.
if (this.getPlayerCount() == 0) return true;
// Tick all associated scenes.
this.getScenes()
.forEach(
(k, scene) -> {
if (scene.getPlayerCount() > 0) scene.onTick();
});
this.getScenes().forEach((k, scene) -> scene.onTick());
// sync time every 10 seconds
if (this.tickCount % 10 == 0) {
@@ -527,6 +512,10 @@ public class World implements Iterable<Player> {
*/
public void changeTime(long gameTime) {
this.currentWorldTime = gameTime;
// Trigger script events.
this.players.forEach(
player -> player.getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_GAME_TIME_TICK));
}
/**
@@ -81,7 +81,7 @@ public final class PluginManager {
if (pluginConfig.api == null) {
Grasscutter.getLogger()
.warn(translate("plugin.invalid_api.not_present", plugin.getName()));
continue;
return;
} else if (pluginConfig.api != API_VERSION) {
Grasscutter.getLogger()
.warn(
@@ -90,13 +90,13 @@ public final class PluginManager {
plugin.getName(),
pluginConfig.api,
API_VERSION));
continue;
return;
}
// Check if the plugin config is valid.
if (!pluginConfig.validate()) {
Grasscutter.getLogger().warn(translate("plugin.invalid_config", plugin.getName()));
continue;
return;
}
// Create a JAR file instance from the plugin's URL.
@@ -216,14 +216,9 @@ public final class PluginManager {
Grasscutter.getLogger().info(translate("plugin.enabling_plugin", name));
try {
plugin.onEnable();
return;
} catch (NoSuchMethodError ignored) {
Grasscutter.getLogger().error(translate("plugin.invalid_api.outdated", name));
} catch (Throwable exception) {
Grasscutter.getLogger().error(translate("plugin.enabling_failed", name), exception);
}
this.disablePlugin(plugin);
});
}
@@ -266,15 +266,15 @@ public class SceneScriptManager {
suiteId,
groupId,
getScene().getId());
if (targetGroupInstance == null) return false;
} else {
Grasscutter.getLogger().debug("Refreshing group {} suite {}", groupId, suiteId);
suiteId =
refreshGroup(
targetGroupInstance,
suiteId,
false); // If suiteId is zero, the value of suiteId changes
scene.broadcastPacket(new PacketGroupSuiteNotify(groupId, suiteId));
}
Grasscutter.getLogger().debug("Refreshing group {} suite {}", groupId, suiteId);
suiteId =
refreshGroup(
targetGroupInstance,
suiteId,
false); // If suiteId is zero, the value of suiteId changes
scene.broadcastPacket(new PacketGroupSuiteNotify(groupId, suiteId));
return true;
}
@@ -629,7 +629,7 @@ public class SceneScriptManager {
getScene().getEntities().values().stream()
.filter(
e ->
e.getEntityType() == EntityType.Avatar
e.getEntityType() == EntityType.Avatar.getValue()
&& region.getMetaRegion().contains(e.getPosition()))
.toList();
entities.forEach(region::addEntity);
@@ -644,7 +644,6 @@ public class SceneScriptManager {
.trace("Call EVENT_ENTER_REGION_{}", region.getMetaRegion().config_id);
this.callEvent(
new ScriptArgs(region.getGroupId(), EventType.EVENT_ENTER_REGION, region.getConfigId())
.setEventSource(EntityType.Avatar.getValue())
.setSourceEntityId(region.getId())
.setTargetEntityId(targetId));
@@ -661,7 +660,6 @@ public class SceneScriptManager {
if (region.entityHasLeft()) {
this.callEvent(
new ScriptArgs(region.getGroupId(), EventType.EVENT_LEAVE_REGION, region.getConfigId())
.setEventSource(EntityType.Avatar.getValue())
.setSourceEntityId(region.getId())
.setTargetEntityId(region.getFirstEntityId()));
@@ -683,8 +681,8 @@ public class SceneScriptManager {
|| !groupInstance.getDeadEntities().contains(m.config_id));
})
.map(g -> createGadget(group.id, group.block_id, g, groupInstance.getCachedGadgetState(g)))
.filter(Objects::nonNull)
.peek(g -> groupInstance.cacheGadgetState(g.getMetaGadget(), g.getState()))
.filter(Objects::nonNull)
.toList();
}
@@ -803,27 +801,26 @@ public class SceneScriptManager {
private void realCallEvent(@Nonnull ScriptArgs params) {
try {
ScriptLoader.getScriptLib().setSceneScriptManager(this);
var eventType = params.type;
var relevantTriggers =
switch (eventType) {
case EventType.EVENT_ENTER_REGION, EventType.EVENT_LEAVE_REGION -> this
.getTriggersByEvent(eventType)
.stream()
int eventType = params.type;
Set<SceneTrigger> relevantTriggers = new HashSet<>();
if (eventType == EventType.EVENT_ENTER_REGION || eventType == EventType.EVENT_LEAVE_REGION) {
relevantTriggers =
this.getTriggersByEvent(eventType).stream()
.filter(
t ->
t.getName().substring(13).equals(String.valueOf(params.param1))
t.getCondition().contains(String.valueOf(params.param1))
&& (t.getSource().isEmpty()
|| t.getSource().equals(params.getEventSource())))
.collect(Collectors.toSet());
default -> this.getTriggersByEvent(eventType).stream()
} else {
relevantTriggers =
this.getTriggersByEvent(eventType).stream()
.filter(
t -> params.getGroupId() == 0 || t.getCurrentGroup().id == params.getGroupId())
.filter(
t -> (t.getSource().isEmpty() || t.getSource().equals(params.getEventSource())))
.collect(Collectors.toSet());
};
}
for (SceneTrigger trigger : relevantTriggers) {
handleEventForTrigger(params, trigger);
}
@@ -18,7 +18,6 @@ import emu.grasscutter.game.quest.enums.QuestContent;
import emu.grasscutter.game.quest.enums.QuestState;
import emu.grasscutter.game.world.SceneGroupInstance;
import emu.grasscutter.net.proto.EnterTypeOuterClass;
import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType;
import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.constants.GroupKillPolicy;
import emu.grasscutter.scripts.data.SceneGroup;
@@ -130,7 +129,7 @@ public class ScriptLib {
public int SetWorktopOptionsByGroupId(int groupId, int configId, int[] options) {
logger.debug("[LUA] Call SetWorktopOptionsByGroupId with {},{},{}",
groupId, configId, options);
groupId,configId,options);
val entity = getSceneScriptManager().getScene().getEntityByConfigId(configId, groupId);
@@ -153,17 +152,18 @@ public class ScriptLib {
logger.debug("[LUA] Call SetWorktopOptions with {}", printTable(table));
var callParams = this.callParams.getIfExists();
var group = this.currentGroup.getIfExists();
if (callParams == null || group == null) {
if(callParams == null || group == null){
return 1;
}
var configId = callParams.param1;
var entity = getSceneScriptManager().getScene().getEntityByConfigId(configId);
var worktopOptions = new int[table.length()];
for (int i = 1; i<=table.length(); i++) {
int[] worktopOptions = new int[table.length()];
for(int i = 1 ;i<=table.length() ;i++){
worktopOptions[i-1] = table.get(i).optint(-1);
}
if (!(entity instanceof EntityGadget gadget) || worktopOptions.length == 0) {
if(!(entity instanceof EntityGadget gadget)|| worktopOptions.length == 0){
return 2;
}
@@ -172,11 +172,9 @@ public class ScriptLib {
}
worktop.addWorktopOptions(worktopOptions);
var scene = this.getSceneScriptManager().getScene();
// Done in order to synchronize with addEntities in Scene.class.
synchronized (this.getSceneScriptManager().getScene()) {
scene.broadcastPacket(new PacketWorktopOptionNotify(gadget));
}
var scene = getSceneScriptManager().getScene();
scene.broadcastPacket(new PacketWorktopOptionNotify(gadget));
return 0;
}
@@ -403,7 +401,7 @@ public class ScriptLib {
val old = variables.getOrDefault(var, value);
variables.put(var, value);
getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, value, old).setEventSource(var));
getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, value, old));
return 0;
}
@@ -418,7 +416,7 @@ public class ScriptLib {
variables.put(var, old + value);
logger.debug("[LUA] Call ChangeGroupVariableValue with {},{}",
old, old+value);
getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, old+value, old).setEventSource(var));
getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, old+value, old));
return LuaValue.ZERO;
}
@@ -611,11 +609,6 @@ public class ScriptLib {
logger.debug("[LUA] Call CreateGadget with {}",
printTable(table));
var configId = table.get("config_id").toint();
//TODO: figure out what creating gadget configId 0 does
if (configId == 0){
Grasscutter.getLogger().warn("Tried to CreateGadget with config_id 0: {}", printTable(table));
return 0;
}
var group = getCurrentGroup();
@@ -674,7 +667,6 @@ public class ScriptLib {
var1);
for(var player : getSceneScriptManager().getScene().getPlayers()){
player.getPlayerProgress().addToCurrentProgress(var1, 1);
player.getQuestManager().queueEvent(QuestCond.QUEST_COND_LUA_NOTIFY, var1);
player.getQuestManager().queueEvent(QuestContent.QUEST_CONTENT_LUA_NOTIFY, var1);
}
@@ -710,7 +702,7 @@ public class ScriptLib {
return EntityType.None.getValue();
}
return entity.getEntityType().getValue();
return entity.getEntityType();
}
public int GetQuestState(int entityId, int questId){
@@ -745,11 +737,11 @@ public class ScriptLib {
val entity = getSceneScriptManager().getScene().getEntityByConfigId(configId, groupId);
if(entity == null || entity.getEntityType().getValue() != entityType){
if(entity == null || entity.getEntityType() != entityType){
return 1;
}
getSceneScriptManager().getScene().removeEntity(entity, VisionType.VISION_TYPE_REMOVE);
getSceneScriptManager().getScene().removeEntity(entity);
return 0;
}
@@ -823,17 +815,17 @@ public class ScriptLib {
//TODO implement
return 0;
}
public boolean IsPlayerAllAvatarDie(int sceneUid){
public int IsPlayerAllAvatarDie(int sceneUid){
logger.warn("[LUA] Call unimplemented IsPlayerAllAvatarDie {}", sceneUid);
var playerEntities = getSceneScriptManager().getScene().getEntities().values().stream().filter(e -> e.getEntityType() == EntityType.Avatar).toList();
var playerEntities = getSceneScriptManager().getScene().getEntities().values().stream().filter(e -> e.getEntityType() == EntityIdType.AVATAR.getId()).toList();
for (GameEntity p : playerEntities){
var player = (EntityAvatar)p;
if(player.isAlive()){
return false;
return 0;
}
}
//TODO check
return true;
return 1;
}
public int sendShowCommonTipsToClient(String title, String content, int closeTime) {
@@ -869,11 +861,6 @@ public class ScriptLib {
//TODO implement var6 object has int success, int fail, bool fail_on_wipe
return 0;
}
public int StopChallenge(int var1, int var2){
logger.warn("[LUA] Call unimplemented StopChallenge with {} {}", var1, var2);
//TODO implement
return 0;
}
public int CreateEffigyChallengeMonster(int var1, int[] var2){
logger.warn("[LUA] Call unimplemented CreateEffigyChallengeMonster with {} {}", var1, var2);
//TODO implement
@@ -1611,16 +1598,6 @@ public class ScriptLib {
return 0;
}
public int DropSubfield(LuaTable table) {
String subfield_name = table.get("subfield_name").toString();
var entity = getCurrentEntity();
if(!entity.isPresent()) return -1;
entity.get().dropSubfield(subfield_name);
return -1;
}
public int[] GetGatherConfigIdList() {
EntityGadget gadget = getCurrentEntityGadget();
@@ -3,8 +3,5 @@ package emu.grasscutter.scripts.constants;
public enum VisionLevelType {
VISION_LEVEL_NORMAL,
VISION_LEVEL_LITTLE_REMOTE,
VISION_LEVEL_REMOTE,
VISION_LEVEL_SUPER,
VISION_LEVEL_NEARBY,
VISION_LEVEL_SUPER_NEARBY
VISION_LEVEL_REMOTE
}
@@ -40,7 +40,6 @@ public final class SceneGroup {
public SceneGarbage garbages;
public SceneInitConfig init_config;
@Getter public boolean dynamic_load = false;
public boolean dontUnload = false;
public SceneReplaceable is_replaceable;
@@ -32,9 +32,9 @@ public class SceneRegion {
public boolean contains(Position position) {
switch (shape) {
case ScriptRegionShape.CUBIC:
return (Math.abs(pos.getX() - position.getX()) <= size.getX() / 2f)
&& (Math.abs(pos.getY() - position.getY()) <= size.getY() / 2f)
&& (Math.abs(pos.getZ() - position.getZ()) <= size.getZ() / 2f);
return (Math.abs(pos.getX() - position.getX()) <= size.getX())
&& (Math.abs(pos.getY() - position.getY()) <= size.getY())
&& (Math.abs(pos.getZ() - position.getZ()) <= size.getZ());
case ScriptRegionShape.SPHERE:
var x = Math.pow(pos.getX() - position.getX(), 2);
var y = Math.pow(pos.getY() - position.getY(), 2);
@@ -27,7 +27,7 @@ public final class SceneTrigger {
@Override
public int hashCode() {
return (currentGroup.id + name).hashCode();
return name.hashCode();
}
@Override
@@ -32,11 +32,10 @@ import emu.grasscutter.server.event.internal.*;
import emu.grasscutter.server.event.types.ServerEvent;
import emu.grasscutter.server.scheduler.ServerTaskScheduler;
import emu.grasscutter.task.TaskMap;
import emu.grasscutter.utils.Utils;
import java.net.*;
import java.time.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.ConcurrentHashMap;
import kcp.highway.*;
import lombok.*;
import org.jetbrains.annotations.NotNull;
@@ -164,6 +163,9 @@ public final class GameServer extends KcpServer implements Iterable<Player> {
// Chata manager
this.chatManager = new ChatSystem(this);
// Hook into shutdown event.
Runtime.getRuntime().addShutdownHook(new Thread(this::onServerShutdown));
}
private static InetSocketAddress getAdapterInetSocketAddress() {
@@ -324,27 +326,16 @@ public final class GameServer extends KcpServer implements Iterable<Player> {
}
public void onServerShutdown() {
var event = new ServerStopEvent(ServerEvent.Type.GAME, OffsetDateTime.now());
ServerStopEvent event = new ServerStopEvent(ServerEvent.Type.GAME, OffsetDateTime.now());
event.call();
// Save players & the world.
this.getPlayers().forEach((uid, player) -> player.getSession().close());
this.getPlayers()
.forEach(
(uid, player) -> {
player.getSession().close();
});
this.getWorlds().forEach(World::save);
Utils.sleep(1000L); // Wait 1 second for operations to finish.
this.stop(); // Stop the server.
try {
var threadPool = GameSessionManager.getLogicThread();
// Shutdown network thread.
threadPool.shutdownGracefully();
// Wait for the network thread to finish.
if (!threadPool.awaitTermination(5, TimeUnit.SECONDS)) {
Grasscutter.getLogger().error("Logic thread did not terminate!");
}
} catch (InterruptedException ignored) {
}
}
@NotNull @Override
@@ -1,20 +1,27 @@
package emu.grasscutter.server.game;
import static emu.grasscutter.config.Configuration.*;
import static emu.grasscutter.config.Configuration.GAME_INFO;
import static emu.grasscutter.config.Configuration.SERVER;
import static emu.grasscutter.utils.lang.Language.translate;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.Grasscutter.ServerDebugMode;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.packet.*;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.packet.PacketOpcodesUtils;
import emu.grasscutter.server.event.game.SendPacketEvent;
import emu.grasscutter.utils.*;
import io.netty.buffer.*;
import emu.grasscutter.utils.Crypto;
import emu.grasscutter.utils.FileUtils;
import emu.grasscutter.utils.Utils;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.io.File;
import java.net.InetSocketAddress;
import java.nio.file.Path;
import lombok.*;
import lombok.Getter;
import lombok.Setter;
public class GameSession implements GameSessionManager.KcpChannel {
private final GameServer server;
@@ -132,11 +139,7 @@ public class GameSession implements GameSessionManager.KcpChannel {
SendPacketEvent event = new SendPacketEvent(this, packet);
event.call();
if (!event.isCanceled()) { // If event is not cancelled, continue.
try {
tunnel.writeData(event.getPacket().build());
} catch (Exception ignored) {
Grasscutter.getLogger().debug("Unable to send packet to client.");
}
tunnel.writeData(event.getPacket().build());
}
}
@@ -149,7 +152,8 @@ public class GameSession implements GameSessionManager.KcpChannel {
@Override
public void handleReceive(byte[] bytes) {
// Decrypt and turn back into a packet
Crypto.xor(bytes, useSecretKey() ? Crypto.ENCRYPT_KEY : Crypto.DISPATCH_KEY);
if (this.getState() != SessionState.WAITING_FOR_TOKEN)
Crypto.xor(bytes, useSecretKey() ? Crypto.ENCRYPT_KEY : Crypto.DISPATCH_KEY);
ByteBuf packet = Unpooled.wrappedBuffer(bytes);
// Log
@@ -2,15 +2,16 @@ package emu.grasscutter.server.game;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.utils.Utils;
import io.netty.buffer.*;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.DefaultEventLoop;
import java.net.InetSocketAddress;
import java.util.concurrent.ConcurrentHashMap;
import kcp.highway.*;
import lombok.Getter;
import kcp.highway.KcpListener;
import kcp.highway.Ukcp;
public class GameSessionManager {
@Getter private static final DefaultEventLoop logicThread = new DefaultEventLoop();
private static final DefaultEventLoop logicThread = new DefaultEventLoop();
private static final ConcurrentHashMap<Ukcp, GameSession> sessions = new ConcurrentHashMap<>();
private static final KcpListener listener =
new KcpListener() {
@@ -95,13 +95,10 @@ public final class RegionHandler implements Router {
RegionInfo.newBuilder()
.setGateserverIp(region.Ip)
.setGateserverPort(region.Port)
.setSecretKey(ByteString.copyFrom(Crypto.DISPATCH_SEED))
.build();
// Create an updated region query.
var updatedQuery =
QueryCurrRegionHttpRsp.newBuilder()
.setRegionInfo(regionInfo)
.setClientSecretKey(ByteString.copyFrom(Crypto.DISPATCH_SEED))
.build();
var updatedQuery = QueryCurrRegionHttpRsp.newBuilder().setRegionInfo(regionInfo).build();
regions.put(
region.Name,
new RegionData(
@@ -7,13 +7,18 @@ import emu.grasscutter.Grasscutter;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.http.Router;
import emu.grasscutter.utils.*;
import emu.grasscutter.utils.DispatchUtils;
import emu.grasscutter.utils.FileUtils;
import emu.grasscutter.utils.Utils;
import io.javalin.Javalin;
import io.javalin.http.*;
import io.javalin.http.ContentType;
import io.javalin.http.Context;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.LinkedHashSet;
import lombok.Getter;
/** Handles all gacha-related HTTP requests. */
@@ -43,14 +48,14 @@ public final class GachaHandler implements Router {
// Make request to dispatch server.
var data = DispatchUtils.fetchGachaRecords(account.getId(), page, gachaType);
var records = data.get("records").getAsString();
var records = data.get("records").getAsJsonArray();
var maxPage = data.get("maxPage").getAsLong();
var locale = account.getLocale();
var template =
new String(
FileUtils.read(FileUtils.getDataPath("gacha/records.html")), StandardCharsets.UTF_8)
.replace("'{{REPLACE_RECORDS}}'", Utils.unescapeJson(records))
.replace("'{{REPLACE_RECORDS}}'", records.toString())
.replace("'{{REPLACE_MAXPAGE}}'", String.valueOf(maxPage))
.replace("{{TITLE}}", translate(locale, "gacha.records.title"))
.replace("{{DATE}}", translate(locale, "gacha.records.date"))
@@ -1,6 +1,5 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
@@ -12,11 +11,6 @@ public final class HandlerClientLockGameTimeNotify extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var packet = ClientLockGameTimeNotify.parseFrom(payload);
// session.getPlayer().getWorld().lockTime(packet.getIsLock());
// TODO: figure out what to implement here
if (packet.getIsLock())
Grasscutter.getLogger()
.warn(
"Invalid 'ClientLockGameTimeNotify' received; value is true. (please report to development channel)");
session.getPlayer().getWorld().lockTime(packet.getIsLock());
}
}
@@ -1,13 +1,15 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.GadgetData;
import emu.grasscutter.data.excels.ItemData;
import emu.grasscutter.data.excels.monster.MonsterData;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.world.Position;
import emu.grasscutter.net.packet.*;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.QuestCreateEntityReqOuterClass.QuestCreateEntityReq;
import emu.grasscutter.scripts.data.SceneGadget;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketQuestCreateEntityRsp;
import lombok.val;
@@ -28,29 +30,12 @@ public class HandlerQuestCreateEntityReq extends PacketHandler {
case GADGET_ID -> {
val gadgetId = entity.getGadgetId();
val gadgetInfo = entity.getGadget();
var gadgetData = GameData.getGadgetDataMap().get(gadgetId);
GadgetData gadgetData = GameData.getGadgetDataMap().get(gadgetId);
gameEntity =
switch (gadgetData.getType()) {
case Vehicle -> new EntityVehicle(scene, session.getPlayer(), gadgetId, 0, pos, rot);
case Chest -> {
var chest = gadgetInfo.getChest();
var gadget = new EntityGadget(scene, gadgetId, pos, rot);
// Create the gadget data for the chest.
var metaGadget = new SceneGadget();
metaGadget.drop_count = 1; // TODO: Check if more items should be dropped.
metaGadget.chest_drop_id = chest.getChestDropId();
metaGadget.setShowcutscene(chest.getIsShowCutscene());
// Apply the gadget data to the chest.
gadget.setMetaGadget(metaGadget);
yield gadget;
}
default -> new EntityGadget(scene, gadgetId, pos, rot);
};
if (gameEntity instanceof EntityGadget gadget) {
gadget.buildContent();
}
}
case ITEM_ID -> {
val itemId = entity.getItemId();
@@ -13,6 +13,7 @@ public class PacketGetPlayerTokenRsp extends BasePacket {
super(PacketOpcodes.GetPlayerTokenRsp, true);
this.setUseDispatchKey(true);
this.shouldEncrypt = false;
GetPlayerTokenRsp p =
GetPlayerTokenRsp.newBuilder()
@@ -38,6 +39,7 @@ public class PacketGetPlayerTokenRsp extends BasePacket {
super(PacketOpcodes.GetPlayerTokenRsp, true);
this.setUseDispatchKey(true);
this.shouldEncrypt = false;
GetPlayerTokenRsp p =
GetPlayerTokenRsp.newBuilder()
@@ -59,6 +61,7 @@ public class PacketGetPlayerTokenRsp extends BasePacket {
super(PacketOpcodes.GetPlayerTokenRsp, true);
this.setUseDispatchKey(true);
this.shouldEncrypt = false;
GetPlayerTokenRsp p =
GetPlayerTokenRsp.newBuilder()
@@ -35,12 +35,12 @@ public class PacketPlayerLoginRsp extends BasePacket {
RegionInfo.newBuilder()
.setGateserverIp(lr(GAME_INFO.accessAddress, GAME_INFO.bindAddress))
.setGateserverPort(lr(GAME_INFO.accessPort, GAME_INFO.bindPort))
.setSecretKey(ByteString.copyFrom(Crypto.DISPATCH_SEED))
.build();
var regionCache =
regionCache =
QueryCurrRegionHttpRspOuterClass.QueryCurrRegionHttpRsp.newBuilder()
.setRegionInfo(serverRegion)
.setClientSecretKey(ByteString.copyFrom(Crypto.DISPATCH_SEED))
.build();
} catch (Exception e) {
Grasscutter.getLogger().error("Error while initializing region cache!", e);
@@ -1,15 +1,23 @@
package emu.grasscutter.utils;
import com.google.gson.*;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.*;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import emu.grasscutter.data.common.DynamicFloat;
import emu.grasscutter.game.world.*;
import emu.grasscutter.game.world.GridPosition;
import emu.grasscutter.game.world.Position;
import it.unimi.dsi.fastutil.floats.FloatArrayList;
import it.unimi.dsi.fastutil.ints.*;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;
import lombok.val;
public interface JsonAdapters {
@@ -12,7 +12,6 @@ import io.javalin.http.Context;
import io.netty.buffer.*;
import it.unimi.dsi.fastutil.ints.*;
import java.io.*;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.time.*;
@@ -485,7 +484,6 @@ public final class Utils {
*
* @param runnable The task to run.
*/
@SuppressWarnings("BusyWait")
public static void waitFor(Returnable<Boolean> runnable) {
while (!runnable.invoke()) {
try {
@@ -495,43 +493,4 @@ public final class Utils {
}
}
}
/**
* Recursively finds all fields in a class.
*
* @param type The class to find fields in.
* @return A list of all fields in the class.
*/
public static List<Field> getAllFields(Class<?> type) {
var fields = new LinkedList<>(Arrays.asList(type.getDeclaredFields()));
// Check for superclasses.
if (type.getSuperclass() != null) {
fields.addAll(getAllFields(type.getSuperclass()));
}
return fields;
}
/**
* Sleeps the current thread without an exception.
*
* @param millis The amount of milliseconds to sleep.
*/
public static void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException ignored) {
}
}
/**
* Unescapes a JSON string.
*
* @param json The JSON string to unescape.
* @return The unescaped JSON string.
*/
public static String unescapeJson(String json) {
return json.replaceAll("\"", "\"");
}
}
@@ -1,10 +1,11 @@
package emu.grasscutter.utils.objects;
import com.google.gson.*;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import emu.grasscutter.server.dispatch.IDispatcher;
import emu.grasscutter.utils.Utils;
import java.lang.reflect.Field;
import java.util.*;
import java.util.Arrays;
import java.util.HashMap;
public interface FieldFetch {
/**
@@ -17,7 +18,8 @@ public interface FieldFetch {
// Prepare field properties.
var fieldValues = new JsonObject();
var fieldMap = new HashMap<String, Field>();
Utils.getAllFields(this.getClass()).forEach(field -> fieldMap.put(field.getName(), field));
Arrays.stream(this.getClass().getDeclaredFields())
.forEach(field -> fieldMap.put(field.getName(), field));
// Find the values of all requested fields.
for (var fieldName : fields) {
+1 -2
View File
@@ -463,8 +463,7 @@
"disabling_failed": "Failed to disable plugin: %s",
"invalid_api": {
"not_present": "Plugin %s does not specify an API version.",
"lower": "Plugin %s is using API version %s, while the server is using API version %s.",
"outdated": "Plugin %s is using an outdated API method."
"lower": "Plugin %s is using API version %s, while the server is using API version %s."
}
}
}
+1 -2
View File
@@ -463,8 +463,7 @@
"disabling_failed": "Error al desactivar el plugin: %s",
"invalid_api": {
"not_present": "🇺🇸Plugin %s does not specify an API version.",
"lower": "🇺🇸Plugin %s is using API version %s, while the server is using API version %s.",
"outdated": "🇺🇸Plugin %s is using an outdated API method."
"lower": "🇺🇸Plugin %s is using API version %s, while the server is using API version %s."
}
}
}
+1 -2
View File
@@ -463,8 +463,7 @@
"disabling_failed": "Impossible de désactiver le plugin %s",
"invalid_api": {
"not_present": "🇺🇸Plugin %s does not specify an API version.",
"lower": "🇺🇸Plugin %s is using API version %s, while the server is using API version %s.",
"outdated": "🇺🇸Plugin %s is using an outdated API method."
"lower": "🇺🇸Plugin %s is using API version %s, while the server is using API version %s."
}
}
}

Some files were not shown because too many files have changed in this diff Show More