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
131 changed files with 2663 additions and 4675 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
+10 -42
View File
@@ -57,7 +57,7 @@ sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
group = 'io.grasscutter'
version = '1.6.2'
version = '2.0.0-unstable'
java {
withJavadocJar()
@@ -335,55 +335,23 @@ tasks.register('generateHandbook') {
return
}
// Resolve the NPM command.
var npm = 'npm'
if (Os.isFamily(Os.FAMILY_WINDOWS))
npm = 'npm.cmd'
def npmVersion = {
def nodeVersion = {
try {
return "${npm} --version".execute()
return 'node --version'.execute().text.trim()
} catch (ignored) {
ignored.printStackTrace()
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))
npm = 'npm.cmd'
exec {
workingDir 'src/handbook'
commandLine npm, 'run', 'build'
+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>
+62 -29
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>
@@ -18,57 +18,90 @@
* Apparition de monstres via la console
* Inventaire (obtention d'objets/de personnages, amélioration d'objets/personnages, etc)
## Guide d'installation rapide
## Guide de démarrage rapide
**Note:** Pour obtenir un support, rejoignez notre serveur [Discord](https://discord.gg/T5vZU6UyeG) (en anglais).
### Démarage rapide (Automatique)
### Logiciels requis
- Téléchargez Java 17: https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html
- Téléchargez [MongoDB Community Server](https://www.mongodb.com/try/download/community)
- Téléchargez la version du jeu REL3.7 (Le client de jeut peut être obtenu ici si vous ne l'avez pas): https://github.com/MAnggiarMustofa/GI-Download-Library/blob/main/GenshinImpact/Client/3.7.0.md
* Java SE - 17 ([link](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html))
- Téléchargez la [dernière version de Cultivation](https://github.com/Grasscutters/Cultivation/releases/latest). Ulilisez l'installateur en `.msi`.
- Après avoir ouvert Cultivation (en administrateur), appuyez sur le bouton de téléchargement en haut a droite.
- Cliquez sur le bouton `Téléchargez tout-en-un`
- Cliquez sur l'engrenage dans le coin en haut a droite.
- Définisez l'emplacement d'installation du jeu.
- Définisez le chemin Java personnalisé à `C:\Program Files\Java\jdk-17\bin\java.exe`
- Laissez tous les autres paramètes par défauts
**Note:** Si vous voulez juste **l'exécuter**, Alors vous pouvez télécharger seulement le **jre**
- Appuyez sur le bouton a coté de Lancer.
- Appuyez sur le bouton Lancer.
- Connectez vous avec le nom d'utilisateur que vous voulez. Le mot de passe n'a pas d'importance.
* MongoDB (4.0+ recommandé)
### Compilation
* Proxy daemon: mitmproxy (mitmdump, recommended), Fiddler Classic, etc.
Grasscutter utilise Gradle pour la gestion des dépendances et la compilation.
### Lancement
**Prérequis**
**Note:** Si vous avez mis à jour depuis une ancienne version, supprimez `config.json` pour le regénérer.
- [Java SE Development Kits - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) ou plus récent
1. Obtenez `grasscutter.jar`
- Téléchargez le depuis les [actions](https://github.com/Grasscutters/Grasscutter/suites/6895963598/artifacts/267483297)
- [Buildez le par vous-même](#Building)
2. Créez un dossier `resources` dans le dossier où grasscutter.jar est situé et déplacez vos dossiers `BinOutput` et `ExcelBinOutput` ici *(Vérifiez le [wiki](https://github.com/Grasscutters/Grasscutter/wiki) pour plus de détails sur comment les obtenir.)*
3. Exécutez Grasscutter avec `java -jar grasscutter.jar`. **Soyez sûr que le service MongoDB est en cours d'exécution.**
### Connection avec le client
½. Créez un compte avec la [console de commande du serveur](https://github.com/Grasscutters/Grasscutter/wiki/Commands#targeting).
1. Redirection du traffic: (Choisissez-en un)
- mitmdump: `mitmdump -s proxy.py -k`
Approuvez le certificat CA:
**Note:**Le certificat CA est généralement stocké sous `%USERPROFILE%\ .mitmproxy`, ou vous pouvez le télécharger depuis `http://mitm.it`
Double-cliquez pour [installer](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate) oo ...
- Via la ligne de commande
```shell
certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer
```
- Fiddler Classic: Exécutez Fiddler Classic, Activez `Decrypt https traffic` dans les paramètres et changez le port par défaut ici (Tools -> Options -> Connections) à autre chose que `8888`, et chargez [ce script](https://github.lunatic.moe/fiddlerscript).
- [Fichier hosts](https://github.com/Grasscutters/Grasscutter/wiki/Running#traffic-route-map)
2. Définissez le proxy du réseau comme `127.0.0.1:8080` ou le port du proxy que vous avez spécifié.
**Vous pouvez aussi utiliser `start.cmd` to démarrer les serveurs et le proxy automatiquement, mais vous devez mettre en place la variable d'environnement JAVA_HOME**
### Building
Grasscutter utilise Gradle pour gérer les dépendances et la construction.
**Logiciels requis:**
- [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 # Setting up environments
.\gradlew jar # Compile
.\gradlew.bat # Mettre en place l'environnement
.\gradlew jar # Compiler
```
##### Linux (GNU)
##### 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 # Compile
./gradlew jar # Compiler
```
Vous pouvez trouver le jar de sortie dans la racine du dossier du projet.
Vous trouverez le fichier jar compilé à la racine du dossier du projet.
### Dépanage
### Les commandes ont été déplacé vers le [wiki](https://github.com/Grasscutters/Grasscutter/wiki/Commands)! (en anglais)
Pour une liste des problèmes communs et leur solution et pour demander de l'aide, veuillez rejoindre [notre serveur Discord](https://discord.gg/T5vZU6UyeG) (en anglais) et dirigez vous vers le salon de support.
# Dépannage rapide
* Si la compilation a échoué, veuillez vérifier votre installation de votre JDK (JDK 17 et le bon dossier bin du JDK dans la variable PATH)
* Mon client ne se connecte pas au serveur, impossible de se connecter a mon compte, 4206, etc... - La plupart du temps, *le problème* vient de la configuration de votre proxy. Si vous utilisez Fiddler, vérifiez s'il est exécuté sur un port autre que 8888
* Séquence de démarrage : MongoDB > Grasscutter > Proxy (mitmdump, fiddler, etc...) > Jeu
+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>
+16 -16
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="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>
[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)
**Attenzione:** Diamo sempre il benvenuto ai contributori del progetto. Prima di contribuire, leggi attentamente il nostro [Codice di condotta](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md).
**Attenzione:** Diamo sempre il benvenuto ai contributori del progetto. Prima di aggiungere il tuo contributo, leggi attentamente il nostro [Codice di condotta](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md).
## Funzionalità attuali
@@ -15,12 +15,12 @@
* Teletrasporto
* Sistema Gacha
* Cooperativa *parzialmente* funzionale
* Evocazione nemici usando la console
* Inventario (ricevi e aggiorna oggetti/personaggi, ecc.)
* Evoca mostri dalla console
* Funzionalità dell'inventario (ricevi oggetti/personaggi, aggiorna oggetti/personaggi, ecc.)
## Guida rapida all'installazione
**Nota:** Se hai bisogno di aiuto, unisciti al nostro [Discord](https://discord.gg/T5vZU6UyeG).
**Nota:** Per il supporto, unisciti al nostro [Discord](https://discord.gg/T5vZU6UyeG).
### Requisiti
@@ -30,30 +30,30 @@
* [MongoDB](https://www.mongodb.com/try/download/community) (consigliato 4.0+)
* Servizi proxy: mitmproxy (mitmdump, consigliato), Fiddler Classic, ecc.
* Servizio proxy: mitmproxy (mitmdump, consigliato), Fiddler Classic, ecc.
### Esecuzione
**Nota:** Se hai aggiornato da una versione precedente, elimina `config.json` in modo che venga generato di nuovo.
**Nota:** Se hai eseguito l'aggiornamento da una versione precedente, rimuovi `config.json` in modo che venga generato di nuovo.
1. Ottieni "grasscutter.jar".
- Scarica da [azioni](https://github.com/Grasscutters/Grasscutter/suites/6895963598/artifacts/267483297)
- [Compilalo tu stesso](#Compilazione)
2. Crea una cartella chiamata `resources` nella directory in cui si trova grasscutter.jar e sposta lì le cartelle `BinOutput` ed `ExcelBinOutput` *(Vedi il [wiki](https://github.com/Grasscutters/Grasscutter/wiki ) per maggiori dettagli su come ottenerli.)*
3. Esegui Grasscutter con `java -jar grasscutter.jar`. **Assicurati che il servizio mongodb sia attivo.**
2. Crea una cartella `resources` nella directory in cui si trova grasscutter.jar e sposta lì le cartelle `BinOutput` ed `ExcelBinOutput` *(Vedi il [wiki](https://github.com/Grasscutters/Grasscutter/wiki ) per maggiori dettagli su come ottenerli.)*
3. Eseguire Grasscutter con `java -jar grasscutter.jar`. **Assicurati che il servizio mongodb sia attivo.**
### Connessione al client
### Connessione client
½. Crea un account usando [il comando corrispondente nella console del server](https://github.com/Grasscutters/Grasscutter/wiki/Commands#targeting).
1. Reindirizza il traffico: (scegli uno)
- Con mitmdump: `mitmdump -s proxy.py -k`
- mitmdump: `mitmdump -s proxy.py -k`
Autorizza il certificato CA:
**Nota:**Il certificato CA si trova solitamente in `%USERPROFILE%\ .mitmproxy`, oppure puoi scaricarlo da `http://mitm.it`
Fai doppio clic su [installa](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate) o ...
Fare doppio clic su [installa](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate) o ...
- Con riga di comando
@@ -61,11 +61,11 @@
certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer
```
- Con Fiddler Classic: esegui Fiddler Classic, abilita `Decrypt https traffic` nelle opzioni e cambia la porta predefinita in (Strumenti -> Opzioni -> Connessioni) in qualcosa di diverso da `8888`, e carica [questo script](https://github.lunatic.moe/fiddlerscript).
- Fiddler Classic: esegui Fiddler Classic, abilita `Decrypt https traffic` nelle opzioni e cambia la porta predefinita in (Strumenti -> Opzioni -> Connessioni) in qualcosa di diverso da `8888`, e carica [questo script](https :/ /github.lunatic.moe/fiddlerscript).
- [File host](https://github.com/Grasscutters/Grasscutter/wiki/Running#traffic-route-map)
2. Imposta il proxy di rete a `127.0.0.1:8080` o la porta proxy impostata.
2. Impostare il proxy di rete su `127.0.0.1:8080` o la porta proxy impostata.
**Puoi anche usare `start.cmd` per avviare automaticamente il server e il servizio proxy, ma devi impostare l'ambiente JAVA_HOME**
@@ -98,11 +98,11 @@ chmod +x gradlew
Puoi trovare il jar generato nella cartella principale del progetto.
### I comandi sono stati spostati al [wiki](https://github.com/Grasscutters/Grasscutter/wiki/Commands)!
### I comandi sono stati spostati nel [wiki](https://github.com/Grasscutters/Grasscutter/wiki/Commands)!
# Soluzioni agli errori comuni
* Se la compilazione non riesce, controlla l'installazione di JDK (JDK 17 e convalida la variabile JDK bin PATH)
* Se il tuo client non si connette, non accede, da errore 4206, ecc... - Probabilmente *il problema* sono le tue impostazioni proxy, se usi
* Il mio client non si connette, non accede, 4206, ecc... - Probabilmente le tue impostazioni proxy sono *il problema*, se usi
Fiddler assicurati di utilizzare una porta diversa da 8888
* Sequenza di avvio: MongoDB > Grasscutter > Servizio proxy (mitmdump, fiddler, ecc.) > Gioco
+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 等) > 客户端
+44 -15
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>
@@ -22,23 +22,52 @@
**注意:** 如需幫助請加入 [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)
- 下載遊戲版本 REL3.7(如果你沒有的話,可以在[這裡](https://github.com/MAnggiarMustofa/GI-Download-Library/blob/main/GenshinImpact/Client/3.7.0.md)找到 3.7 客戶端)
* Java SE - 17 ([連結](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html))
- 下載 [最新的 Cultivation 版本](https://github.com/Grasscutters/Cultivation/releases/latest)。使用 `.msi` 安裝程式。
- 以管理員身分打開 Culivation,按右上角的下載按鈕。
- 點擊 `Download All-in-One`
- 點擊右上角的齒輪
- 將遊戲安裝路徑設置為你的遊戲所在的位置。
- 將自定義 Java 路徑設置為 `C:\Program Files\Java\jdk-17\bin\java.exe`
- 其他設置保持預設
**注意:** 如果僅想**執行服務端**, 使用 **jre** 即可
- 點擊啟動旁邊的小按鈕。
- 點擊啟動按鈕。
- 用你想要的用戶名登錄,密碼無所謂。
* [MongoDB](https://www.mongodb.com/try/download/community) (推薦 4.0+)
* 代理程式: mitmproxy (推薦 mitmdump), Fiddler Classic 等
### 執行
**注意:** 從舊版本升級到新版本, 需要刪除 `config.json`
1. 獲取 `grasscutter.jar`
- 從 [actions](https://github.com/Grasscutters/Grasscutter/suites/6895963598/artifacts/267483297) 下載
- [自行編譯](#編譯)
2. 在 JAR 檔案根目錄中建立 `resources` 資料夾並複製 `BinOutput``ExcelBinOutput` *(查看 [wiki](https://github.com/Grasscutters/Grasscutter/wiki) 瞭解更多)*
3. 命令列 `java -jar grasscutter.jar` 執行 Grasscutter。**在此之前請確認 MongoDB 服務執行正常**
### 客戶端連線
½. 在伺服器控制台[建立賬戶](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` 環境變數**
### 編譯
@@ -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)
}
File diff suppressed because it is too large Load Diff
@@ -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,
@@ -25,23 +25,23 @@ public final class ForgeQueueDataOuterClass {
int getAvatarId();
/**
* <code>uint32 finish_count = 15;</code>
* <code>uint32 unfinish_count = 15;</code>
* @return The unfinishCount.
*/
int getUnfinishCount();
/**
* <code>uint32 next_finish_timestamp = 13;</code>
* @return The nextFinishTimestamp.
*/
int getNextFinishTimestamp();
/**
* <code>uint32 finish_count = 4;</code>
* @return The finishCount.
*/
int getFinishCount();
/**
* <code>uint32 total_finish_timestamp = 13;</code>
* @return The totalFinishTimestamp.
*/
int getTotalFinishTimestamp();
/**
* <code>uint32 queue_id = 4;</code>
* @return The queueId.
*/
int getQueueId();
/**
* <code>uint32 forge_id = 1;</code>
* @return The forgeId.
@@ -49,16 +49,16 @@ public final class ForgeQueueDataOuterClass {
int getForgeId();
/**
* <code>uint32 next_finish_timestamp = 8;</code>
* @return The nextFinishTimestamp.
* <code>uint32 total_finish_timestamp = 8;</code>
* @return The totalFinishTimestamp.
*/
int getNextFinishTimestamp();
int getTotalFinishTimestamp();
/**
* <code>uint32 unfinish_count = 9;</code>
* @return The unfinishCount.
* <code>uint32 queue_id = 9;</code>
* @return The queueId.
*/
int getUnfinishCount();
int getQueueId();
}
/**
* <pre>
@@ -116,22 +116,22 @@ public final class ForgeQueueDataOuterClass {
}
case 32: {
queueId_ = input.readUInt32();
finishCount_ = input.readUInt32();
break;
}
case 64: {
nextFinishTimestamp_ = input.readUInt32();
totalFinishTimestamp_ = input.readUInt32();
break;
}
case 72: {
unfinishCount_ = input.readUInt32();
queueId_ = input.readUInt32();
break;
}
case 104: {
totalFinishTimestamp_ = input.readUInt32();
nextFinishTimestamp_ = input.readUInt32();
break;
}
case 112: {
@@ -141,7 +141,7 @@ public final class ForgeQueueDataOuterClass {
}
case 120: {
finishCount_ = input.readUInt32();
unfinishCount_ = input.readUInt32();
break;
}
default: {
@@ -187,10 +187,32 @@ public final class ForgeQueueDataOuterClass {
return avatarId_;
}
public static final int FINISH_COUNT_FIELD_NUMBER = 15;
public static final int UNFINISH_COUNT_FIELD_NUMBER = 15;
private int unfinishCount_;
/**
* <code>uint32 unfinish_count = 15;</code>
* @return The unfinishCount.
*/
@java.lang.Override
public int getUnfinishCount() {
return unfinishCount_;
}
public static final int NEXT_FINISH_TIMESTAMP_FIELD_NUMBER = 13;
private int nextFinishTimestamp_;
/**
* <code>uint32 next_finish_timestamp = 13;</code>
* @return The nextFinishTimestamp.
*/
@java.lang.Override
public int getNextFinishTimestamp() {
return nextFinishTimestamp_;
}
public static final int FINISH_COUNT_FIELD_NUMBER = 4;
private int finishCount_;
/**
* <code>uint32 finish_count = 15;</code>
* <code>uint32 finish_count = 4;</code>
* @return The finishCount.
*/
@java.lang.Override
@@ -198,28 +220,6 @@ public final class ForgeQueueDataOuterClass {
return finishCount_;
}
public static final int TOTAL_FINISH_TIMESTAMP_FIELD_NUMBER = 13;
private int totalFinishTimestamp_;
/**
* <code>uint32 total_finish_timestamp = 13;</code>
* @return The totalFinishTimestamp.
*/
@java.lang.Override
public int getTotalFinishTimestamp() {
return totalFinishTimestamp_;
}
public static final int QUEUE_ID_FIELD_NUMBER = 4;
private int queueId_;
/**
* <code>uint32 queue_id = 4;</code>
* @return The queueId.
*/
@java.lang.Override
public int getQueueId() {
return queueId_;
}
public static final int FORGE_ID_FIELD_NUMBER = 1;
private int forgeId_;
/**
@@ -231,26 +231,26 @@ public final class ForgeQueueDataOuterClass {
return forgeId_;
}
public static final int NEXT_FINISH_TIMESTAMP_FIELD_NUMBER = 8;
private int nextFinishTimestamp_;
public static final int TOTAL_FINISH_TIMESTAMP_FIELD_NUMBER = 8;
private int totalFinishTimestamp_;
/**
* <code>uint32 next_finish_timestamp = 8;</code>
* @return The nextFinishTimestamp.
* <code>uint32 total_finish_timestamp = 8;</code>
* @return The totalFinishTimestamp.
*/
@java.lang.Override
public int getNextFinishTimestamp() {
return nextFinishTimestamp_;
public int getTotalFinishTimestamp() {
return totalFinishTimestamp_;
}
public static final int UNFINISH_COUNT_FIELD_NUMBER = 9;
private int unfinishCount_;
public static final int QUEUE_ID_FIELD_NUMBER = 9;
private int queueId_;
/**
* <code>uint32 unfinish_count = 9;</code>
* @return The unfinishCount.
* <code>uint32 queue_id = 9;</code>
* @return The queueId.
*/
@java.lang.Override
public int getUnfinishCount() {
return unfinishCount_;
public int getQueueId() {
return queueId_;
}
private byte memoizedIsInitialized = -1;
@@ -270,23 +270,23 @@ public final class ForgeQueueDataOuterClass {
if (forgeId_ != 0) {
output.writeUInt32(1, forgeId_);
}
if (queueId_ != 0) {
output.writeUInt32(4, queueId_);
}
if (nextFinishTimestamp_ != 0) {
output.writeUInt32(8, nextFinishTimestamp_);
}
if (unfinishCount_ != 0) {
output.writeUInt32(9, unfinishCount_);
if (finishCount_ != 0) {
output.writeUInt32(4, finishCount_);
}
if (totalFinishTimestamp_ != 0) {
output.writeUInt32(13, totalFinishTimestamp_);
output.writeUInt32(8, totalFinishTimestamp_);
}
if (queueId_ != 0) {
output.writeUInt32(9, queueId_);
}
if (nextFinishTimestamp_ != 0) {
output.writeUInt32(13, nextFinishTimestamp_);
}
if (avatarId_ != 0) {
output.writeUInt32(14, avatarId_);
}
if (finishCount_ != 0) {
output.writeUInt32(15, finishCount_);
if (unfinishCount_ != 0) {
output.writeUInt32(15, unfinishCount_);
}
unknownFields.writeTo(output);
}
@@ -301,29 +301,29 @@ public final class ForgeQueueDataOuterClass {
size += com.google.protobuf.CodedOutputStream
.computeUInt32Size(1, forgeId_);
}
if (queueId_ != 0) {
if (finishCount_ != 0) {
size += com.google.protobuf.CodedOutputStream
.computeUInt32Size(4, queueId_);
}
if (nextFinishTimestamp_ != 0) {
size += com.google.protobuf.CodedOutputStream
.computeUInt32Size(8, nextFinishTimestamp_);
}
if (unfinishCount_ != 0) {
size += com.google.protobuf.CodedOutputStream
.computeUInt32Size(9, unfinishCount_);
.computeUInt32Size(4, finishCount_);
}
if (totalFinishTimestamp_ != 0) {
size += com.google.protobuf.CodedOutputStream
.computeUInt32Size(13, totalFinishTimestamp_);
.computeUInt32Size(8, totalFinishTimestamp_);
}
if (queueId_ != 0) {
size += com.google.protobuf.CodedOutputStream
.computeUInt32Size(9, queueId_);
}
if (nextFinishTimestamp_ != 0) {
size += com.google.protobuf.CodedOutputStream
.computeUInt32Size(13, nextFinishTimestamp_);
}
if (avatarId_ != 0) {
size += com.google.protobuf.CodedOutputStream
.computeUInt32Size(14, avatarId_);
}
if (finishCount_ != 0) {
if (unfinishCount_ != 0) {
size += com.google.protobuf.CodedOutputStream
.computeUInt32Size(15, finishCount_);
.computeUInt32Size(15, unfinishCount_);
}
size += unknownFields.getSerializedSize();
memoizedSize = size;
@@ -342,18 +342,18 @@ public final class ForgeQueueDataOuterClass {
if (getAvatarId()
!= other.getAvatarId()) return false;
if (getUnfinishCount()
!= other.getUnfinishCount()) return false;
if (getNextFinishTimestamp()
!= other.getNextFinishTimestamp()) return false;
if (getFinishCount()
!= other.getFinishCount()) return false;
if (getForgeId()
!= other.getForgeId()) return false;
if (getTotalFinishTimestamp()
!= other.getTotalFinishTimestamp()) return false;
if (getQueueId()
!= other.getQueueId()) return false;
if (getForgeId()
!= other.getForgeId()) return false;
if (getNextFinishTimestamp()
!= other.getNextFinishTimestamp()) return false;
if (getUnfinishCount()
!= other.getUnfinishCount()) return false;
if (!unknownFields.equals(other.unknownFields)) return false;
return true;
}
@@ -367,18 +367,18 @@ public final class ForgeQueueDataOuterClass {
hash = (19 * hash) + getDescriptor().hashCode();
hash = (37 * hash) + AVATAR_ID_FIELD_NUMBER;
hash = (53 * hash) + getAvatarId();
hash = (37 * hash) + UNFINISH_COUNT_FIELD_NUMBER;
hash = (53 * hash) + getUnfinishCount();
hash = (37 * hash) + NEXT_FINISH_TIMESTAMP_FIELD_NUMBER;
hash = (53 * hash) + getNextFinishTimestamp();
hash = (37 * hash) + FINISH_COUNT_FIELD_NUMBER;
hash = (53 * hash) + getFinishCount();
hash = (37 * hash) + FORGE_ID_FIELD_NUMBER;
hash = (53 * hash) + getForgeId();
hash = (37 * hash) + TOTAL_FINISH_TIMESTAMP_FIELD_NUMBER;
hash = (53 * hash) + getTotalFinishTimestamp();
hash = (37 * hash) + QUEUE_ID_FIELD_NUMBER;
hash = (53 * hash) + getQueueId();
hash = (37 * hash) + FORGE_ID_FIELD_NUMBER;
hash = (53 * hash) + getForgeId();
hash = (37 * hash) + NEXT_FINISH_TIMESTAMP_FIELD_NUMBER;
hash = (53 * hash) + getNextFinishTimestamp();
hash = (37 * hash) + UNFINISH_COUNT_FIELD_NUMBER;
hash = (53 * hash) + getUnfinishCount();
hash = (29 * hash) + unknownFields.hashCode();
memoizedHashCode = hash;
return hash;
@@ -518,18 +518,18 @@ public final class ForgeQueueDataOuterClass {
super.clear();
avatarId_ = 0;
unfinishCount_ = 0;
nextFinishTimestamp_ = 0;
finishCount_ = 0;
forgeId_ = 0;
totalFinishTimestamp_ = 0;
queueId_ = 0;
forgeId_ = 0;
nextFinishTimestamp_ = 0;
unfinishCount_ = 0;
return this;
}
@@ -557,12 +557,12 @@ public final class ForgeQueueDataOuterClass {
public emu.grasscutter.net.proto.ForgeQueueDataOuterClass.ForgeQueueData buildPartial() {
emu.grasscutter.net.proto.ForgeQueueDataOuterClass.ForgeQueueData result = new emu.grasscutter.net.proto.ForgeQueueDataOuterClass.ForgeQueueData(this);
result.avatarId_ = avatarId_;
result.unfinishCount_ = unfinishCount_;
result.nextFinishTimestamp_ = nextFinishTimestamp_;
result.finishCount_ = finishCount_;
result.forgeId_ = forgeId_;
result.totalFinishTimestamp_ = totalFinishTimestamp_;
result.queueId_ = queueId_;
result.forgeId_ = forgeId_;
result.nextFinishTimestamp_ = nextFinishTimestamp_;
result.unfinishCount_ = unfinishCount_;
onBuilt();
return result;
}
@@ -614,24 +614,24 @@ public final class ForgeQueueDataOuterClass {
if (other.getAvatarId() != 0) {
setAvatarId(other.getAvatarId());
}
if (other.getUnfinishCount() != 0) {
setUnfinishCount(other.getUnfinishCount());
}
if (other.getNextFinishTimestamp() != 0) {
setNextFinishTimestamp(other.getNextFinishTimestamp());
}
if (other.getFinishCount() != 0) {
setFinishCount(other.getFinishCount());
}
if (other.getForgeId() != 0) {
setForgeId(other.getForgeId());
}
if (other.getTotalFinishTimestamp() != 0) {
setTotalFinishTimestamp(other.getTotalFinishTimestamp());
}
if (other.getQueueId() != 0) {
setQueueId(other.getQueueId());
}
if (other.getForgeId() != 0) {
setForgeId(other.getForgeId());
}
if (other.getNextFinishTimestamp() != 0) {
setNextFinishTimestamp(other.getNextFinishTimestamp());
}
if (other.getUnfinishCount() != 0) {
setUnfinishCount(other.getUnfinishCount());
}
this.mergeUnknownFields(other.unknownFields);
onChanged();
return this;
@@ -692,9 +692,71 @@ public final class ForgeQueueDataOuterClass {
return this;
}
private int unfinishCount_ ;
/**
* <code>uint32 unfinish_count = 15;</code>
* @return The unfinishCount.
*/
@java.lang.Override
public int getUnfinishCount() {
return unfinishCount_;
}
/**
* <code>uint32 unfinish_count = 15;</code>
* @param value The unfinishCount to set.
* @return This builder for chaining.
*/
public Builder setUnfinishCount(int value) {
unfinishCount_ = value;
onChanged();
return this;
}
/**
* <code>uint32 unfinish_count = 15;</code>
* @return This builder for chaining.
*/
public Builder clearUnfinishCount() {
unfinishCount_ = 0;
onChanged();
return this;
}
private int nextFinishTimestamp_ ;
/**
* <code>uint32 next_finish_timestamp = 13;</code>
* @return The nextFinishTimestamp.
*/
@java.lang.Override
public int getNextFinishTimestamp() {
return nextFinishTimestamp_;
}
/**
* <code>uint32 next_finish_timestamp = 13;</code>
* @param value The nextFinishTimestamp to set.
* @return This builder for chaining.
*/
public Builder setNextFinishTimestamp(int value) {
nextFinishTimestamp_ = value;
onChanged();
return this;
}
/**
* <code>uint32 next_finish_timestamp = 13;</code>
* @return This builder for chaining.
*/
public Builder clearNextFinishTimestamp() {
nextFinishTimestamp_ = 0;
onChanged();
return this;
}
private int finishCount_ ;
/**
* <code>uint32 finish_count = 15;</code>
* <code>uint32 finish_count = 4;</code>
* @return The finishCount.
*/
@java.lang.Override
@@ -702,7 +764,7 @@ public final class ForgeQueueDataOuterClass {
return finishCount_;
}
/**
* <code>uint32 finish_count = 15;</code>
* <code>uint32 finish_count = 4;</code>
* @param value The finishCount to set.
* @return This builder for chaining.
*/
@@ -713,7 +775,7 @@ public final class ForgeQueueDataOuterClass {
return this;
}
/**
* <code>uint32 finish_count = 15;</code>
* <code>uint32 finish_count = 4;</code>
* @return This builder for chaining.
*/
public Builder clearFinishCount() {
@@ -723,68 +785,6 @@ public final class ForgeQueueDataOuterClass {
return this;
}
private int totalFinishTimestamp_ ;
/**
* <code>uint32 total_finish_timestamp = 13;</code>
* @return The totalFinishTimestamp.
*/
@java.lang.Override
public int getTotalFinishTimestamp() {
return totalFinishTimestamp_;
}
/**
* <code>uint32 total_finish_timestamp = 13;</code>
* @param value The totalFinishTimestamp to set.
* @return This builder for chaining.
*/
public Builder setTotalFinishTimestamp(int value) {
totalFinishTimestamp_ = value;
onChanged();
return this;
}
/**
* <code>uint32 total_finish_timestamp = 13;</code>
* @return This builder for chaining.
*/
public Builder clearTotalFinishTimestamp() {
totalFinishTimestamp_ = 0;
onChanged();
return this;
}
private int queueId_ ;
/**
* <code>uint32 queue_id = 4;</code>
* @return The queueId.
*/
@java.lang.Override
public int getQueueId() {
return queueId_;
}
/**
* <code>uint32 queue_id = 4;</code>
* @param value The queueId to set.
* @return This builder for chaining.
*/
public Builder setQueueId(int value) {
queueId_ = value;
onChanged();
return this;
}
/**
* <code>uint32 queue_id = 4;</code>
* @return This builder for chaining.
*/
public Builder clearQueueId() {
queueId_ = 0;
onChanged();
return this;
}
private int forgeId_ ;
/**
* <code>uint32 forge_id = 1;</code>
@@ -816,64 +816,64 @@ public final class ForgeQueueDataOuterClass {
return this;
}
private int nextFinishTimestamp_ ;
private int totalFinishTimestamp_ ;
/**
* <code>uint32 next_finish_timestamp = 8;</code>
* @return The nextFinishTimestamp.
* <code>uint32 total_finish_timestamp = 8;</code>
* @return The totalFinishTimestamp.
*/
@java.lang.Override
public int getNextFinishTimestamp() {
return nextFinishTimestamp_;
public int getTotalFinishTimestamp() {
return totalFinishTimestamp_;
}
/**
* <code>uint32 next_finish_timestamp = 8;</code>
* @param value The nextFinishTimestamp to set.
* <code>uint32 total_finish_timestamp = 8;</code>
* @param value The totalFinishTimestamp to set.
* @return This builder for chaining.
*/
public Builder setNextFinishTimestamp(int value) {
public Builder setTotalFinishTimestamp(int value) {
nextFinishTimestamp_ = value;
totalFinishTimestamp_ = value;
onChanged();
return this;
}
/**
* <code>uint32 next_finish_timestamp = 8;</code>
* <code>uint32 total_finish_timestamp = 8;</code>
* @return This builder for chaining.
*/
public Builder clearNextFinishTimestamp() {
public Builder clearTotalFinishTimestamp() {
nextFinishTimestamp_ = 0;
totalFinishTimestamp_ = 0;
onChanged();
return this;
}
private int unfinishCount_ ;
private int queueId_ ;
/**
* <code>uint32 unfinish_count = 9;</code>
* @return The unfinishCount.
* <code>uint32 queue_id = 9;</code>
* @return The queueId.
*/
@java.lang.Override
public int getUnfinishCount() {
return unfinishCount_;
public int getQueueId() {
return queueId_;
}
/**
* <code>uint32 unfinish_count = 9;</code>
* @param value The unfinishCount to set.
* <code>uint32 queue_id = 9;</code>
* @param value The queueId to set.
* @return This builder for chaining.
*/
public Builder setUnfinishCount(int value) {
public Builder setQueueId(int value) {
unfinishCount_ = value;
queueId_ = value;
onChanged();
return this;
}
/**
* <code>uint32 unfinish_count = 9;</code>
* <code>uint32 queue_id = 9;</code>
* @return This builder for chaining.
*/
public Builder clearUnfinishCount() {
public Builder clearQueueId() {
unfinishCount_ = 0;
queueId_ = 0;
onChanged();
return this;
}
@@ -945,10 +945,10 @@ public final class ForgeQueueDataOuterClass {
static {
java.lang.String[] descriptorData = {
"\n\024ForgeQueueData.proto\"\264\001\n\016ForgeQueueDat" +
"a\022\021\n\tavatar_id\030\016 \001(\r\022\024\n\014finish_count\030\017 \001" +
"(\r\022\036\n\026total_finish_timestamp\030\r \001(\r\022\020\n\010qu" +
"eue_id\030\004 \001(\r\022\020\n\010forge_id\030\001 \001(\r\022\035\n\025next_f" +
"inish_timestamp\030\010 \001(\r\022\026\n\016unfinish_count\030" +
"a\022\021\n\tavatar_id\030\016 \001(\r\022\026\n\016unfinish_count\030\017" +
" \001(\r\022\035\n\025next_finish_timestamp\030\r \001(\r\022\024\n\014f" +
"inish_count\030\004 \001(\r\022\020\n\010forge_id\030\001 \001(\r\022\036\n\026t" +
"otal_finish_timestamp\030\010 \001(\r\022\020\n\010queue_id\030" +
"\t \001(\rB\033\n\031emu.grasscutter.net.protob\006prot" +
"o3"
};
@@ -961,7 +961,7 @@ public final class ForgeQueueDataOuterClass {
internal_static_ForgeQueueData_fieldAccessorTable = new
com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
internal_static_ForgeQueueData_descriptor,
new java.lang.String[] { "AvatarId", "FinishCount", "TotalFinishTimestamp", "QueueId", "ForgeId", "NextFinishTimestamp", "UnfinishCount", });
new java.lang.String[] { "AvatarId", "UnfinishCount", "NextFinishTimestamp", "FinishCount", "ForgeId", "TotalFinishTimestamp", "QueueId", });
}
// @@protoc_insertion_point(outer_class_scope)
+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;
@@ -4,9 +4,11 @@ import static emu.grasscutter.utils.lang.Language.translate;
import at.favre.lib.crypto.bcrypt.BCrypt;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.command.*;
import emu.grasscutter.command.Command;
import emu.grasscutter.command.CommandHandler;
import emu.grasscutter.config.Configuration;
import emu.grasscutter.database.*;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.database.DatabaseManager;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.player.Player;
import java.util.List;
@@ -29,17 +31,17 @@ public final class AccountCommand implements CommandHandler {
return;
}
if (args.size() < 2) {
sendUsageMessage(sender);
return;
}
String action = args.get(0);
String username = args.get(1);
switch (action) {
default -> this.sendUsageMessage(sender);
case "create" -> {
if (args.size() < 2) {
this.sendUsageMessage(sender);
return;
}
var username = args.get(1);
int uid = 0;
String password = "";
if (Configuration.ACCOUNT.EXPERIMENTAL_RealPassword) {
@@ -92,12 +94,6 @@ public final class AccountCommand implements CommandHandler {
}
}
case "delete" -> {
if (args.size() < 2) {
this.sendUsageMessage(sender);
return;
}
var username = args.get(1);
// Get the account we want to delete.
Account toDelete = DatabaseHelper.getAccountByName(username);
if (toDelete == null) {
@@ -108,12 +104,6 @@ public final class AccountCommand implements CommandHandler {
CommandHandler.sendMessage(sender, translate(sender, "commands.account.delete"));
}
case "resetpass" -> {
if (args.size() < 2) {
this.sendUsageMessage(sender);
return;
}
var username = args.get(1);
if (!Configuration.ACCOUNT.EXPERIMENTAL_RealPassword) {
CommandHandler.sendMessage(
sender, "resetpass requires EXPERIMENTAL_RealPassword to be true.");
@@ -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<>();
@@ -9,7 +9,6 @@ import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.binout.*;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
import emu.grasscutter.data.binout.config.*;
import emu.grasscutter.data.binout.routes.*;
import emu.grasscutter.data.common.PointData;
import emu.grasscutter.data.custom.*;
import emu.grasscutter.data.excels.trial.TrialAvatarActivityDataData;
@@ -108,7 +107,6 @@ public final class ResourceLoader {
// Load default home layout
loadHomeworldDefaultSaveData();
loadNpcBornData();
loadRoutes();
loadBlossomResources();
cacheTalentLevelSets();
// Load activities.
@@ -118,7 +116,6 @@ public final class ResourceLoader {
loadConfigLevelEntityData();
loadQuestShareConfig();
loadGadgetMappings();
loadSubfieldMappings();
loadMonsterMappings();
loadActivityCondGroups();
loadGroupReplacements();
@@ -266,32 +263,6 @@ public final class ResourceLoader {
}
}
private static void loadRoutes() {
try {
Files.newDirectoryStream(getResourcePath("BinOutput/LevelDesign/Routes/"), "*.json")
.forEach(
path -> {
try {
val data = JsonUtils.loadToClass(path, SceneRoutes.class);
val routesArray = data.getRoutes();
if (routesArray == null) return;
val routesMap =
GameData.getSceneRouteData()
.getOrDefault(data.getSceneId(), new Int2ObjectOpenHashMap<>());
for (Route route : routesArray) {
routesMap.put(route.getLocalId(), route);
}
GameData.getSceneRouteData().put(data.getSceneId(), routesMap);
} catch (IOException ignored) {
}
});
Grasscutter.getLogger()
.debug("Loaded " + GameData.getSceneNpcBornData().size() + " SceneRouteDatas.");
} catch (IOException e) {
Grasscutter.getLogger().error("Failed to load SceneRouteData folder.");
}
}
private static void cacheTalentLevelSets() {
// All known levels, keyed by proudSkillGroupId
GameData.getProudSkillDataMap()
@@ -834,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,58 +11,38 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class HomeworldDefaultSaveData {
@SerializedName(
value = "KFHBFNPDJBE",
alternate = {"PKACPHDGGEI", "AKOLOBLHDFK"})
@SerializedName(value = "KFHBFNPDJBE", alternate = "PKACPHDGGEI")
List<HomeBlock> homeBlockLists;
@SerializedName(
value = "IJNPADKGNKE",
alternate = {"MINCKHBNING", "MBICDPDEKDM"})
@SerializedName(value = "IJNPADKGNKE", alternate = "MINCKHBNING")
Position bornPos;
@SerializedName(
value = "IPIIGEMFLHK",
alternate = {"EJJIOJKFKCO"})
@SerializedName("IPIIGEMFLHK")
Position bornRot;
@SerializedName(
value = "HHOLBNPIHEM",
alternate = {"CJAKHCIFHNP"})
@SerializedName("HHOLBNPIHEM")
Position djinPos;
@SerializedName(
value = "KNHCJKHCOAN",
alternate = {"AMDNOHPGKMI"})
@SerializedName("KNHCJKHCOAN")
HomeFurniture mainhouse;
@SerializedName(
value = "NIHOJFEKFPG",
alternate = {"BHCPEAOPIDC"})
@SerializedName("NIHOJFEKFPG")
List<HomeFurniture> doorLists;
@SerializedName(
value = "EPGELGEFJFK",
alternate = {"AABEPENIFLN"})
@SerializedName("EPGELGEFJFK")
List<HomeFurniture> stairLists;
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public static class HomeBlock {
@SerializedName(
value = "FGIJCELCGFI",
alternate = {"PGDPDIDJEEL", "ANICBLBOBKD"})
@SerializedName(value = "FGIJCELCGFI", alternate = "PGDPDIDJEEL")
int blockId;
@SerializedName(
value = "BEAPOFELABD",
alternate = {"NCIMIKKFLOH"})
@SerializedName("BEAPOFELABD")
List<HomeFurniture> furnitures;
@SerializedName(
value = "MLIODLGDFHJ",
alternate = {"GJGNLIINBGB"})
@SerializedName("MLIODLGDFHJ")
List<HomeFurniture> persistentFurnitures;
}
@@ -70,14 +50,10 @@ public class HomeworldDefaultSaveData {
@FieldDefaults(level = AccessLevel.PRIVATE)
public static class HomeFurniture {
@SerializedName(
value = "ENHNGKJBJAB",
alternate = {"KMAAJJHPNBA", "FFLCGFGGGND"})
@SerializedName(value = "ENHNGKJBJAB", alternate = "KMAAJJHPNBA")
int id;
@SerializedName(
value = "NGIEEIOLPPO",
alternate = {"JFKAHNCPDME", "BPCGGBKIAMG"})
@SerializedName(value = "NGIEEIOLPPO", alternate = "JFKAHNCPDME")
Position pos;
// @SerializedName(value = "HEOCEHKEBFM", alternate = "LKCKOOGFDBM")
Position rot;
@@ -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",
@@ -89,14 +89,7 @@ public class ItemData extends GameResource {
@SerializedName(
value = "roomSceneId",
alternate = {
"BMEPAMCNABE",
"DANFGGLKLNO",
"JFDLJGDFIGL",
"OHIANNAEEAK",
"MFGACDIOHGF",
"roomSceneID"
})
alternate = {"BMEPAMCNABE", "DANFGGLKLNO", "JFDLJGDFIGL", "OHIANNAEEAK", "MFGACDIOHGF"})
private int roomSceneId;
// Custom
@@ -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, id.length() - 2));
}
}
@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;
@@ -6,13 +6,12 @@ import emu.grasscutter.game.dungeons.enums.DungeonPassConditionType;
import emu.grasscutter.game.quest.enums.LogicType;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
@ResourceType(name = "DungeonPassExcelConfigData.json")
public class DungeonPassConfigData extends GameResource {
@Getter private int id;
@Getter private LogicType logicType;
@Getter @Setter private List<DungeonPassCondition> conds;
@Getter private List<DungeonPassCondition> conds;
public static class DungeonPassCondition {
@Getter private DungeonPassConditionType condType;
@@ -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;
}
}
@@ -15,7 +15,7 @@ public class UnknownActivityConditionHandler extends ActivityConditionBaseHandle
@Override
public boolean execute(
PlayerActivityData activityData, ActivityConfigItem activityConfig, int... params) {
Grasscutter.getLogger().debug("Called unknown condition handler {}.", conditions.name());
Grasscutter.getLogger().error("Called unknown condition handler {}.", conditions.name());
return false;
}
}
@@ -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();
@@ -53,13 +53,8 @@ public final class DungeonManager {
public DungeonManager(@NonNull Scene scene, @NonNull DungeonData dungeonData) {
this.scene = scene;
this.dungeonData = dungeonData;
if (dungeonData.getPassCond() == 0) {
this.passConfigData = new DungeonPassConfigData();
this.passConfigData.setConds(new ArrayList<>());
} else {
this.passConfigData = GameData.getDungeonPassConfigDataMap().get(dungeonData.getPassCond());
}
this.finishedConditions = new int[this.passConfigData.getConds().size()];
this.passConfigData = GameData.getDungeonPassConfigDataMap().get(dungeonData.getPassCond());
this.finishedConditions = new int[passConfigData.getConds().size()];
}
public void triggerEvent(DungeonPassConditionType conditionType, int... params) {
@@ -81,7 +76,6 @@ public final class DungeonManager {
}
public boolean isFinishedSuccessfully() {
if (passConfigData.getLogicType() == null) return false;
return LogicType.calculate(passConfigData.getLogicType(), finishedConditions);
}
@@ -140,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));
@@ -202,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;
}
@@ -70,7 +70,7 @@ public abstract class EntityBaseGadget extends GameEntity {
getGadgetId())
.setSourceEntityId(getId())
.setParam3((int) this.getFightProperty(FightProperty.FIGHT_PROP_CUR_HP))
.setEventSource(getConfigId()));
.setEventSource(Integer.toString(getConfigId())));
}
protected void fillFightProps(ConfigEntityGadget configGadget) {
@@ -7,11 +7,12 @@ import emu.grasscutter.data.binout.config.fields.ConfigAbilityData;
import emu.grasscutter.data.excels.GadgetData;
import emu.grasscutter.game.entity.gadget.*;
import emu.grasscutter.game.entity.gadget.platform.BaseRoute;
import emu.grasscutter.game.entity.gadget.platform.ConfigRoute;
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;
@@ -19,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 {
@@ -247,62 +258,6 @@ public class EntityGadget extends EntityBaseGadget {
if (routeConfig.isStarted()) {
return true;
}
if (routeConfig instanceof ConfigRoute configRoute) {
var route = this.getScene().getSceneRouteById(configRoute.getRouteId());
if (route != null) {
var points = route.getPoints();
val currIndex = configRoute.getStartIndex();
Position prevpos;
if (currIndex == 0) {
prevpos = getPosition();
this.getScene()
.getScriptManager()
.callEvent(
new ScriptArgs(
this.getGroupId(),
EventType.EVENT_PLATFORM_REACH_POINT,
this.getConfigId(),
configRoute.getRouteId())
.setParam3(0)
.setEventSource(this.getConfigId()));
} else {
prevpos = points[currIndex].getPos();
}
double time = 0;
for (var i = currIndex; i < points.length; ++i) {
time += points[i].getPos().computeDistance(prevpos) / points[i].getTargetVelocity();
prevpos = points[i].getPos();
val I = i;
configRoute
.getScheduledIndexes()
.add(
this.getScene()
.getScheduler()
.scheduleDelayedTask(
() -> {
if (points[I].isHasReachEvent() && I > currIndex) {
this.getScene()
.getScriptManager()
.callEvent(
new ScriptArgs(
this.getGroupId(),
EventType.EVENT_PLATFORM_REACH_POINT,
this.getConfigId(),
configRoute.getRouteId())
.setParam3(I)
.setEventSource(this.getConfigId()));
}
configRoute.setStartIndex(I);
this.position.set(points[I].getPos());
},
(int) time));
}
}
}
getScene().broadcastPacket(new PacketSceneTimeNotify(getScene()));
routeConfig.startRoute(getScene());
getScene().broadcastPacket(new PacketPlatformStartRouteNotify(this));
@@ -318,14 +273,6 @@ public class EntityGadget extends EntityBaseGadget {
if (!routeConfig.isStarted()) {
return true;
}
if (routeConfig instanceof ConfigRoute configRoute) {
for (var task : configRoute.getScheduledIndexes()) {
this.getScene().getScheduler().cancelTask(task);
}
configRoute.getScheduledIndexes().clear();
}
routeConfig.stopRoute(getScene());
getScene().broadcastPacket(new PacketPlatformStopRouteNotify(this));
@@ -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;
@@ -235,7 +229,7 @@ public class EntityMonster extends GameEntity {
getScene().getScriptManager().callEvent(new ScriptArgs(this.getGroupId(), EVENT_SPECIFIC_MONSTER_HP_CHANGE, getConfigId(), monsterData.getId())
.setSourceEntityId(getId())
.setParam3((int) this.getFightProperty(FightProperty.FIGHT_PROP_CUR_HP))
.setEventSource(getConfigId()));
.setEventSource(Integer.toString(getConfigId())));
}
@Override
@@ -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);
var ScriptArgs =
new ScriptArgs(getGadget().getGroupId(), EventType.EVENT_GATHER, getGadget().getConfigId());
if (getGadget().getMetaGadget() != null) {
ScriptArgs.setEventSource(getGadget().getMetaGadget().config_id);
}
getGadget().getScene().getScriptManager().callEvent(ScriptArgs);
getGadget()
.getScene()
.broadcastPacket(
@@ -1,54 +1,18 @@
package emu.grasscutter.game.entity.gadget;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.excels.GatherData;
import emu.grasscutter.data.excels.ItemData;
import emu.grasscutter.game.entity.EntityGadget;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.net.proto.GadgetInteractReqOuterClass;
import emu.grasscutter.net.proto.InteractTypeOuterClass;
import emu.grasscutter.net.proto.SceneGadgetInfoOuterClass;
import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.data.ScriptArgs;
import emu.grasscutter.server.packet.send.PacketGadgetInteractRsp;
public class GadgetObject extends GadgetContent {
private int itemId;
public GadgetObject(EntityGadget gadget) {
super(gadget);
GatherData gatherData = GameData.getGatherDataMap().get(gadget.getPointType());
if (gatherData != null) {
this.itemId = gatherData.getItemId();
}
}
@Override
public boolean onInteract(Player player, GadgetInteractReqOuterClass.GadgetInteractReq req) {
// This is a workaround until a proper gadget interaction system can be put in place.
ItemData itemData = GameData.getItemDataMap().get(this.itemId);
if (itemData == null) {
return false;
}
GameItem item = new GameItem(itemData, 1);
player.getInventory().addItem(item, ActionReason.Gather);
var ScriptArgs =
new ScriptArgs(getGadget().getGroupId(), EventType.EVENT_GATHER, getGadget().getConfigId());
if (getGadget().getMetaGadget() != null) {
ScriptArgs.setEventSource(getGadget().getMetaGadget().config_id);
}
getGadget().getScene().getScriptManager().callEvent(ScriptArgs);
getGadget()
.getScene()
.broadcastPacket(
new PacketGadgetInteractRsp(
getGadget(), InteractTypeOuterClass.InteractType.INTERACT_TYPE_GATHER));
return true;
return false;
}
@Override
@@ -4,36 +4,27 @@ import emu.grasscutter.game.world.Position;
import emu.grasscutter.net.proto.MovingPlatformTypeOuterClass;
import emu.grasscutter.net.proto.PlatformInfoOuterClass;
import emu.grasscutter.scripts.data.SceneGadget;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
public class ConfigRoute extends BaseRoute {
@Getter @Setter private int routeId;
@Getter @Setter private int startIndex;
@Getter @Setter private List<Integer> scheduledIndexes;
public ConfigRoute(SceneGadget gadget) {
super(gadget);
this.routeId = gadget.route_id;
this.startIndex = 0;
this.scheduledIndexes = new ArrayList<>();
}
public ConfigRoute(Position startRot, boolean startRoute, boolean isActive, int routeId) {
super(startRot, startRoute, isActive);
this.routeId = routeId;
this.startIndex = 0;
this.scheduledIndexes = new ArrayList<>();
}
@Override
public PlatformInfoOuterClass.PlatformInfo.Builder toProto() {
return super.toProto()
.setRouteId(this.routeId)
.setStartIndex(this.startIndex)
.setRouteId(routeId)
.setMovingPlatformType(
MovingPlatformTypeOuterClass.MovingPlatformType.MOVING_PLATFORM_TYPE_USE_CONFIG);
}
@@ -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);
}
}
});
@@ -1536,12 +1537,6 @@ public class Player implements PlayerHook, FieldFetch {
}
}
@Override
public boolean equals(Object obj) {
return obj instanceof Player otherPlayer &&
this.id == otherPlayer.getUid();
}
public enum SceneLoadState {
NONE(0), LOADING(1), INIT(2), LOADED(3);
@@ -1552,4 +1547,5 @@ public class Player implements PlayerHook, FieldFetch {
this.value = value;
}
}
}
@@ -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,6 +12,6 @@ public class ContentLeaveScene extends BaseContent {
@Override
public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
return condition.getParam()[0] == params[0];
return quest.getOwner().getScene().getPrevScene() == 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;
}
}
@@ -13,11 +13,9 @@ public class ContentQuestStateEqual extends BaseContent {
public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
GameQuest checkQuest = quest.getOwner().getQuestManager().getQuestById(condition.getParam()[0]);
if (checkQuest == null) {
return false;
}
return checkQuest.getState().getValue() == condition.getParam()[1];
return checkQuest.getState().getValue() == params[1];
}
}
@@ -12,12 +12,12 @@ public class ContentQuestStateNotEqual extends BaseContent {
@Override
public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
GameQuest checkQuest = quest.getOwner().getQuestManager().getQuestById(condition.getParam()[0]);
GameQuest checkQuest = quest.getOwner().getQuestManager().getQuestById(params[0]);
if (checkQuest == null) {
return false;
if (checkQuest != null) {
return checkQuest.getState().getValue() != params[1];
}
return checkQuest.getState().getValue() != condition.getParam()[1];
return false;
}
}
@@ -13,8 +13,8 @@ public class ContentQuestVarEqual extends BaseContent {
@Override
public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
int questVarValue = quest.getMainQuest().getQuestVars()[condition.getParam()[0]];
Grasscutter.getLogger().debug("questVar {} : {}", condition.getParam()[0], questVarValue);
return questVarValue == condition.getParam()[1];
int questVarValue = quest.getMainQuest().getQuestVars()[params[0]];
Grasscutter.getLogger().debug("questVar {} : {}", params[0], questVarValue);
return questVarValue == params[1];
}
}
@@ -13,8 +13,8 @@ public class ContentQuestVarGreater extends BaseContent {
@Override
public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
int questVarValue = quest.getMainQuest().getQuestVars()[condition.getParam()[0]];
Grasscutter.getLogger().debug("questVar {} : {}", condition.getParam()[0], questVarValue);
return questVarValue > condition.getParam()[1];
int questVarValue = quest.getMainQuest().getQuestVars()[params[0]];
Grasscutter.getLogger().debug("questVar {} : {}", params[0], questVarValue);
return questVarValue > params[1];
}
}
@@ -13,8 +13,8 @@ public class ContentQuestVarLess extends BaseContent {
@Override
public boolean execute(
GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) {
int questVarValue = quest.getMainQuest().getQuestVars()[condition.getParam()[0]];
Grasscutter.getLogger().debug("questVar {} : {}", condition.getParam()[0], questVarValue);
return questVarValue < condition.getParam()[1];
int questVarValue = quest.getMainQuest().getQuestVars()[params[0]];
Grasscutter.getLogger().debug("questVar {} : {}", params[0], questVarValue);
return questVarValue < params[1];
}
}
@@ -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,44 +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.server.scheduler.ServerTaskScheduler;
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;
@@ -52,6 +62,7 @@ public final class Scene {
@Getter private final Set<SceneGroup> loadedGroups;
@Getter private final BlossomManager blossomManager;
private final HashSet<Integer> unlockedForces;
private final List<Runnable> afterLoadedCallbacks = new ArrayList<>();
private final long startWorldTime;
@Getter @Setter DungeonManager dungeonManager;
@Getter Int2ObjectMap<Route> sceneRoutes;
@@ -68,11 +79,7 @@ public final class Scene {
@Getter private int tickCount = 0;
@Getter private boolean isPaused = false;
private final List<Runnable> afterLoadedCallbacks = new ArrayList<>();
private final List<Runnable> afterHostInitCallbacks = new ArrayList<>();
@Getter private GameEntity sceneEntity;
@Getter private final ServerTaskScheduler scheduler;
public Scene(World world, SceneData sceneData) {
this.world = world;
@@ -96,7 +103,6 @@ public final class Scene {
this.blossomManager = new BlossomManager(this);
this.unlockedForces = new HashSet<>();
this.sceneEntity = new EntityScene(this);
this.scheduler = new ServerTaskScheduler();
}
public int getId() {
@@ -111,13 +117,6 @@ public final class Scene {
return this.getPlayers().size();
}
/**
* @return The scene's world's host.
*/
public Player getHost() {
return this.getWorld().getHost();
}
public GameEntity getEntityById(int id) {
// Check if the scene's entity ID is referenced.
if (id == 0x13800001) return this.sceneEntity;
@@ -536,10 +535,6 @@ public final class Scene {
return;
}
if (!isPaused) {
this.getScheduler().runTasks();
}
if (this.getScriptManager().isInit()) {
// this.checkBlocks();
this.checkGroups();
@@ -556,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. */
@@ -694,29 +686,6 @@ public final class Scene {
this.afterLoadedCallbacks.add(runnable);
}
/**
* Invoked when a player initializes loading the scene.
*
* @param player The player that initialized loading the scene.
*/
public void playerSceneInitialized(Player player) {
// Check if the player is the host.
if (!player.equals(this.getHost())) return;
// Run all callbacks.
this.afterHostInitCallbacks.forEach(Runnable::run);
this.afterHostInitCallbacks.clear();
}
/**
* Run a callback when the host initializes loading the scene.
*
* @param runnable The callback to be executed.
*/
public void runWhenHostInitialized(Runnable runnable) {
this.afterHostInitCallbacks.add(runnable);
}
public int getEntityLevel(int baseLevel, int worldLevelOverride) {
int level = worldLevelOverride > 0 ? worldLevelOverride + baseLevel - 22 : baseLevel;
level = Math.min(level, 100);
@@ -731,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;
}
@@ -877,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);
}
@@ -1183,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);
});
}
@@ -10,7 +10,7 @@ import emu.grasscutter.data.server.Grid;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.entity.gadget.platform.BaseRoute;
import emu.grasscutter.game.props.EntityIdType;
import emu.grasscutter.game.props.EntityType;
import emu.grasscutter.game.quest.*;
import emu.grasscutter.game.world.*;
import emu.grasscutter.net.proto.VisionTypeOuterClass;
@@ -99,13 +99,7 @@ public class SceneScriptManager {
}
public SceneConfig getConfig() {
for (int i = 0; i < 10; ++i) {
if (this.isInit) {
return this.meta.config;
}
Utils.sleep(100);
}
return null;
return this.isInit ? this.meta.config : null;
}
public Map<Integer, SceneBlock> getBlocks() {
@@ -215,14 +209,7 @@ public class SceneScriptManager {
var suiteData = group.getSuiteByIndex(suiteIndex);
if (suiteData == null) {
Grasscutter.getLogger().warn("Group {} suite {} not found", group.id, suiteIndex);
group.setLoaded(false);
group.load(this.scene.getId());
suiteData = group.getSuiteByIndex(suiteIndex);
if (suiteData == null) {
return 0;
}
Grasscutter.getLogger()
.error("Group {} suite {} nvm, I found it. This is BAD", group.id, suiteIndex);
return 0;
}
int prevSuiteIndex = groupInstance.getActiveSuiteId();
@@ -279,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;
}
@@ -640,25 +627,27 @@ public class SceneScriptManager {
// add other types of entity
var entities =
getScene().getEntities().values().stream()
.filter(e -> region.getMetaRegion().contains(e.getPosition()))
.filter(
e ->
e.getEntityType() == EntityType.Avatar.getValue()
&& region.getMetaRegion().contains(e.getPosition()))
.toList();
var entitiesIds = entities.stream().map(GameEntity::getId).toList();
var enterEntities =
entitiesIds.stream().filter(e -> !region.getEntities().contains(e)).toList();
var leaveEntities =
region.getEntities().stream().filter(e -> !entitiesIds.contains(e)).toList();
entities.forEach(region::addEntity);
for (var targetId : enterEntities) {
var targetId = 0;
if (entities.size() > 0) {
targetId = entities.get(0).getId();
}
if (region.entityHasEntered()) {
Grasscutter.getLogger()
.trace("Call EVENT_ENTER_REGION_{}", region.getMetaRegion().config_id);
this.callEvent(
new ScriptArgs(region.getGroupId(), EventType.EVENT_ENTER_REGION, region.getConfigId())
.setEventSource(EntityIdType.toEntityType(targetId >> 24).getValue())
.setSourceEntityId(region.getId())
.setTargetEntityId(targetId));
region.resetNewEntities();
}
for (var entityId : region.getEntities()) {
@@ -668,12 +657,13 @@ public class SceneScriptManager {
}
}
for (var targetId : leaveEntities) {
if (region.entityHasLeft()) {
this.callEvent(
new ScriptArgs(region.getGroupId(), EventType.EVENT_LEAVE_REGION, region.getConfigId())
.setEventSource(EntityIdType.toEntityType(targetId >> 24).getValue())
.setSourceEntityId(region.getId())
.setTargetEntityId(targetId));
.setTargetEntityId(region.getFirstEntityId()));
region.resetNewEntities();
}
}
}
@@ -691,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();
}
@@ -811,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);
}
@@ -901,6 +890,7 @@ public class SceneScriptManager {
.toList()
.get(0);
this.getScene().getPlayers().forEach(p -> p.onEnterRegion(region.getMetaRegion()));
this.deregisterRegion(region.getMetaRegion());
} else if (trigger.getEvent() == EventType.EVENT_LEAVE_REGION) {
var region =
this.regions.values().stream()
@@ -908,6 +898,7 @@ public class SceneScriptManager {
.toList()
.get(0);
this.getScene().getPlayers().forEach(p -> p.onLeaveRegion(region.getMetaRegion()));
this.deregisterRegion(region.getMetaRegion());
}
if (trigger.getEvent() == EVENT_TIMER_EVENT) {
@@ -8,25 +8,36 @@ import emu.grasscutter.game.dungeons.challenge.enums.FatherChallengeProperty;
import emu.grasscutter.game.dungeons.challenge.factory.ChallengeFactory;
import emu.grasscutter.game.entity.*;
import emu.grasscutter.game.entity.gadget.GadgetWorktop;
import emu.grasscutter.game.entity.gadget.platform.*;
import emu.grasscutter.game.props.*;
import emu.grasscutter.game.quest.enums.*;
import emu.grasscutter.game.world.*;
import emu.grasscutter.game.entity.gadget.platform.ConfigRoute;
import emu.grasscutter.game.entity.gadget.platform.PointArrayRoute;
import emu.grasscutter.game.props.ClimateType;
import emu.grasscutter.game.props.EntityIdType;
import emu.grasscutter.game.props.EntityType;
import emu.grasscutter.game.quest.enums.QuestCond;
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.*;
import emu.grasscutter.scripts.data.*;
import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.constants.GroupKillPolicy;
import emu.grasscutter.scripts.data.SceneGroup;
import emu.grasscutter.scripts.data.SceneObject;
import emu.grasscutter.scripts.data.ScriptArgs;
import emu.grasscutter.server.packet.send.*;
import emu.grasscutter.game.world.Position;
import io.netty.util.concurrent.FastThreadLocal;
import lombok.val;
import org.luaj.vm2.*;
import org.slf4j.*;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import java.util.*;
import static emu.grasscutter.game.props.EnterReason.Lua;
import static emu.grasscutter.scripts.ScriptUtils.*;
import static emu.grasscutter.scripts.ScriptUtils.luaToPos;
import static emu.grasscutter.scripts.ScriptUtils.posToLua;
import static emu.grasscutter.scripts.constants.GroupKillPolicy.*;
@SuppressWarnings("unused")
@@ -118,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);
@@ -141,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;
}
@@ -160,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;
}
@@ -244,6 +254,12 @@ public class ScriptLib {
Grasscutter.getLogger().warn("trying to get suite that doesn't exist: {} {}", groupId, suite);
return 1;
}
// avoid spawn wrong monster
if(getSceneScriptManager().getScene().getChallenge() != null)
if(!getSceneScriptManager().getScene().getChallenge().inProgress() ||
getSceneScriptManager().getScene().getChallenge().getGroup().id != groupId){
return 0;
}
this.getSceneScriptManager().addGroupSuite(groupInstance, suiteData);
return 0;
@@ -380,12 +396,12 @@ public class ScriptLib {
logger.debug("[LUA] Call SetGroupVariableValue with {},{}",
var, value);
val groupId = currentGroup.get().id;
val groupId= currentGroup.get().id;
val variables = getSceneScriptManager().getVariables(groupId);
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;
}
@@ -393,46 +409,17 @@ public class ScriptLib {
logger.debug("[LUA] Call ChangeGroupVariableValue with {},{}",
var, value);
val groupId = currentGroup.get().id;
val groupId= currentGroup.get().id;
val variables = getSceneScriptManager().getVariables(groupId);
val old = variables.getOrDefault(var, 0);
variables.put(var, old + value);
getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, old+value, old).setEventSource(var));
logger.debug("[LUA] Call ChangeGroupVariableValue with {},{}",
old, old+value);
getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, old+value, old));
return LuaValue.ZERO;
}
public int GetGroupVariableValueByGroup(String var, int groupId){
logger.debug("[LUA] Call GetGroupVariableValueByGroup with {},{}",
var,groupId);
return getSceneScriptManager().getVariables(groupId).getOrDefault(var, 0);
}
public int SetGroupVariableValueByGroup(String var, int value, int groupId){
logger.debug("[LUA] Call SetGroupVariableValueByGroup with {},{},{}",
var,value,groupId);
val variables = getSceneScriptManager().getVariables(groupId);
val old = variables.getOrDefault(var, value);
variables.put(var, value);
getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, value, old).setEventSource(var));
return 0;
}
public int ChangeGroupVariableValueByGroup(String var, int value, int groupId){
logger.debug("[LUA] Call ChangeGroupVariableValueByGroup with {},{}",
var,groupId);
val variables = getSceneScriptManager().getVariables(groupId);
val old = variables.getOrDefault(var, 0);
variables.put(var, old + value);
getSceneScriptManager().callEvent(new ScriptArgs(groupId, EventType.EVENT_VARIABLE_CHANGE, old+value, old).setEventSource(var));
return 0;
}
/**
* Set the actions and triggers to designated group
*/
@@ -543,22 +530,22 @@ public class ScriptLib {
var entity = scene.getEntityByConfigId(cfgId);
if (entity == null) return 2;
scene.runWhenHostInitialized(() -> scene.broadcastPacket(
new PacketServerGlobalValueChangeNotify(entity, sgvName, value)));
scene.broadcastPacket(
new PacketServerGlobalValueChangeNotify(entity, sgvName, value));
return 0;
}
public int SetEntityServerGlobalValueByEntityId(int entityId, String sgvName, int value) {
logger.debug("[LUA] Call SetEntityServerGlobalValueByEntityId with {}, {}, {}",
entityId, sgvName, value);
public int GetGroupVariableValueByGroup(String name, int groupId){
logger.debug("[LUA] Call GetGroupVariableValueByGroup with {},{}",
name,groupId);
var scriptManager = this.getSceneScriptManager();
if (scriptManager == null) return 1;
var scene = scriptManager.getScene();
scene.runWhenHostInitialized(() -> scene.broadcastPacket(
new PacketServerGlobalValueChangeNotify(entityId, sgvName, value)));
return getSceneScriptManager().getVariables(groupId).getOrDefault(name, 0);
}
public int ChangeGroupVariableValueByGroup(String name, int value, int groupId){
logger.debug("[LUA] Call ChangeGroupVariableValueByGroup with {},{}",
name,groupId);
//TODO test
getSceneScriptManager().getVariables(groupId).put(name, value);
return 0;
}
@@ -586,6 +573,14 @@ public class ScriptLib {
return 0;
}
public int SetGroupVariableValueByGroup(String key, int value, int groupId){
logger.debug("[LUA] Call SetGroupVariableValueByGroup with {},{},{}",
key,value,groupId);
getSceneScriptManager().getVariables(groupId).put(key, value);
return 0;
}
public int CreateMonster(LuaTable table){
logger.debug("[LUA] Call CreateMonster with {}",
printTable(table));
@@ -614,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();
@@ -677,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);
}
@@ -713,7 +702,7 @@ public class ScriptLib {
return EntityType.None.getValue();
}
return entity.getEntityType().getValue();
return entity.getEntityType();
}
public int GetQuestState(int entityId, int questId){
@@ -748,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;
}
@@ -826,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) {
@@ -872,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
@@ -962,7 +946,7 @@ public class ScriptLib {
return 0;
}
public int EndTimeAxis(String var1){
logger.warn("[LUA] Call unimplemented EndTimeAxis with {}", var1);
logger.warn("[LUA] Call unimplemented EndTimeAxis with {} {} {}", var1);
//TODO implement var1 == name?
return 0;
}
@@ -1078,12 +1062,6 @@ public class ScriptLib {
return 0;
}
public int ClearPlayerEyePoint(int var1){
logger.warn("[LUA] Call unimplemented ClearPlayerEyePoint with {}", var1);
//TODO implement
return 0;
}
public int MoveAvatarByPointArray(int uid, int targetId, LuaTable var3, String var4){
logger.warn("[LUA] Call unimplemented MoveAvatarByPointArray with {} {} {} {}", uid, targetId, printTable(var3), var4);
//TODO implement var3 contains int speed, var4 is a json string
@@ -1142,7 +1120,7 @@ public class ScriptLib {
}
public int PlayCutSceneWithParam(int cutsceneId, int var2, LuaTable var3){
logger.warn("[LUA] Call unimplemented PlayCutScene with {} {} {}", cutsceneId, var2, var3);
logger.warn("[LUA] Call unimplemented PlayCutScene with {} {}", cutsceneId, var2, var3);
//TODO implement
return 0;
}
@@ -1319,13 +1297,6 @@ public class ScriptLib {
}
configRoute.setRouteId(routeId);
configRoute.setStartIndex(0);
configRoute.setStarted(false);
for(var task : configRoute.getScheduledIndexes()) {
sceneScriptManager.get().getScene().getScheduler().cancelTask(task);
}
configRoute.getScheduledIndexes().clear();
sceneScriptManager.get().getScene().broadcastPacket(new PacketPlatformChangeRouteNotify(entityGadget));
return 0;
}
@@ -1627,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

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