├── src └── main │ ├── resources │ ├── webstatic │ │ └── version.json │ ├── META-INF │ │ └── MANIFEST.MF │ ├── keys │ │ ├── OSCB_Pub.der │ │ ├── OSCN_Pub.der │ │ ├── SigningKey.der │ │ ├── dispatchKey.bin │ │ ├── secretKey.bin │ │ ├── dispatchSeed.bin │ │ ├── auth_private-key.der │ │ ├── secretKeyBuffer.bin │ │ └── auth_public-key.pem │ └── defaults │ │ └── data │ │ ├── TowerSchedule.json │ │ ├── ActivityConfig.json │ │ └── Announcement.json │ └── java │ └── emu │ └── grasscutter │ ├── plugin │ ├── api │ │ └── Item.java │ └── PluginConfig.java │ ├── server │ ├── game │ │ ├── GameServerStopEvent.java │ │ ├── GameServerTickEvent.java │ │ ├── GameServerStartFinishEvent.java │ │ └── BaseGameSystem.java │ ├── http │ │ ├── objects │ │ │ ├── LoginTokenRequestJson.java │ │ │ ├── QueryCurRegionRspJson.java │ │ │ ├── LoginAccountRequestJson.java │ │ │ ├── ComboTokenReqJson.java │ │ │ └── ComboTokenResJson.java │ │ ├── documentation │ │ │ └── DocumentationHandler.java │ │ └── handlers │ │ │ └── LogHandler.java │ ├── event │ │ ├── Cancellable.java │ │ ├── types │ │ │ ├── GameEvent.java │ │ │ ├── PlayerEvent.java │ │ │ ├── EntityEvent.java │ │ │ └── ServerEvent.java │ │ ├── player │ │ │ ├── PlayerQuitEvent.java │ │ │ ├── PlayerJoinEvent.java │ │ │ ├── PlayerTeamDeathEvent.java │ │ │ └── PlayerReceiveMailEvent.java │ │ ├── HandlerPriority.java │ │ ├── internal │ │ │ ├── ServerStopEvent.java │ │ │ └── ServerStartEvent.java │ │ ├── game │ │ │ └── ServerTickEvent.java │ │ ├── dispatch │ │ │ ├── QueryCurrentRegionEvent.java │ │ │ └── QueryAllRegionsEvent.java │ │ ├── entity │ │ │ └── EntityDeathEvent.java │ │ └── Event.java │ └── packet │ │ ├── send │ │ ├── Packet.java │ │ ├── PacketFireworkRsp.java │ │ ├── PacketFireworkSetRsp.java │ │ ├── PacketHomeUnknown2Rsp.java │ │ ├── PacketPathfindingEnterSceneRsp.java │ │ ├── PacketHomeUpdateArrangementInfoRsp.java │ │ ├── PacketPlayerSetPauseRsp.java │ │ ├── PacketTakeBattlePassMissionPointRsp.java │ │ ├── PacketPlayerChatRsp.java │ │ ├── PacketGetGachaInfoRsp.java │ │ ├── PacketPingRsp.java │ │ ├── PacketTowerTeamSelectRsp.java │ │ ├── PacketH5ActivityIdsNotify.java │ │ ├── PacketDeleteFriendRsp.java │ │ ├── PacketSetNameCardRsp.java │ │ ├── PacketAskAddFriendRsp.java │ │ ├── PacketPlayerCookArgsRsp.java │ │ ├── PacketHomeSceneJumpRsp.java │ │ ├── PacketServerTimeNotify.java │ │ ├── PacketEvtEntityRenderersChangedNotify.java │ │ ├── PacketDeleteFriendNotify.java │ │ ├── PacketWearEquipRsp.java │ │ ├── PacketTakeoffEquipRsp.java │ │ ├── PacketUnlockNameCardNotify.java │ │ ├── PacketWidgetGadgetAllDataNotify.java │ │ ├── PacketGetAuthkeyRsp.java │ │ ├── PacketBuyBattlePassLevelRsp.java │ │ ├── PacketChooseCurAvatarTeamRsp.java │ │ ├── PacketHomeChangeEditModeRsp.java │ │ ├── PacketPlayerApplyEnterMpRsp.java │ │ ├── PacketCombineDataNotify.java │ │ ├── PacketAvatarPromoteRsp.java │ │ ├── PacketChangeTeamNameRsp.java │ │ ├── PacketHomeSceneInitFinishRsp.java │ │ ├── PacketSceneEntityDrownRsp.java │ │ ├── PacketAvatarGainCostumeNotify.java │ │ ├── PacketSetBattlePassViewedRsp.java │ │ ├── PacketGroupUnloadNotify.java │ │ ├── PacketSetPlayerNameRsp.java │ │ ├── PacketAvatarGainFlycloakNotify.java │ │ ├── PacketGetWorldMpInfoRsp.java │ │ ├── PacketHomeUnknown1Notify.java │ │ ├── PacketDungeonShowReminderNotify.java │ │ ├── PacketEnterSceneDoneRsp.java │ │ ├── PacketForgeFormulaDataNotify.java │ │ ├── PacketMusicGameStartRsp.java │ │ ├── PacketPostEnterSceneRsp.java │ │ ├── PacketServerAnnounceRevokeNotify.java │ │ ├── PacketSceneTimeNotify.java │ │ ├── PacketWorldPlayerReviveRsp.java │ │ ├── PacketSceneInitFinishRsp.java │ │ ├── PacketAddQuestContentProgressRsp.java │ │ ├── PacketPlayerEnterDungeonRsp.java │ │ ├── PacketSetWidgetSlotRsp.java │ │ ├── PacketPlayerGetForceQuitBanInfoRsp.java │ │ ├── PacketVehicleStaminaNotify.java │ │ ├── PacketChangeAvatarRsp.java │ │ ├── PacketCombineFormulaDataNotify.java │ │ ├── PacketAvatarAddNotify.java │ │ ├── PacketAvatarDieAnimationEndRsp.java │ │ ├── PacketEnterSceneReadyRsp.java │ │ ├── PacketSelectWorktopOptionRsp.java │ │ ├── PacketSetPlayerSignatureRsp.java │ │ ├── PacketBlossomBriefInfoNotify.java │ │ ├── PacketCanUseSkillNotify.java │ │ ├── PacketHostPlayerNotify.java │ │ ├── PacketNpcTalkRsp.java │ │ ├── PacketActivityInfoNotify.java │ │ ├── PacketFireworkNotify.java │ │ ├── PacketGetShopmallDataRsp.java │ │ ├── PacketMcoinExchangeHcoinRsp.java │ │ ├── PacketChangeGameTimeRsp.java │ │ ├── PacketGetAllUnlockNameCardRsp.java │ │ ├── PacketPersonalSceneJumpRsp.java │ │ ├── PacketUnlockPersonalLineRsp.java │ │ ├── PacketDelMailRsp.java │ │ ├── PacketPlayerApplyEnterMpResultRsp.java │ │ ├── PacketAvatarChangeCostumeNotify.java │ │ ├── PacketHomeChooseModuleRsp.java │ │ ├── PacketPlayerApplyEnterMpNotify.java │ │ ├── PacketTowerMiddleLevelChangeTeamNotify.java │ │ ├── PacketUnlockAvatarTalentRsp.java │ │ ├── PacketAskAddFriendNotify.java │ │ ├── PacketChapterStateNotify.java │ │ ├── PacketFurnitureCurModuleArrangeCountNotify.java │ │ ├── PacketActivityTakeWatcherRewardRsp.java │ │ ├── PacketAvatarFightPropNotify.java │ │ ├── PacketFireworkSetNotify.java │ │ ├── PacketPlayerTimeNotify.java │ │ ├── PacketAbilityChangeNotify.java │ │ ├── PacketSyncScenePlayTeamEntityNotify.java │ │ ├── PacketTowerEnterLevelRsp.java │ │ ├── PacketGadgetStateNotify.java │ │ ├── PacketDealAddFriendRsp.java │ │ ├── PacketWorldPlayerDieNotify.java │ │ ├── PacketCookDataNotify.java │ │ ├── PacketMusicGameSettleRsp.java │ │ ├── PacketSetEquipLockStateRsp.java │ │ ├── PacketPlayerGameTimeNotify.java │ │ ├── PacketAvatarFlycloakChangeNotify.java │ │ ├── PacketSetPlayerPropRsp.java │ │ ├── PacketSetUpLunchBoxWidgetRsp.java │ │ └── PacketUnlockTransPointRsp.java │ │ └── recv │ │ ├── Handler.java │ │ ├── HandlerGetRegionSearchReq.java │ │ ├── HandlerObstacleModifyNotify.java │ │ ├── HandlerEvtAiSyncSkillCdNotify.java │ │ ├── HandlerMonsterAIConfigHashNotify.java │ │ ├── HandlerAddCustomTeamReq.java │ │ ├── HandlerFurnitureMakeReq.java │ │ ├── HandlerEvtAiSyncCombatThreatInfoNotify.java │ │ ├── HandlerForgeGetQueueDataReq.java │ │ ├── HandlerGetAuthkeyReq.java │ │ ├── HandlerPlayerQuitDungeonReq.java │ │ ├── HandlerGetAllH5ActivityInfoReq.java │ │ ├── HandlerHomeSceneInitFinishReq.java │ │ ├── HandlerGetPlayerBlacklistReq.java │ │ ├── HandlerGetWorldMpInfoReq.java │ │ ├── HandlerPullRecentChatReq.java │ │ ├── HandlerGetOnlinePlayerListReq.java │ │ ├── HandlerGetShopmallDataReq.java │ │ ├── HandlerHomeGetBasicInfoReq.java │ │ ├── HandlerMarkMapReq.java │ │ ├── HandlerGetAllUnlockNameCardReq.java │ │ ├── HandlerGetPlayerHomeCompInfoReq.java │ │ ├── HandlerSetNameCardReq.java │ │ ├── HandlerGetPlayerAskFriendListReq.java │ │ ├── HandlerEnterTransPointRegionNotify.java │ │ ├── HandlerGetFurnitureCurModuleArrangeCountReq.java │ │ ├── HandlerChangeAvatarReq.java │ │ ├── HandlerPersonalLineAllDataReq.java │ │ ├── HandlerDeleteFriendReq.java │ │ ├── HandlerHomeUnknown2Req.java │ │ ├── HandlerAskAddFriendReq.java │ │ ├── HandlerDoGachaReq.java │ │ ├── HandlerGetPlayerFriendListReq.java │ │ ├── HandlerPlayerCookReq.java │ │ └── HandlerGetShopReq.java │ ├── utils │ ├── EventConsumer.java │ ├── ProtoHelper.java │ ├── MessageHandler.java │ ├── DateHelper.java │ ├── JlineLogbackAppender.java │ └── ByteHelper.java │ ├── data │ ├── GameResource.java │ ├── common │ │ ├── PropGrowCurve.java │ │ ├── CurveInfo.java │ │ ├── ScenePointConfig.java │ │ ├── ItemUseData.java │ │ ├── FightPropData.java │ │ ├── OpenCondData.java │ │ └── ItemParamStringData.java │ ├── excels │ │ ├── TriggerExcelConfigData.java │ │ ├── AvatarLevelData.java │ │ ├── WeaponLevelData.java │ │ ├── WorldLevelData.java │ │ ├── AvatarFetterLevelData.java │ │ ├── AvatarFlycloakData.java │ │ ├── MusicGameBasicData.java │ │ ├── DungeonEntryData.java │ │ ├── PlayerLevelData.java │ │ ├── FetterCharacterCardData.java │ │ ├── SceneData.java │ │ ├── PersonalLineData.java │ │ ├── ReliquaryMainPropData.java │ │ └── RewardData.java │ └── binout │ │ ├── ScenePointEntry.java │ │ ├── AbilityEmbryoEntry.java │ │ └── ScriptSceneData.java │ ├── game │ ├── dungeons │ │ ├── DungeonSettleListener.java │ │ ├── challenge │ │ │ ├── trigger │ │ │ │ ├── InTimeTrigger.java │ │ │ │ └── ChallengeTrigger.java │ │ │ └── factory │ │ │ │ └── ChallengeFactoryHandler.java │ │ ├── DungeonDrop.java │ │ └── BasicDungeonSettleListener.java │ ├── entity │ │ ├── gadget │ │ │ ├── worktop │ │ │ │ └── WorktopWorktopOptionHandler.java │ │ │ ├── chest │ │ │ │ └── ChestInteractHandler.java │ │ │ ├── GadgetObject.java │ │ │ └── GadgetContent.java │ │ └── EntityBaseGadget.java │ ├── expedition │ │ ├── ExpeditionRewardInfo.java │ │ ├── ExpeditionRewardData.java │ │ └── ExpeditionRewardDataList.java │ ├── quest │ │ ├── enums │ │ │ ├── QuestShowType.java │ │ │ ├── QuestGuideType.java │ │ │ ├── QuestType.java │ │ │ ├── ShowQuestGuideType.java │ │ │ ├── ParentQuestState.java │ │ │ └── QuestState.java │ │ ├── QuestEncryptionKey.java │ │ ├── QuestValue.java │ │ ├── handlers │ │ │ ├── QuestExecHandler.java │ │ │ └── QuestBaseHandler.java │ │ ├── QuestGroupSuite.java │ │ ├── RewindData.java │ │ ├── content │ │ │ ├── BaseContent.java │ │ │ ├── ContentEnterRoom.java │ │ │ ├── ContentLuaNotify.java │ │ │ ├── ContentInteractGadget.java │ │ │ ├── ContentEnterDungeon.java │ │ │ ├── ContentUnlockTransPoint.java │ │ │ └── ContentLeaveScene.java │ │ ├── conditions │ │ │ ├── BaseCondition.java │ │ │ ├── ConditionPlayerLevelEqualGreater.java │ │ │ └── ConditionLuaNotify.java │ │ └── exec │ │ │ ├── ExecDecQuestVar.java │ │ │ ├── ExecIncQuestVar.java │ │ │ ├── ExecSetQuestVar.java │ │ │ ├── ExecIncQuestGlobalVar.java │ │ │ ├── ExecSetQuestGlobalVar.java │ │ │ └── ExecDecQuestGlobalVar.java │ ├── inventory │ │ ├── InventoryTab.java │ │ └── ItemDef.java │ ├── managers │ │ ├── energy │ │ │ ├── EnergyDropInfo.java │ │ │ ├── SkillParticleGenerationInfo.java │ │ │ ├── EnergyDropEntry.java │ │ │ └── SkillParticleGenerationEntry.java │ │ ├── blossom │ │ │ └── BlossomConfig.java │ │ └── stamina │ │ │ ├── Consumption.java │ │ │ └── AfterUpdateStaminaListener.java │ ├── activity │ │ ├── DefaultWatcher.java │ │ ├── GameActivity.java │ │ ├── ActivityWatcherType.java │ │ ├── ActivityConfigItem.java │ │ └── DefaultActivityHandler.java │ ├── drop │ │ └── DropInfo.java │ ├── props │ │ ├── EntityIdType.java │ │ └── BattlePassMissionRefreshType.java │ ├── player │ │ ├── BasePlayerManager.java │ │ └── BasePlayerDataManager.java │ ├── world │ │ └── ChestReward.java │ ├── tower │ │ └── TowerData.java │ ├── combine │ │ └── ReliquaryDecomposeEntry.java │ ├── shop │ │ ├── ShopTable.java │ │ └── ShopChestTable.java │ └── CoopRequest.java │ ├── scripts │ ├── data │ │ ├── SceneBusiness.java │ │ ├── SceneNPC.java │ │ ├── SceneGarbage.java │ │ ├── SceneVar.java │ │ ├── SceneInitConfig.java │ │ ├── SceneMonster.java │ │ ├── SceneBossChest.java │ │ ├── SceneConfig.java │ │ ├── SceneObject.java │ │ └── SceneGadget.java │ ├── listener │ │ └── ScriptMonsterListener.java │ ├── constants │ │ └── ScriptRegionShape.java │ ├── serializer │ │ └── Serializer.java │ └── ScriptUtils.java │ ├── command │ ├── PermissionHandler.java │ └── commands │ │ └── PositionCommand.java │ ├── net │ └── packet │ │ ├── PacketHandler.java │ │ └── Opcodes.java │ ├── task │ └── TaskHandler.java │ ├── database │ └── DatabaseCounter.java │ ├── auth │ └── Authenticator.java │ └── tools │ └── Dumpers.java ├── lib ├── kcp.jar ├── bytes-1.3.0.jar └── bcrypt-0.8.0.jar ├── keystore.p12 ├── .gitattributes ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .github └── ISSUE_TEMPLATE │ ├── config.yml │ └── b_feature_request.md ├── .editorconfig ├── settings.gradle ├── proxy_config.py └── start_config.cmd /src/main/resources/webstatic/version.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 51 3 | } -------------------------------------------------------------------------------- /lib/kcp.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/lib/kcp.jar -------------------------------------------------------------------------------- /keystore.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/keystore.p12 -------------------------------------------------------------------------------- /lib/bytes-1.3.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/lib/bytes-1.3.0.jar -------------------------------------------------------------------------------- /lib/bcrypt-0.8.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/lib/bcrypt-0.8.0.jar -------------------------------------------------------------------------------- /src/main/resources/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: emu.grasscutter.Grasscutter 3 | 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.java text=auto 2 | *.json text=auto 3 | *.md text=auto 4 | *.properties text=auto 5 | *.py text=auto 6 | *.sh text=auto 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/main/resources/keys/OSCB_Pub.der: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/src/main/resources/keys/OSCB_Pub.der -------------------------------------------------------------------------------- /src/main/resources/keys/OSCN_Pub.der: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/src/main/resources/keys/OSCN_Pub.der -------------------------------------------------------------------------------- /src/main/resources/keys/SigningKey.der: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/src/main/resources/keys/SigningKey.der -------------------------------------------------------------------------------- /src/main/resources/keys/dispatchKey.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/src/main/resources/keys/dispatchKey.bin -------------------------------------------------------------------------------- /src/main/resources/keys/secretKey.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/src/main/resources/keys/secretKey.bin -------------------------------------------------------------------------------- /src/main/resources/keys/dispatchSeed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/src/main/resources/keys/dispatchSeed.bin -------------------------------------------------------------------------------- /src/main/resources/keys/auth_private-key.der: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/src/main/resources/keys/auth_private-key.der -------------------------------------------------------------------------------- /src/main/resources/keys/secretKeyBuffer.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/F4nX1ngCN/Genshin-Impact-Private-Server/HEAD/src/main/resources/keys/secretKeyBuffer.bin -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/plugin/api/Item.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.plugin.api; 2 | 3 | public enum Item { 4 | /* TODO: Use handbook to generate an Item enum. */ 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/defaults/data/TowerSchedule.json: -------------------------------------------------------------------------------- 1 | { 2 | "scheduleId" : 45, 3 | "scheduleStartTime" : "2022-06-01T00:00:00+08:00", 4 | "nextScheduleChangeTime" : "2030-06-30T00:00:00+08:00" 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/game/GameServerStopEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.game; 2 | 3 | public class GameServerStopEvent { 4 | // Placeholder class for now, probably will get used later 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/game/GameServerTickEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.game; 2 | 3 | public class GameServerTickEvent { 4 | // Placeholder class for now, probably will get used later 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/http/objects/LoginTokenRequestJson.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.http.objects; 2 | 3 | public class LoginTokenRequestJson { 4 | public String uid; 5 | public String token; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/game/GameServerStartFinishEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.game; 2 | 3 | public class GameServerStartFinishEvent { 4 | // Placeholder class for now, probably will get used later 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/http/objects/QueryCurRegionRspJson.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.http.objects; 2 | 3 | public class QueryCurRegionRspJson { 4 | public String content; 5 | public String sign; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/utils/EventConsumer.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.utils; 2 | 3 | import emu.grasscutter.server.event.Event; 4 | 5 | public interface EventConsumer { 6 | void consume(T event); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/Cancellable.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event; 2 | 3 | /** 4 | * Implementing this interface marks an event as cancellable. 5 | */ 6 | public interface Cancellable { 7 | void cancel(); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/GameResource.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data; 2 | 3 | public abstract class GameResource { 4 | 5 | public int getId() { 6 | return 0; 7 | } 8 | 9 | public void onLoad() { 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Grasscutter Discord 4 | url: https://discord.gg/T5vZU6UyeG 5 | about: If you are looking for help while using Grasscutter, please visit the Discord server. 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/dungeons/DungeonSettleListener.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.dungeons; 2 | 3 | import emu.grasscutter.game.world.Scene; 4 | 5 | public interface DungeonSettleListener { 6 | void onDungeonSettle(Scene scene); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/data/SceneBusiness.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.data; 2 | 3 | import lombok.Setter; 4 | import lombok.ToString; 5 | 6 | @ToString 7 | @Setter 8 | public class SceneBusiness { 9 | public int type; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/http/documentation/DocumentationHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.http.documentation; 2 | 3 | import io.javalin.http.Context; 4 | 5 | interface DocumentationHandler { 6 | 7 | void handle(Context ctx); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/data/SceneNPC.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.data; 2 | 3 | import lombok.Setter; 4 | import lombok.ToString; 5 | 6 | @ToString 7 | @Setter 8 | public class SceneNPC extends SceneObject{ 9 | public int npc_id; 10 | } -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/http/objects/LoginAccountRequestJson.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.http.objects; 2 | 3 | public class LoginAccountRequestJson { 4 | public String account; 5 | public String password; 6 | public boolean is_crypto; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/listener/ScriptMonsterListener.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.listener; 2 | 3 | import emu.grasscutter.game.entity.EntityMonster; 4 | 5 | public interface ScriptMonsterListener { 6 | 7 | void onNotify(EntityMonster sceneMonster); 8 | } 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | max_line_length = 120 10 | tab_width = 4 11 | trim_trailing_whitespace = true 12 | 13 | [{*.json,*.xml}] 14 | indent_size = 2 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/types/GameEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.types; 2 | 3 | import emu.grasscutter.server.event.Event; 4 | 5 | /** 6 | * An event that is related to the game. 7 | */ 8 | public abstract class GameEvent extends Event { 9 | 10 | } -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/data/SceneGarbage.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.data; 2 | 3 | import java.util.List; 4 | 5 | import lombok.Setter; 6 | import lombok.ToString; 7 | 8 | @ToString 9 | @Setter 10 | public class SceneGarbage { 11 | public List gadgets; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/data/SceneVar.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.data; 2 | 3 | import lombok.Setter; 4 | import lombok.ToString; 5 | 6 | @ToString 7 | @Setter 8 | public class SceneVar { 9 | public String name; 10 | public int value; 11 | public boolean no_refresh; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/data/SceneInitConfig.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.data; 2 | 3 | import lombok.Setter; 4 | import lombok.ToString; 5 | 6 | @ToString 7 | @Setter 8 | public class SceneInitConfig { 9 | public int suite; 10 | public int end_suite; 11 | public int rand_suite; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/data/SceneMonster.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.data; 2 | 3 | import lombok.Setter; 4 | import lombok.ToString; 5 | 6 | @ToString 7 | @Setter 8 | public class SceneMonster extends SceneObject{ 9 | public int monster_id; 10 | public int pose_id; 11 | public int drop_id; 12 | } -------------------------------------------------------------------------------- /src/main/resources/keys/auth_public-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLK2D8f2XPsubRdwDwsyojJc9U 3 | 0ClhNxJ6lPhUMsHiqqoULez8e6/y83vMD8/i6hEQi7wox6cAMWTu7CtlLGgxbAmC 4 | foDuxsC3VyoBpRcH0ng3OEvTHcAVOIcRBvDzqFG+bZUaRsDmxaevQ1nDxIYEFj4Q 5 | 4PA0i3nUZ0EDt6hRBQIDAQAB 6 | -----END PUBLIC KEY----- 7 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/entity/gadget/worktop/WorktopWorktopOptionHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.entity.gadget.worktop; 2 | 3 | import emu.grasscutter.game.entity.gadget.GadgetWorktop; 4 | public interface WorktopWorktopOptionHandler { 5 | boolean onSelectWorktopOption(GadgetWorktop gadgetWorktop,int option); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/expedition/ExpeditionRewardInfo.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.expedition; 2 | 3 | import java.util.List; 4 | 5 | import lombok.Getter; 6 | 7 | public class ExpeditionRewardInfo { 8 | @Getter private int expId; 9 | @Getter private List expeditionRewardDataList; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/Packet.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | 6 | public class Packet extends BasePacket { 7 | 8 | public Packet() { 9 | super(PacketOpcodes.NONE); 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/data/SceneBossChest.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.data; 2 | 3 | import lombok.Setter; 4 | import lombok.ToString; 5 | 6 | @Setter 7 | @ToString 8 | public class SceneBossChest { 9 | public int life_time; 10 | public int monster_config_id; 11 | public int resin; 12 | public int take_num; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/enums/QuestShowType.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.enums; 2 | 3 | public enum QuestShowType { 4 | QUEST_SHOW (0), 5 | QUEST_HIDDEN (1); 6 | 7 | private final int value; 8 | 9 | QuestShowType(int id) { 10 | this.value = id; 11 | } 12 | 13 | public int getValue() { 14 | return value; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/command/PermissionHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.command; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | 5 | public interface PermissionHandler { 6 | public boolean EnablePermissionCommand(); 7 | public boolean checkPermission(Player player, Player targetPlayer, String permissionNode, String permissionNodeTargeted); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/inventory/InventoryTab.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.inventory; 2 | 3 | public interface InventoryTab { 4 | public GameItem getItemById(int id); 5 | 6 | public void onAddItem(GameItem item); 7 | 8 | public void onRemoveItem(GameItem item); 9 | 10 | public int getSize(); 11 | 12 | public int getMaxCapacity(); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/QuestEncryptionKey.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.Data; 5 | import lombok.experimental.FieldDefaults; 6 | 7 | @Data 8 | @FieldDefaults(level = AccessLevel.PRIVATE) 9 | public class QuestEncryptionKey { 10 | int mainQuestId; 11 | long encryptionKey; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/QuestValue.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | public @interface QuestValue { 10 | QuestTrigger value(); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/constants/ScriptRegionShape.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.constants; 2 | 3 | public class ScriptRegionShape { 4 | public static final int NONE = 0; 5 | public static final int SPHERE = 1; 6 | public static final int CUBIC = 2; 7 | public static final int CYLINDER = 3; 8 | public static final int POLYGON = 4; 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/managers/energy/EnergyDropInfo.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.managers.energy; 2 | 3 | public class EnergyDropInfo { 4 | private int ballId; 5 | private int count; 6 | 7 | public int getBallId() { 8 | return this.ballId; 9 | } 10 | 11 | public int getCount() { 12 | return this.count; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/managers/energy/SkillParticleGenerationInfo.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.managers.energy; 2 | 3 | public class SkillParticleGenerationInfo { 4 | private int value; 5 | private int chance; 6 | 7 | public int getValue() { 8 | return this.value; 9 | } 10 | 11 | public int getChance() { 12 | return this.chance; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/net/packet/PacketHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.net.packet; 2 | 3 | import emu.grasscutter.server.game.GameSession; 4 | 5 | public abstract class PacketHandler { 6 | protected static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; 7 | 8 | public abstract void handle(GameSession session, byte[] header, byte[] payload) throws Exception; 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/common/PropGrowCurve.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.common; 2 | 3 | public class PropGrowCurve { 4 | private String type; 5 | private String growCurve; 6 | 7 | public String getType(){ 8 | return this.type; 9 | } 10 | 11 | public String getGrowCurve(){ 12 | return this.growCurve; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/game/BaseGameSystem.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.game; 2 | 3 | public abstract class BaseGameSystem { 4 | protected final GameServer server; 5 | 6 | public BaseGameSystem(GameServer server) { 7 | this.server = server; 8 | } 9 | 10 | public GameServer getServer() { 11 | return this.server; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/activity/DefaultWatcher.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.activity; 2 | 3 | import emu.grasscutter.game.props.WatcherTriggerType; 4 | 5 | @ActivityWatcherType(WatcherTriggerType.TRIGGER_NONE) 6 | public class DefaultWatcher extends ActivityWatcher{ 7 | @Override 8 | protected boolean isMeet(String... param) { 9 | return false; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/entity/gadget/chest/ChestInteractHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.entity.gadget.chest; 2 | 3 | import emu.grasscutter.game.entity.gadget.GadgetChest; 4 | import emu.grasscutter.game.player.Player; 5 | 6 | public interface ChestInteractHandler { 7 | 8 | boolean isTwoStep(); 9 | 10 | boolean onInteract(GadgetChest chest, Player player); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/handlers/QuestExecHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.handlers; 2 | 3 | import emu.grasscutter.data.excels.QuestData; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | 6 | public abstract class QuestExecHandler { 7 | 8 | public abstract boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketFireworkRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | 6 | public class PacketFireworkRsp extends BasePacket { 7 | 8 | public PacketFireworkRsp() { 9 | super(PacketOpcodes.FireworkRsp); 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/common/CurveInfo.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.common; 2 | 3 | public class CurveInfo { 4 | private String type; 5 | private String arith; 6 | private float value; 7 | 8 | public String getType() { 9 | return type; 10 | } 11 | public String getArith() { 12 | return arith; 13 | } 14 | public float getValue() { 15 | return value; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/enums/QuestGuideType.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.enums; 2 | 3 | public enum QuestGuideType { 4 | QUEST_GUIDE_NONE (0), 5 | QUEST_GUIDE_LOCATION (1), 6 | QUEST_GUIDE_NPC (2); 7 | 8 | private final int value; 9 | 10 | QuestGuideType(int id) { 11 | this.value = id; 12 | } 13 | 14 | public int getValue() { 15 | return value; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * This file was generated by the Gradle 'init' task. 3 | * 4 | * The settings file is used to specify which projects to include in your build. 5 | * 6 | * Detailed information about configuring a multi-project build in Gradle can be found 7 | * in the user manual at https://docs.gradle.org/5.6.3/userguide/multi_project_builds.html 8 | */ 9 | 10 | rootProject.name = 'Grasscutter' 11 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketFireworkSetRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | 6 | public class PacketFireworkSetRsp extends BasePacket { 7 | 8 | public PacketFireworkSetRsp() { 9 | super(PacketOpcodes.FireworkSetRsp); 10 | 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/enums/QuestType.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.enums; 2 | 3 | public enum QuestType { 4 | AQ (0), 5 | FQ (1), 6 | LQ (2), 7 | EQ (3), 8 | DQ (4), 9 | IQ (5), 10 | VQ (6), 11 | WQ (7); 12 | 13 | private final int value; 14 | 15 | QuestType(int id) { 16 | this.value = id; 17 | } 18 | 19 | public int getValue() { 20 | return value; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/handlers/QuestBaseHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.handlers; 2 | 3 | import emu.grasscutter.data.excels.QuestData.QuestCondition; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | 6 | public abstract class QuestBaseHandler { 7 | 8 | public abstract boolean execute(GameQuest quest, QuestCondition condition, String paramStr, int... params); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/common/ScenePointConfig.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.common; 2 | 3 | import com.google.gson.JsonObject; 4 | 5 | public class ScenePointConfig { 6 | public JsonObject points; 7 | 8 | public JsonObject getPoints() { 9 | return points; 10 | } 11 | 12 | public void setPoints(JsonObject Points) { 13 | points = Points; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/drop/DropInfo.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.drop; 2 | 3 | import java.util.List; 4 | 5 | public class DropInfo { 6 | public int getMonsterId() { 7 | return monsterId; 8 | } 9 | 10 | public List getDropDataList() { 11 | return dropDataList; 12 | } 13 | 14 | private int monsterId; 15 | private List dropDataList; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/serializer/Serializer.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.serializer; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | 7 | public interface Serializer { 8 | 9 | public List toList(Class type, Object obj); 10 | 11 | public T toObject(Class type, Object obj); 12 | 13 | public Map toMap(Class type, Object obj); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketHomeUnknown2Rsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | 6 | public class PacketHomeUnknown2Rsp extends BasePacket { 7 | 8 | public PacketHomeUnknown2Rsp() { 9 | super(PacketOpcodes.Unk2700_KIIOGMKFNNP_ServerRsp); 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/task/TaskHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.task; 2 | 3 | import org.quartz.*; 4 | 5 | @PersistJobDataAfterExecution 6 | public abstract class TaskHandler implements Job { 7 | public void restartExecute() throws JobExecutionException { 8 | execute(null); 9 | } 10 | 11 | public abstract void onEnable(); 12 | 13 | public abstract void onDisable(); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/data/SceneConfig.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.data; 2 | 3 | import emu.grasscutter.utils.Position; 4 | import lombok.Setter; 5 | import lombok.ToString; 6 | 7 | @ToString 8 | @Setter 9 | public class SceneConfig { 10 | public Position vision_anchor; 11 | public Position born_pos; 12 | public Position born_rot; 13 | public Position begin_pos; 14 | public Position size; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/http/objects/ComboTokenReqJson.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.http.objects; 2 | 3 | public class ComboTokenReqJson { 4 | public int app_id; 5 | public int channel_id; 6 | public String data; 7 | public String device; 8 | public String sign; 9 | 10 | public static class LoginTokenData { 11 | public String uid; 12 | public String token; 13 | public boolean guest; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/utils/ProtoHelper.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.utils; 2 | 3 | import emu.grasscutter.game.props.PlayerProperty; 4 | import emu.grasscutter.net.proto.PropValueOuterClass.PropValue; 5 | 6 | public final class ProtoHelper { 7 | public static PropValue newPropValue(PlayerProperty key, int value) { 8 | return PropValue.newBuilder().setType(key.getId()).setIval(value).setVal(value).build(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/enums/ShowQuestGuideType.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.enums; 2 | 3 | public enum ShowQuestGuideType { 4 | QUEST_GUIDE_ITEM_ENABLE (0), 5 | QUEST_GUIDE_ITEM_DISABLE (1), 6 | QUEST_GUIDE_ITEM_MOVE_HIDE (2); 7 | 8 | private final int value; 9 | 10 | ShowQuestGuideType(int id) { 11 | this.value = id; 12 | } 13 | 14 | public int getValue() { 15 | return value; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/player/PlayerQuitEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.player; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.server.event.types.GameEvent; 5 | import emu.grasscutter.server.event.types.PlayerEvent; 6 | 7 | public final class PlayerQuitEvent extends PlayerEvent { 8 | public PlayerQuitEvent(Player player) { 9 | super(player); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPathfindingEnterSceneRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | 6 | public class PacketPathfindingEnterSceneRsp extends BasePacket { 7 | 8 | public PacketPathfindingEnterSceneRsp(int clientSequence) { 9 | super(PacketOpcodes.PathfindingEnterSceneRsp); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/net/packet/Opcodes.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.net.packet; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | @Retention(RetentionPolicy.RUNTIME) 7 | public @interface Opcodes { 8 | /** Opcode for the packet/handler */ 9 | int value(); 10 | 11 | /** HANDLER ONLY - will disable this handler from being registered */ 12 | boolean disabled() default false; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketHomeUpdateArrangementInfoRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | 6 | public class PacketHomeUpdateArrangementInfoRsp extends BasePacket { 7 | 8 | public PacketHomeUpdateArrangementInfoRsp() { 9 | super(PacketOpcodes.HomeUpdateArrangementInfoRsp); 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/managers/energy/EnergyDropEntry.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.managers.energy; 2 | 3 | import java.util.List; 4 | 5 | public class EnergyDropEntry { 6 | private int dropId; 7 | private List dropList; 8 | 9 | public int getDropId() { 10 | return this.dropId; 11 | } 12 | 13 | public List getDropList() { 14 | return this.dropList; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/player/PlayerJoinEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.player; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.server.event.Cancellable; 5 | import emu.grasscutter.server.event.types.PlayerEvent; 6 | 7 | public final class PlayerJoinEvent extends PlayerEvent implements Cancellable { 8 | public PlayerJoinEvent(Player player) { 9 | super(player); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/props/EntityIdType.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.props; 2 | 3 | public enum EntityIdType { 4 | AVATAR (0x01), 5 | MONSTER (0x02), 6 | NPC (0x03), 7 | GADGET (0x04), 8 | REGION (0x05), 9 | WEAPON (0x06), 10 | TEAM (0x09), 11 | MPLEVEL (0x0b); 12 | 13 | private final int id; 14 | 15 | private EntityIdType(int id) { 16 | this.id = id; 17 | } 18 | 19 | public int getId() { 20 | return id; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPlayerSetPauseRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | 6 | public class PacketPlayerSetPauseRsp extends BasePacket { 7 | 8 | public PacketPlayerSetPauseRsp(int clientSequence) { 9 | super(PacketOpcodes.PlayerSetPauseRsp); 10 | 11 | this.buildHeader(clientSequence); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/enums/ParentQuestState.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.enums; 2 | 3 | public enum ParentQuestState { 4 | PARENT_QUEST_STATE_NONE (0), 5 | PARENT_QUEST_STATE_FINISHED (1), 6 | PARENT_QUEST_STATE_FAILED (2), 7 | PARENT_QUEST_STATE_CANCELED (3); 8 | 9 | private final int value; 10 | 11 | ParentQuestState(int id) { 12 | this.value = id; 13 | } 14 | 15 | public int getValue() { 16 | return value; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/HandlerPriority.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event; 2 | 3 | public enum HandlerPriority { 4 | /** 5 | * The handler will be called before every other handler. 6 | */ 7 | HIGH, 8 | 9 | /** 10 | * The handler will be called the same time as other handlers. 11 | */ 12 | NORMAL, 13 | 14 | /** 15 | * The handler will be called after every other handler. 16 | */ 17 | LOW 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/activity/GameActivity.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.activity; 2 | 3 | import emu.grasscutter.game.props.ActivityType; 4 | 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @Target(ElementType.TYPE) 12 | public @interface GameActivity { 13 | ActivityType value(); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/managers/blossom/BlossomConfig.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.managers.blossom; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | import lombok.Getter; 7 | 8 | public class BlossomConfig { 9 | @Getter private int monsterFightingVolume; 10 | // @Getter private Int2ObjectMap monsterIdsPerDifficulty; // Need to wrangle Gson for this 11 | @Getter private Map> monsterIdsPerDifficulty; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/managers/energy/SkillParticleGenerationEntry.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.managers.energy; 2 | 3 | import java.util.List; 4 | 5 | public class SkillParticleGenerationEntry { 6 | private int avatarId; 7 | private List amountList; 8 | 9 | public int getAvatarId() { 10 | return this.avatarId; 11 | } 12 | 13 | public List getAmountList() { 14 | return this.amountList; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/QuestGroupSuite.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest; 2 | 3 | import dev.morphia.annotations.Entity; 4 | import lombok.AccessLevel; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.experimental.FieldDefaults; 8 | 9 | @Entity 10 | @Data 11 | @Builder(builderMethodName = "of") 12 | @FieldDefaults(level = AccessLevel.PRIVATE) 13 | public class QuestGroupSuite { 14 | int scene; 15 | int group; 16 | int suite; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/TriggerExcelConfigData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | import lombok.Getter; 6 | 7 | @ResourceType(name = "TriggerExcelConfigData.json") @Getter 8 | public class TriggerExcelConfigData extends GameResource { 9 | @Getter private int id; 10 | private int sceneId; 11 | private int groupId; 12 | private String triggerName; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/activity/ActivityWatcherType.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.activity; 2 | 3 | import emu.grasscutter.game.props.WatcherTriggerType; 4 | 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @Target(ElementType.TYPE) 12 | public @interface ActivityWatcherType { 13 | WatcherTriggerType value(); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/data/SceneObject.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.data; 2 | 3 | import emu.grasscutter.utils.Position; 4 | import lombok.Setter; 5 | import lombok.ToString; 6 | 7 | @ToString 8 | @Setter 9 | public class SceneObject { 10 | public int level; 11 | public int config_id; 12 | public int area_id; 13 | 14 | public Position pos; 15 | public Position rot; 16 | /** 17 | * not set by lua 18 | */ 19 | public transient SceneGroup group; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/common/ItemUseData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.common; 2 | 3 | import emu.grasscutter.game.props.ItemUseOp; 4 | 5 | public class ItemUseData { 6 | private ItemUseOp useOp; 7 | private String[] useParam; 8 | 9 | public ItemUseOp getUseOp() { 10 | if (useOp == null) { 11 | useOp = ItemUseOp.ITEM_USE_NONE; 12 | } 13 | return useOp; 14 | } 15 | 16 | public String[] getUseParam() { 17 | return useParam; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/entity/EntityBaseGadget.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.entity; 2 | 3 | import emu.grasscutter.game.world.Scene; 4 | 5 | public abstract class EntityBaseGadget extends GameEntity { 6 | 7 | public EntityBaseGadget(Scene scene) { 8 | super(scene); 9 | } 10 | 11 | public abstract int getGadgetId(); 12 | 13 | @Override 14 | public void onDeath(int killerId) { 15 | super.onDeath(killerId); // Invoke super class's onDeath() method. 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/expedition/ExpeditionRewardData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.expedition; 2 | 3 | import emu.grasscutter.game.inventory.GameItem; 4 | import emu.grasscutter.utils.Utils; 5 | import lombok.Getter; 6 | 7 | public class ExpeditionRewardData { 8 | @Getter private int itemId; 9 | @Getter private int minCount; 10 | @Getter private int maxCount; 11 | 12 | public GameItem getReward() { 13 | return new GameItem(itemId, Utils.randomRange(minCount, maxCount)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/managers/stamina/Consumption.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.managers.stamina; 2 | 3 | public class Consumption { 4 | public ConsumptionType type = ConsumptionType.None; 5 | public int amount = 0; 6 | 7 | public Consumption(ConsumptionType type, int amount) { 8 | this.type = type; 9 | this.amount = amount; 10 | } 11 | 12 | public Consumption(ConsumptionType type) { 13 | this(type, type.amount); 14 | } 15 | 16 | public Consumption() { 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/utils/MessageHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.utils; 2 | 3 | public class MessageHandler { 4 | private String message; 5 | 6 | public MessageHandler(){ 7 | this.message = ""; 8 | } 9 | 10 | public void append(String message){ 11 | this.message += message + "\r\n\r\n"; 12 | } 13 | 14 | public String getMessage(){ 15 | return this.message; 16 | } 17 | 18 | public void setMessage(String message){ 19 | this.message = message; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/binout/ScenePointEntry.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.binout; 2 | 3 | import emu.grasscutter.data.common.PointData; 4 | 5 | public class ScenePointEntry { 6 | private String name; 7 | private PointData pointData; 8 | 9 | public ScenePointEntry(String name, PointData pointData) { 10 | this.name = name; 11 | this.pointData = pointData; 12 | } 13 | 14 | public String getName() { 15 | return name; 16 | } 17 | 18 | public PointData getPointData() { 19 | return pointData; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/binout/AbilityEmbryoEntry.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.binout; 2 | 3 | public class AbilityEmbryoEntry { 4 | private String name; 5 | private String[] abilities; 6 | 7 | public AbilityEmbryoEntry() { 8 | 9 | } 10 | 11 | public AbilityEmbryoEntry(String avatarName, String[] array) { 12 | this.name = avatarName; 13 | this.abilities = array; 14 | } 15 | 16 | public String getName() { 17 | return name; 18 | } 19 | 20 | public String[] getAbilities() { 21 | return abilities; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/dungeons/challenge/trigger/InTimeTrigger.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.dungeons.challenge.trigger; 2 | 3 | import emu.grasscutter.game.dungeons.challenge.WorldChallenge; 4 | 5 | public class InTimeTrigger extends ChallengeTrigger{ 6 | @Override 7 | public void onCheckTimeout(WorldChallenge challenge) { 8 | var current = System.currentTimeMillis(); 9 | if(current - challenge.getStartedAt() > challenge.getTimeLimit() * 1000L){ 10 | challenge.fail(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/Handler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | 8 | @Opcodes(PacketOpcodes.NONE) 9 | public class Handler extends PacketHandler { 10 | 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | // Auto template 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketTakeBattlePassMissionPointRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.TakeBattlePassMissionPointRspOuterClass; 6 | 7 | import java.util.List; 8 | 9 | public class PacketTakeBattlePassMissionPointRsp extends BasePacket { 10 | public PacketTakeBattlePassMissionPointRsp() { 11 | super(PacketOpcodes.TakeBattlePassMissionPointRsp); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/types/PlayerEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.types; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.server.event.Event; 5 | 6 | /** 7 | * An event that is related to player interactions. 8 | */ 9 | public abstract class PlayerEvent extends Event { 10 | protected final Player player; 11 | 12 | public PlayerEvent(Player player) { 13 | this.player = player; 14 | } 15 | 16 | public Player getPlayer() { 17 | return this.player; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPlayerChatRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.PlayerChatRspOuterClass.PlayerChatRsp; 6 | 7 | public class PacketPlayerChatRsp extends BasePacket { 8 | 9 | public PacketPlayerChatRsp() { 10 | super(PacketOpcodes.PlayerChatRsp); 11 | 12 | PlayerChatRsp proto = PlayerChatRsp.newBuilder().build(); 13 | 14 | this.setData(proto); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/database/DatabaseCounter.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.database; 2 | 3 | import dev.morphia.annotations.Entity; 4 | import dev.morphia.annotations.Id; 5 | 6 | @Entity(value = "counters", useDiscriminator = false) 7 | public class DatabaseCounter { 8 | @Id 9 | private String id; 10 | private int count; 11 | 12 | public DatabaseCounter() {} 13 | 14 | public DatabaseCounter(String id) { 15 | this.id = id; 16 | this.count = 10000; 17 | } 18 | 19 | public int getNextId() { 20 | int id = ++count; 21 | return id; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/http/objects/ComboTokenResJson.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.http.objects; 2 | 3 | public class ComboTokenResJson { 4 | public String message; 5 | public int retcode; 6 | public LoginData data = new LoginData(); 7 | 8 | public static class LoginData { 9 | public int account_type = 1; 10 | public boolean heartbeat; 11 | public String combo_id; 12 | public String combo_token; 13 | public String open_id; 14 | public String data = "{\"guest\":false}"; 15 | public String fatigue_remind = null; // ? 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/AvatarLevelData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | 6 | @ResourceType(name = "AvatarLevelExcelConfigData.json") 7 | public class AvatarLevelData extends GameResource { 8 | private int level; 9 | private int exp; 10 | 11 | @Override 12 | public int getId() { 13 | return this.level; 14 | } 15 | 16 | public int getLevel() { 17 | return level; 18 | } 19 | 20 | public int getExp() { 21 | return exp; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/props/BattlePassMissionRefreshType.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.props; 2 | 3 | public enum BattlePassMissionRefreshType { 4 | BATTLE_PASS_MISSION_REFRESH_DAILY (0), 5 | BATTLE_PASS_MISSION_REFRESH_CYCLE_CROSS_SCHEDULE (1), // Weekly 6 | BATTLE_PASS_MISSION_REFRESH_SCHEDULE (2), // Per BP 7 | BATTLE_PASS_MISSION_REFRESH_CYCLE (1); // Event? 8 | 9 | private final int value; 10 | 11 | BattlePassMissionRefreshType(int value) { 12 | this.value = value; 13 | } 14 | 15 | public int getValue() { 16 | return value; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/data/SceneGadget.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts.data; 2 | 3 | import lombok.Setter; 4 | import lombok.ToString; 5 | 6 | @ToString 7 | @Setter 8 | public class SceneGadget extends SceneObject{ 9 | public int gadget_id; 10 | public int state; 11 | public int point_type; 12 | public SceneBossChest boss_chest; 13 | public int interact_id; 14 | public boolean isOneoff; 15 | public int draft_id; 16 | 17 | public void setIsOneoff(boolean isOneoff) { 18 | this.isOneoff = isOneoff; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/dungeons/DungeonDrop.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.dungeons; 2 | 3 | import java.util.List; 4 | 5 | public class DungeonDrop { 6 | private int dungeonId; 7 | private List drops; 8 | 9 | public int getDungeonId() { 10 | return dungeonId; 11 | } 12 | public void setDungeonId(int dungeonId) { 13 | this.dungeonId = dungeonId; 14 | } 15 | 16 | public List getDrops() { 17 | return drops; 18 | } 19 | public void setDrops(List drops) { 20 | this.drops = drops; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/player/BasePlayerManager.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.player; 2 | 3 | import lombok.NonNull; 4 | 5 | public abstract class BasePlayerManager { 6 | protected transient final Player player; 7 | 8 | public BasePlayerManager(@NonNull Player player) { 9 | this.player = player; 10 | } 11 | 12 | public Player getPlayer() { 13 | return this.player; 14 | } 15 | 16 | /** 17 | * Saves the player to the database 18 | */ 19 | public void save() { 20 | getPlayer().save(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/types/EntityEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.types; 2 | 3 | import emu.grasscutter.game.entity.GameEntity; 4 | import emu.grasscutter.server.event.Event; 5 | 6 | /** 7 | * An event that is related to entity interactions. 8 | */ 9 | public abstract class EntityEvent extends Event { 10 | protected final GameEntity entity; 11 | 12 | public EntityEvent(GameEntity player) { 13 | this.entity = player; 14 | } 15 | 16 | public GameEntity getEntity() { 17 | return this.entity; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/resources/defaults/data/ActivityConfig.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "activityId" : 5072, 4 | "activityType" : 2202, 5 | "scheduleId": 5072001, 6 | "meetCondList" : [ 7 | 5072001, 8 | 5072002, 9 | 5072003, 10 | 5072004, 11 | 5072005, 12 | 5072006, 13 | 5072007, 14 | 5072008, 15 | 5072009, 16 | 5072013 17 | ], 18 | "beginTime" : "2022-05-01T00:00:00+08:00", 19 | "endTime" : "2023-05-01T00:00:00+08:00" 20 | } 21 | ] -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/inventory/ItemDef.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.inventory; 2 | 3 | public class ItemDef { 4 | private int itemId; 5 | private int count; 6 | 7 | public ItemDef(int itemId, int count) { 8 | this.itemId = itemId; 9 | this.count = count; 10 | } 11 | 12 | public int getItemId() { 13 | return itemId; 14 | } 15 | 16 | public void setItemId(int itemId) { 17 | this.itemId = itemId; 18 | } 19 | 20 | public int getCount() { 21 | return count; 22 | } 23 | 24 | public void setCount(int count) { 25 | this.count = count; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/activity/ActivityConfigItem.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.activity; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.Data; 5 | import lombok.experimental.FieldDefaults; 6 | 7 | import java.util.Date; 8 | import java.util.List; 9 | 10 | @Data 11 | @FieldDefaults(level = AccessLevel.PRIVATE) 12 | public class ActivityConfigItem { 13 | int activityId; 14 | int activityType; 15 | int scheduleId; 16 | List meetCondList; 17 | Date beginTime; 18 | Date endTime; 19 | 20 | transient ActivityHandler activityHandler; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/world/ChestReward.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.world; 2 | 3 | import emu.grasscutter.game.inventory.ItemDef; 4 | import lombok.AccessLevel; 5 | import lombok.Data; 6 | import lombok.experimental.FieldDefaults; 7 | 8 | import java.util.List; 9 | 10 | @Data 11 | @FieldDefaults(level = AccessLevel.PRIVATE) 12 | public class ChestReward { 13 | List objNames; 14 | int advExp; 15 | int resin; 16 | int mora; 17 | int sigil; 18 | List content; 19 | int randomCount; 20 | List randomContent; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/internal/ServerStopEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.internal; 2 | 3 | import emu.grasscutter.server.event.types.ServerEvent; 4 | 5 | import java.time.OffsetDateTime; 6 | 7 | public final class ServerStopEvent extends ServerEvent { 8 | private final OffsetDateTime stopTime; 9 | 10 | public ServerStopEvent(Type type, OffsetDateTime stopTime) { 11 | super(type); 12 | 13 | this.stopTime = stopTime; 14 | } 15 | 16 | public OffsetDateTime getStopTime() { 17 | return this.stopTime; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketGetGachaInfoRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.gacha.GachaSystem; 4 | import emu.grasscutter.game.player.Player; 5 | import emu.grasscutter.net.packet.BasePacket; 6 | import emu.grasscutter.net.packet.PacketOpcodes; 7 | 8 | public class PacketGetGachaInfoRsp extends BasePacket { 9 | 10 | public PacketGetGachaInfoRsp(GachaSystem manager, Player player) { 11 | super(PacketOpcodes.GetGachaInfoRsp); 12 | 13 | this.setData(manager.toProto(player)); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPingRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.PingRspOuterClass.PingRsp; 6 | 7 | public class PacketPingRsp extends BasePacket { 8 | 9 | public PacketPingRsp(int clientSeq, int time) { 10 | super(PacketOpcodes.PingRsp, clientSeq); 11 | 12 | PingRsp p = PingRsp.newBuilder() 13 | .setClientTime(time) 14 | .build(); 15 | 16 | this.setData(p.toByteArray()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/common/FightPropData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.common; 2 | 3 | import emu.grasscutter.game.props.FightProperty; 4 | 5 | public class FightPropData { 6 | private String propType; 7 | private FightProperty prop; 8 | private float value; 9 | 10 | public String getPropType() { 11 | return propType; 12 | } 13 | 14 | public float getValue() { 15 | return value; 16 | } 17 | 18 | public FightProperty getProp() { 19 | return prop; 20 | } 21 | 22 | public void onLoad() { 23 | this.prop = FightProperty.getPropByName(propType); 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/managers/stamina/AfterUpdateStaminaListener.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.managers.stamina; 2 | 3 | public interface AfterUpdateStaminaListener { 4 | /** 5 | * onBeforeUpdateStamina() will be called before StaminaManager attempt to update the player's current stamina. 6 | * This gives listeners a chance to intercept this update. 7 | * 8 | * @param reason Why updating stamina. 9 | * @param newStamina New Stamina value. 10 | */ 11 | void onAfterUpdateStamina(String reason, int newStamina, boolean isCharacterStamina); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/WeaponLevelData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | 6 | @ResourceType(name = "WeaponLevelExcelConfigData.json") 7 | public class WeaponLevelData extends GameResource { 8 | private int level; 9 | private int[] requiredExps; 10 | 11 | @Override 12 | public int getId() { 13 | return this.level; 14 | } 15 | 16 | public int getLevel() { 17 | return level; 18 | } 19 | 20 | public int[] getRequiredExps() { 21 | return requiredExps; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/WorldLevelData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | 6 | @ResourceType(name = "WorldLevelExcelConfigData.json") 7 | public class WorldLevelData extends GameResource { 8 | private int level; 9 | private int monsterLevel; 10 | 11 | @Override 12 | public int getId() { 13 | return this.level; 14 | } 15 | 16 | public int getMonsterLevel() { 17 | return monsterLevel; 18 | } 19 | 20 | @Override 21 | public void onLoad() { 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/dungeons/BasicDungeonSettleListener.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.dungeons; 2 | 3 | import emu.grasscutter.game.world.Scene; 4 | import emu.grasscutter.server.packet.send.PacketDungeonSettleNotify; 5 | import emu.grasscutter.utils.Utils; 6 | 7 | public class BasicDungeonSettleListener implements DungeonSettleListener { 8 | 9 | @Override 10 | public void onDungeonSettle(Scene scene) { 11 | scene.setAutoCloseTime(Utils.getCurrentSeconds() + 1000); 12 | scene.broadcastPacket(new PacketDungeonSettleNotify(scene.getChallenge())); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/types/ServerEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.types; 2 | 3 | import emu.grasscutter.server.event.Event; 4 | 5 | /** 6 | * An event that is related to the internals of the server. 7 | */ 8 | public abstract class ServerEvent extends Event { 9 | protected final Type type; 10 | 11 | public ServerEvent(Type type) { 12 | this.type = type; 13 | } 14 | 15 | public Type getServerType() { 16 | return this.type; 17 | } 18 | 19 | public enum Type { 20 | DISPATCH, 21 | GAME 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetRegionSearchReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | 8 | @Opcodes(PacketOpcodes.GetRegionSearchReq) 9 | public class HandlerGetRegionSearchReq extends PacketHandler { 10 | 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | // Auto template 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/tower/TowerData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.tower; 2 | 3 | import java.util.Map; 4 | 5 | import dev.morphia.annotations.Entity; 6 | import dev.morphia.annotations.Transient; 7 | 8 | @Entity 9 | public class TowerData{ 10 | /** 11 | * the floor players chose 12 | */ 13 | int currentFloorId; 14 | int currentLevel; 15 | @Transient 16 | int currentLevelId; 17 | 18 | /** 19 | * floorId - Record 20 | */ 21 | Map recordMap; 22 | 23 | @Transient 24 | int entryScene; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerObstacleModifyNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | 8 | @Opcodes(PacketOpcodes.ObstacleModifyNotify) 9 | public class HandlerObstacleModifyNotify extends PacketHandler { 10 | 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | // Auto template 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketTowerTeamSelectRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.TowerTeamSelectRspOuterClass.TowerTeamSelectRsp; 6 | 7 | public class PacketTowerTeamSelectRsp extends BasePacket { 8 | 9 | public PacketTowerTeamSelectRsp() { 10 | super(PacketOpcodes.TowerTeamSelectRsp); 11 | 12 | TowerTeamSelectRsp proto = TowerTeamSelectRsp.newBuilder() 13 | .build(); 14 | 15 | this.setData(proto); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /proxy_config.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | # This can also be replaced with another IP address. 4 | USE_SSL = True 5 | REMOTE_HOST = "localhost" 6 | REMOTE_PORT = 443 7 | 8 | if os.getenv('MITM_REMOTE_HOST') != None: 9 | REMOTE_HOST = os.getenv('MITM_REMOTE_HOST') 10 | if os.getenv('MITM_REMOTE_PORT') != None: 11 | REMOTE_PORT = int(os.getenv('MITM_REMOTE_PORT')) 12 | if os.getenv('MITM_USE_SSL') != None: 13 | USE_SSL = bool(os.getenv('MITM_USE_SSL')) 14 | 15 | print('MITM Remote Host: ' + REMOTE_HOST) 16 | print('MITM Remote Port: ' + str(REMOTE_PORT)) 17 | print('MITM Use SSL ' + str(USE_SSL)) 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/AvatarFetterLevelData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | 6 | @ResourceType(name = "AvatarFettersLevelExcelConfigData.json") 7 | public class AvatarFetterLevelData extends GameResource { 8 | private int fetterLevel; 9 | private int needExp; 10 | 11 | @Override 12 | public int getId() { 13 | return this.fetterLevel; 14 | } 15 | 16 | public int getLevel() { 17 | return fetterLevel; 18 | } 19 | 20 | public int getExp() { 21 | return needExp; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/combine/ReliquaryDecomposeEntry.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.combine; 2 | 3 | import java.util.List; 4 | 5 | public class ReliquaryDecomposeEntry { 6 | private int configId; 7 | private List items; 8 | 9 | public int getConfigId() { 10 | return configId; 11 | } 12 | public void setConfigId(int configId) { 13 | this.configId = configId; 14 | } 15 | 16 | public List getItems() { 17 | return items; 18 | } 19 | public void setItems(List items) { 20 | this.items = items; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/internal/ServerStartEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.internal; 2 | 3 | import emu.grasscutter.server.event.types.ServerEvent; 4 | 5 | import java.time.OffsetDateTime; 6 | 7 | public final class ServerStartEvent extends ServerEvent { 8 | private final OffsetDateTime startTime; 9 | 10 | public ServerStartEvent(Type type, OffsetDateTime startTime) { 11 | super(type); 12 | 13 | this.startTime = startTime; 14 | } 15 | 16 | public OffsetDateTime getStartTime() { 17 | return this.startTime; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerEvtAiSyncSkillCdNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | 8 | @Opcodes(PacketOpcodes.EvtAiSyncSkillCdNotify) 9 | public class HandlerEvtAiSyncSkillCdNotify extends PacketHandler { 10 | 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | // Auto template 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketH5ActivityIdsNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.H5ActivityIdsNotifyOuterClass.H5ActivityIdsNotify; 6 | 7 | public class PacketH5ActivityIdsNotify extends BasePacket { 8 | 9 | public PacketH5ActivityIdsNotify() { 10 | super(PacketOpcodes.H5ActivityIdsNotify); 11 | 12 | H5ActivityIdsNotify proto = H5ActivityIdsNotify.newBuilder() 13 | .build(); 14 | 15 | this.setData(proto); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/AvatarFlycloakData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | 6 | @ResourceType(name = "AvatarFlycloakExcelConfigData.json") 7 | public class AvatarFlycloakData extends GameResource { 8 | private int flycloakId; 9 | private long nameTextMapHash; 10 | 11 | @Override 12 | public int getId() { 13 | return this.flycloakId; 14 | } 15 | 16 | public long getNameTextMapHash() { 17 | return nameTextMapHash; 18 | } 19 | 20 | @Override 21 | public void onLoad() { 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/activity/DefaultActivityHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.activity; 2 | 3 | import emu.grasscutter.game.props.ActivityType; 4 | import emu.grasscutter.net.proto.ActivityInfoOuterClass; 5 | 6 | @GameActivity(ActivityType.NONE) 7 | public class DefaultActivityHandler extends ActivityHandler{ 8 | @Override 9 | public void onProtoBuild(PlayerActivityData playerActivityData, ActivityInfoOuterClass.ActivityInfo.Builder activityInfo) { 10 | 11 | } 12 | 13 | @Override 14 | public void onInitPlayerActivityData(PlayerActivityData playerActivityData) { 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerMonsterAIConfigHashNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | 8 | @Opcodes(PacketOpcodes.MonsterAIConfigHashNotify) 9 | public class HandlerMonsterAIConfigHashNotify extends PacketHandler { 10 | 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | // Auto template 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/enums/QuestState.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.enums; 2 | 3 | public enum QuestState { 4 | QUEST_STATE_NONE (0), 5 | QUEST_STATE_UNSTARTED (1), 6 | QUEST_STATE_UNFINISHED (2), 7 | QUEST_STATE_FINISHED (3), 8 | QUEST_STATE_FAILED (4), 9 | 10 | // Used by lua 11 | NONE (0), 12 | UNSTARTED(1), 13 | UNFINISHED(2), 14 | FINISHED(3), 15 | FAILED(4); 16 | 17 | private final int value; 18 | 19 | QuestState(int id) { 20 | this.value = id; 21 | } 22 | 23 | public int getValue() { 24 | return value; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketDeleteFriendRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.DeleteFriendRspOuterClass.DeleteFriendRsp; 6 | 7 | public class PacketDeleteFriendRsp extends BasePacket { 8 | 9 | public PacketDeleteFriendRsp(int targetUid) { 10 | super(PacketOpcodes.DeleteFriendRsp); 11 | 12 | DeleteFriendRsp proto = DeleteFriendRsp.newBuilder() 13 | .setTargetUid(targetUid) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSetNameCardRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.SetNameCardRspOuterClass.SetNameCardRsp; 6 | 7 | public class PacketSetNameCardRsp extends BasePacket { 8 | 9 | public PacketSetNameCardRsp(int nameCardId) { 10 | super(PacketOpcodes.SetNameCardRsp); 11 | 12 | SetNameCardRsp proto = SetNameCardRsp.newBuilder() 13 | .setNameCardId(nameCardId) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/shop/ShopTable.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.shop; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class ShopTable { 7 | private int shopId; 8 | private List items = new ArrayList<>(); 9 | 10 | public int getShopId() { 11 | return shopId; 12 | } 13 | 14 | public void setShopId(int shopId) { 15 | this.shopId = shopId; 16 | } 17 | 18 | public List getItems() { 19 | return items; 20 | } 21 | 22 | public void setItems(List items) { 23 | this.items = items; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAskAddFriendRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.AskAddFriendRspOuterClass.AskAddFriendRsp; 6 | 7 | public class PacketAskAddFriendRsp extends BasePacket { 8 | 9 | public PacketAskAddFriendRsp(int targetUid) { 10 | super(PacketOpcodes.AskAddFriendRsp); 11 | 12 | AskAddFriendRsp proto = AskAddFriendRsp.newBuilder() 13 | .setTargetUid(targetUid) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPlayerCookArgsRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.PlayerCookArgsRspOuterClass.PlayerCookArgsRsp; 6 | 7 | public class PacketPlayerCookArgsRsp extends BasePacket { 8 | 9 | public PacketPlayerCookArgsRsp() { 10 | super(PacketOpcodes.PlayerCookArgsRsp); 11 | 12 | PlayerCookArgsRsp proto = PlayerCookArgsRsp.newBuilder() 13 | .build(); 14 | 15 | this.setData(proto); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/resources/defaults/data/Announcement.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "templateId" : 1, 4 | "type" : "CENTER", 5 | "frequency" : 1, 6 | "content": "Welcome to Grasscutter PS!", 7 | "beginTime": "2022-06-01T00:00:00+08:00", 8 | "endTime": "2022-06-01T00:08:00+08:00", 9 | "tick" : false, 10 | "interval": 1 11 | }, 12 | { 13 | "templateId" : 2, 14 | "type" : "COUNTDOWN", 15 | "frequency" : 1, 16 | "content": "Welcome to Grasscutter PS!", 17 | "beginTime": "2022-06-01T00:00:00+08:00", 18 | "endTime": "2022-06-01T00:08:00+08:00", 19 | "tick" : false, 20 | "interval": 1 21 | } 22 | ] 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/MusicGameBasicData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | import lombok.AccessLevel; 6 | import lombok.Getter; 7 | import lombok.experimental.FieldDefaults; 8 | 9 | @ResourceType(name = "MusicGameBasicConfigData.json") 10 | @Getter 11 | @FieldDefaults(level = AccessLevel.PRIVATE) 12 | public class MusicGameBasicData extends GameResource { 13 | int id; 14 | int musicID; 15 | int musicLevel; 16 | 17 | @Override 18 | public int getId() { 19 | return this.id; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/player/BasePlayerDataManager.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.player; 2 | 3 | import lombok.NonNull; 4 | 5 | public abstract class BasePlayerDataManager { 6 | protected transient Player player; 7 | 8 | public BasePlayerDataManager() {} 9 | 10 | public BasePlayerDataManager(@NonNull Player player) { 11 | this.player = player; 12 | } 13 | 14 | public Player getPlayer() { 15 | return this.player; 16 | } 17 | 18 | public void setPlayer(Player player) { 19 | if (this.player == null) { 20 | this.player = player; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerAddCustomTeamReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | 8 | @Opcodes(PacketOpcodes.AddCustomTeamReq) 9 | public class HandlerAddCustomTeamReq extends PacketHandler { 10 | @Override 11 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 12 | session.getPlayer().getTeamManager().addNewCustomTeam(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerFurnitureMakeReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.server.game.GameSession; 7 | 8 | @Opcodes(PacketOpcodes.FurnitureMakeReq) 9 | public class HandlerFurnitureMakeReq extends PacketHandler { 10 | 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | session.getPlayer().getFurnitureManager().queryStatus(); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerEvtAiSyncCombatThreatInfoNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | 8 | @Opcodes(PacketOpcodes.EvtAiSyncCombatThreatInfoNotify) 9 | public class HandlerEvtAiSyncCombatThreatInfoNotify extends PacketHandler { 10 | 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | // Auto template 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketHomeSceneJumpRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.HomeSceneJumpRspOuterClass; 6 | 7 | public class PacketHomeSceneJumpRsp extends BasePacket { 8 | 9 | public PacketHomeSceneJumpRsp(boolean enterRoomScene) { 10 | super(PacketOpcodes.HomeSceneJumpRsp); 11 | 12 | var proto = HomeSceneJumpRspOuterClass.HomeSceneJumpRsp.newBuilder(); 13 | 14 | proto.setIsEnterRoomScene(enterRoomScene); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketServerTimeNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.ServerTimeNotifyOuterClass.ServerTimeNotify; 6 | 7 | public class PacketServerTimeNotify extends BasePacket { 8 | 9 | public PacketServerTimeNotify() { 10 | super(PacketOpcodes.ServerTimeNotify); 11 | 12 | ServerTimeNotify proto = ServerTimeNotify.newBuilder() 13 | .setServerTime(System.currentTimeMillis()) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerForgeGetQueueDataReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | 8 | @Opcodes(PacketOpcodes.ForgeGetQueueDataReq) 9 | public class HandlerForgeGetQueueDataReq extends PacketHandler { 10 | @Override 11 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 12 | session.getPlayer().getForgingManager().handleForgeGetQueueDataReq(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketEvtEntityRenderersChangedNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.EvtEntityRenderersChangedNotifyOuterClass; 6 | 7 | public class PacketEvtEntityRenderersChangedNotify extends BasePacket { 8 | 9 | public PacketEvtEntityRenderersChangedNotify(EvtEntityRenderersChangedNotifyOuterClass.EvtEntityRenderersChangedNotify req) { 10 | super(PacketOpcodes.EvtEntityRenderersChangedNotify, true); 11 | 12 | this.setData(req); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/common/OpenCondData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.common; 2 | 3 | import java.util.List; 4 | 5 | public class OpenCondData { 6 | private String condType; 7 | private List paramList; 8 | 9 | public String getCondType() { 10 | return condType; 11 | } 12 | 13 | public void setCondType(String condType) { 14 | condType = condType; 15 | } 16 | 17 | public List getParamList() { 18 | return paramList; 19 | } 20 | 21 | public void setParamList(List paramList) { 22 | paramList = paramList; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/DungeonEntryData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | @ResourceType(name = "DungeonEntryExcelConfigData.json") 9 | @Getter 10 | @Setter 11 | public class DungeonEntryData extends GameResource { 12 | private int dungeonEntryId; 13 | private int sceneId; 14 | private int id; 15 | 16 | @Override 17 | public int getId() { 18 | return this.id; 19 | } 20 | 21 | @Override 22 | public void onLoad() { 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/dungeons/challenge/factory/ChallengeFactoryHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.dungeons.challenge.factory; 2 | 3 | import emu.grasscutter.game.dungeons.challenge.WorldChallenge; 4 | import emu.grasscutter.game.world.Scene; 5 | import emu.grasscutter.scripts.data.SceneGroup; 6 | 7 | public interface ChallengeFactoryHandler { 8 | boolean isThisType(int challengeIndex, int challengeId, int param3, int param4, int param5, int param6, Scene scene, SceneGroup group); 9 | WorldChallenge build(int challengeIndex, int challengeId, int param3, int param4, int param5, int param6, Scene scene, SceneGroup group); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/game/ServerTickEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.game; 2 | 3 | import emu.grasscutter.server.event.types.ServerEvent; 4 | import java.time.Instant; 5 | 6 | public final class ServerTickEvent extends ServerEvent { 7 | private final Instant start, end; 8 | 9 | public ServerTickEvent(Instant start, Instant end) { 10 | super(Type.GAME); 11 | 12 | this.start = start; 13 | this.end = end; 14 | } 15 | 16 | public Instant getTickStart() { 17 | return this.start; 18 | } 19 | 20 | public Instant getTickEnd() { 21 | return this.end; 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketDeleteFriendNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.DeleteFriendNotifyOuterClass.DeleteFriendNotify; 6 | 7 | public class PacketDeleteFriendNotify extends BasePacket { 8 | 9 | public PacketDeleteFriendNotify(int targetUid) { 10 | super(PacketOpcodes.DeleteFriendNotify); 11 | 12 | DeleteFriendNotify proto = DeleteFriendNotify.newBuilder() 13 | .setTargetUid(targetUid) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/PlayerLevelData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | import lombok.Getter; 6 | 7 | @ResourceType(name = "PlayerLevelExcelConfigData.json") 8 | @Getter 9 | public class PlayerLevelData extends GameResource { 10 | private int level; 11 | private int exp; 12 | private int rewardId; 13 | private int expeditionLimitAdd = 0; 14 | private int unlockWorldLevel; 15 | private long unlockDescTextMapHash; 16 | 17 | @Override 18 | public int getId() { 19 | return this.level; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketWearEquipRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.WearEquipRspOuterClass.WearEquipRsp; 6 | 7 | public class PacketWearEquipRsp extends BasePacket { 8 | 9 | public PacketWearEquipRsp(long avatarGuid, long equipGuid) { 10 | super(PacketOpcodes.WearEquipRsp); 11 | 12 | WearEquipRsp proto = WearEquipRsp.newBuilder() 13 | .setAvatarGuid(avatarGuid) 14 | .setEquipGuid(equipGuid) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/dispatch/QueryCurrentRegionEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.dispatch; 2 | 3 | import emu.grasscutter.server.event.types.ServerEvent; 4 | 5 | public final class QueryCurrentRegionEvent extends ServerEvent { 6 | private String regionInfo; 7 | 8 | public QueryCurrentRegionEvent(String regionInfo) { 9 | super(Type.DISPATCH); 10 | 11 | this.regionInfo = regionInfo; 12 | } 13 | 14 | public void setRegionInfo(String regionInfo) { 15 | this.regionInfo = regionInfo; 16 | } 17 | 18 | public String getRegionInfo() { 19 | return this.regionInfo; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/binout/ScriptSceneData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.binout; 2 | 3 | import com.google.gson.annotations.SerializedName; 4 | import emu.grasscutter.scripts.data.SceneGroup; 5 | import emu.grasscutter.utils.Position; 6 | import lombok.Data; 7 | 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | @Data 12 | public class ScriptSceneData { 13 | Map scriptObjectList; 14 | 15 | @Data 16 | public static class ScriptObject { 17 | //private SceneGroup groups; 18 | @SerializedName("dummy_points") 19 | private Map> dummyPoints; 20 | 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketTakeoffEquipRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.TakeoffEquipRspOuterClass.TakeoffEquipRsp; 6 | 7 | public class PacketTakeoffEquipRsp extends BasePacket { 8 | 9 | public PacketTakeoffEquipRsp(long avatarGuid, int slot) { 10 | super(PacketOpcodes.TakeoffEquipRsp); 11 | 12 | TakeoffEquipRsp proto = TakeoffEquipRsp.newBuilder() 13 | .setAvatarGuid(avatarGuid) 14 | .setSlot(slot) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketUnlockNameCardNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.UnlockNameCardNotifyOuterClass.UnlockNameCardNotify; 6 | 7 | public class PacketUnlockNameCardNotify extends BasePacket { 8 | 9 | public PacketUnlockNameCardNotify(int nameCard) { 10 | super(PacketOpcodes.UnlockNameCardNotify); 11 | 12 | UnlockNameCardNotify proto = UnlockNameCardNotify.newBuilder() 13 | .setNameCardId(nameCard) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketWidgetGadgetAllDataNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.WidgetGadgetAllDataNotifyOuterClass.WidgetGadgetAllDataNotify; 6 | 7 | public class PacketWidgetGadgetAllDataNotify extends BasePacket { 8 | 9 | public PacketWidgetGadgetAllDataNotify() { 10 | super(PacketOpcodes.AllWidgetDataNotify); 11 | 12 | WidgetGadgetAllDataNotify proto = WidgetGadgetAllDataNotify.newBuilder().build(); 13 | 14 | this.setData(proto); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/dispatch/QueryAllRegionsEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.dispatch; 2 | 3 | import emu.grasscutter.server.event.types.ServerEvent; 4 | 5 | public final class QueryAllRegionsEvent extends ServerEvent { 6 | private String regionList; 7 | 8 | public QueryAllRegionsEvent(String regionList) { 9 | super(Type.DISPATCH); 10 | 11 | this.regionList = regionList; 12 | } 13 | 14 | public void setRegionList(String regionList) { 15 | this.regionList = regionList; 16 | } 17 | 18 | public String getRegionList() { 19 | return this.regionList; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketGetAuthkeyRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.GetAuthkeyRspOuterClass.GetAuthkeyRsp; 6 | import emu.grasscutter.net.proto.RetcodeOuterClass; 7 | 8 | public class PacketGetAuthkeyRsp extends BasePacket { 9 | 10 | public PacketGetAuthkeyRsp() { 11 | super(PacketOpcodes.GetAuthkeyRsp); 12 | 13 | GetAuthkeyRsp proto = GetAuthkeyRsp.newBuilder().setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE).build(); 14 | 15 | this.setData(proto); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetAuthkeyReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketGetAuthkeyRsp; 8 | 9 | @Opcodes(PacketOpcodes.GetAuthkeyReq) 10 | public class HandlerGetAuthkeyReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | session.send(new PacketGetAuthkeyRsp()); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketBuyBattlePassLevelRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.BuyBattlePassLevelRspOuterClass.BuyBattlePassLevelRsp; 6 | 7 | public class PacketBuyBattlePassLevelRsp extends BasePacket { 8 | 9 | public PacketBuyBattlePassLevelRsp(int buyLevel) { 10 | super(PacketOpcodes.BuyBattlePassLevelRsp); 11 | 12 | BuyBattlePassLevelRsp proto = BuyBattlePassLevelRsp.newBuilder() 13 | .setBuyLevel(buyLevel) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketChooseCurAvatarTeamRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.ChooseCurAvatarTeamRspOuterClass.ChooseCurAvatarTeamRsp; 6 | 7 | public class PacketChooseCurAvatarTeamRsp extends BasePacket { 8 | 9 | public PacketChooseCurAvatarTeamRsp(int teamId) { 10 | super(PacketOpcodes.ChooseCurAvatarTeamRsp); 11 | 12 | ChooseCurAvatarTeamRsp proto = ChooseCurAvatarTeamRsp.newBuilder() 13 | .setCurTeamId(teamId) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketHomeChangeEditModeRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.HomeChangeEditModeRspOuterClass; 6 | 7 | public class PacketHomeChangeEditModeRsp extends BasePacket { 8 | 9 | public PacketHomeChangeEditModeRsp(boolean enterEditMode) { 10 | super(PacketOpcodes.HomeChangeEditModeRsp); 11 | 12 | var proto = HomeChangeEditModeRspOuterClass.HomeChangeEditModeRsp.newBuilder(); 13 | 14 | proto.setIsEnterEditMode(enterEditMode); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPlayerApplyEnterMpRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.PlayerApplyEnterMpRspOuterClass.PlayerApplyEnterMpRsp; 6 | 7 | public class PacketPlayerApplyEnterMpRsp extends BasePacket { 8 | 9 | public PacketPlayerApplyEnterMpRsp(int targetUid) { 10 | super(PacketOpcodes.PlayerApplyEnterMpRsp); 11 | 12 | PlayerApplyEnterMpRsp proto = PlayerApplyEnterMpRsp.newBuilder() 13 | .setTargetUid(targetUid) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketCombineDataNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.CombineDataNotifyOuterClass.CombineDataNotify; 6 | 7 | public class PacketCombineDataNotify extends BasePacket { 8 | 9 | public PacketCombineDataNotify(Iterable unlockedCombines) { 10 | super(PacketOpcodes.CombineDataNotify); 11 | 12 | CombineDataNotify proto = CombineDataNotify.newBuilder() 13 | .addAllCombineIdList(unlockedCombines) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/utils/DateHelper.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.utils; 2 | 3 | import java.util.Calendar; 4 | import java.util.Date; 5 | 6 | public final class DateHelper { 7 | public static Date onlyYearMonthDay(Date now) { 8 | Calendar calendar = Calendar.getInstance(); 9 | calendar.setTime(now); 10 | calendar.set(Calendar.HOUR_OF_DAY, 0); 11 | calendar.set(Calendar.MINUTE, 0); 12 | calendar.set(Calendar.SECOND, 0); 13 | calendar.set(Calendar.MILLISECOND, 0); 14 | return calendar.getTime(); 15 | } 16 | 17 | public static int getUnixTime(Date localDateTime){ 18 | return (int)(localDateTime.getTime() / 1000L); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerPlayerQuitDungeonReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | 8 | @Opcodes(PacketOpcodes.PlayerQuitDungeonReq) 9 | public class HandlerPlayerQuitDungeonReq extends PacketHandler { 10 | 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | session.getPlayer().getServer().getDungeonSystem().exitDungeon(session.getPlayer()); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAvatarPromoteRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.avatar.Avatar; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.AvatarPromoteRspOuterClass.AvatarPromoteRsp; 7 | 8 | public class PacketAvatarPromoteRsp extends BasePacket { 9 | 10 | public PacketAvatarPromoteRsp(Avatar avatar) { 11 | super(PacketOpcodes.AvatarPromoteRsp); 12 | 13 | AvatarPromoteRsp proto = AvatarPromoteRsp.newBuilder() 14 | .setGuid(avatar.getGuid()) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketChangeTeamNameRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.ChangeTeamNameRspOuterClass.ChangeTeamNameRsp; 6 | 7 | public class PacketChangeTeamNameRsp extends BasePacket { 8 | 9 | public PacketChangeTeamNameRsp(int teamId, String teamName) { 10 | super(PacketOpcodes.ChangeTeamNameRsp); 11 | 12 | ChangeTeamNameRsp proto = ChangeTeamNameRsp.newBuilder() 13 | .setTeamId(teamId) 14 | .setTeamName(teamName) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketHomeSceneInitFinishRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.HomeSceneArrangementInfoOuterClass; 6 | import emu.grasscutter.net.proto.HomeSceneInitFinishReqOuterClass; 7 | 8 | public class PacketHomeSceneInitFinishRsp extends BasePacket { 9 | 10 | public PacketHomeSceneInitFinishRsp() { 11 | super(PacketOpcodes.HomeSceneInitFinishRsp); 12 | 13 | var proto = HomeSceneInitFinishReqOuterClass.HomeSceneInitFinishReq.newBuilder(); 14 | 15 | this.setData(proto); 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSceneEntityDrownRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.SceneEntityDrownRspOuterClass.SceneEntityDrownRsp; 6 | 7 | public class PacketSceneEntityDrownRsp extends BasePacket { 8 | 9 | public PacketSceneEntityDrownRsp(int entityId) { 10 | super(PacketOpcodes.SceneEntityDrownRsp); 11 | 12 | SceneEntityDrownRsp proto = SceneEntityDrownRsp.newBuilder().setEntityId(entityId).build(); 13 | 14 | this.setData(proto); 15 | } 16 | } 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/RewindData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest; 2 | 3 | import lombok.Data; 4 | import lombok.Getter; 5 | 6 | import java.util.List; 7 | @Data 8 | public class RewindData { 9 | AvatarData avatar; 10 | List npcs; 11 | 12 | @Data 13 | public static class AvatarData { 14 | @Getter private String pos; 15 | } 16 | 17 | @Data 18 | private static class Npc { 19 | private String script; 20 | private int room_id; 21 | private int data_index; 22 | private int id; 23 | private String pos; 24 | private int scene_id; 25 | private String alias; 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/plugin/PluginConfig.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.plugin; 2 | 3 | /** 4 | * The data contained in the plugin's `plugin.json` file. 5 | */ 6 | public final class PluginConfig { 7 | public String name, description, version; 8 | public String mainClass; 9 | public String[] authors; 10 | public String[] loadAfter; 11 | 12 | /** 13 | * Attempts to validate this config instance. 14 | * @return True if the config is valid, false otherwise. 15 | */ 16 | @SuppressWarnings("BooleanMethodIsAlwaysInverted") 17 | public boolean validate() { 18 | return name != null && description != null && mainClass != null; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAvatarGainCostumeNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.AvatarGainCostumeNotifyOuterClass.AvatarGainCostumeNotify; 6 | 7 | public class PacketAvatarGainCostumeNotify extends BasePacket { 8 | 9 | public PacketAvatarGainCostumeNotify(int costumeId) { 10 | super(PacketOpcodes.AvatarGainCostumeNotify); 11 | 12 | AvatarGainCostumeNotify proto = AvatarGainCostumeNotify.newBuilder() 13 | .setCostumeId(costumeId) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSetBattlePassViewedRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.SetBattlePassViewedRspOuterClass.SetBattlePassViewedRsp; 6 | 7 | public class PacketSetBattlePassViewedRsp extends BasePacket { 8 | 9 | public PacketSetBattlePassViewedRsp(int scheduleId) { 10 | super(PacketOpcodes.SetBattlePassViewedRsp); 11 | 12 | SetBattlePassViewedRsp proto = SetBattlePassViewedRsp.newBuilder() 13 | .setScheduleId(scheduleId) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketGroupUnloadNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.GroupUnloadNotifyOuterClass; 6 | 7 | import java.util.List; 8 | 9 | public class PacketGroupUnloadNotify extends BasePacket { 10 | 11 | public PacketGroupUnloadNotify(List groupList) { 12 | super(PacketOpcodes.GroupUnloadNotify); 13 | 14 | var proto = GroupUnloadNotifyOuterClass.GroupUnloadNotify.newBuilder(); 15 | 16 | proto.addAllGroupList(groupList); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSetPlayerNameRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.SetPlayerNameRspOuterClass.SetPlayerNameRsp; 7 | 8 | public class PacketSetPlayerNameRsp extends BasePacket { 9 | 10 | public PacketSetPlayerNameRsp(Player player) { 11 | super(PacketOpcodes.SetPlayerNameRsp); 12 | 13 | SetPlayerNameRsp proto = SetPlayerNameRsp.newBuilder() 14 | .setNickName(player.getNickname()) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAvatarGainFlycloakNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.AvatarGainFlycloakNotifyOuterClass.AvatarGainFlycloakNotify; 6 | 7 | public class PacketAvatarGainFlycloakNotify extends BasePacket { 8 | 9 | public PacketAvatarGainFlycloakNotify(int flycloak) { 10 | super(PacketOpcodes.AvatarGainFlycloakNotify); 11 | 12 | AvatarGainFlycloakNotify proto = AvatarGainFlycloakNotify.newBuilder() 13 | .setFlycloakId(flycloak) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketGetWorldMpInfoRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.world.World; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.GetWorldMpInfoRspOuterClass.GetWorldMpInfoRsp; 7 | 8 | public class PacketGetWorldMpInfoRsp extends BasePacket { 9 | 10 | public PacketGetWorldMpInfoRsp(World world) { 11 | super(PacketOpcodes.GetWorldMpInfoRsp); 12 | 13 | GetWorldMpInfoRsp proto = GetWorldMpInfoRsp.newBuilder() 14 | .setIsInMpMode(world.isMultiplayer()) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketHomeUnknown1Notify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.HomeUnknown1NotifyOuterClass; 6 | 7 | public class PacketHomeUnknown1Notify extends BasePacket { 8 | 9 | public PacketHomeUnknown1Notify(boolean isEnterEditMode) { 10 | super(PacketOpcodes.Unk2700_JDMPECKFGIG_ServerNotify); 11 | 12 | var proto = HomeUnknown1NotifyOuterClass.HomeUnknown1Notify.newBuilder(); 13 | 14 | proto.setIsEnterEditMode(isEnterEditMode); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/content/BaseContent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.content; 2 | 3 | import emu.grasscutter.game.quest.QuestValue; 4 | import emu.grasscutter.data.excels.QuestData.QuestCondition; 5 | import emu.grasscutter.game.quest.GameQuest; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestBaseHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_CONTENT_NONE) 10 | public class BaseContent extends QuestBaseHandler { 11 | 12 | @Override 13 | public boolean execute(GameQuest quest, QuestCondition condition, String paramStr, int... params) { 14 | // TODO Auto-generated method stub 15 | return false; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketDungeonShowReminderNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.DungeonShowReminderNotifyOuterClass; 6 | 7 | public class PacketDungeonShowReminderNotify extends BasePacket { 8 | 9 | public PacketDungeonShowReminderNotify(int reminderId) { 10 | super(PacketOpcodes.DungeonShowReminderNotify); 11 | 12 | var proto = DungeonShowReminderNotifyOuterClass.DungeonShowReminderNotify.newBuilder(); 13 | 14 | proto.setReminderId(reminderId); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketEnterSceneDoneRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.EnterSceneDoneRspOuterClass.EnterSceneDoneRsp; 7 | 8 | public class PacketEnterSceneDoneRsp extends BasePacket { 9 | 10 | public PacketEnterSceneDoneRsp(Player player) { 11 | super(PacketOpcodes.EnterSceneDoneRsp); 12 | 13 | EnterSceneDoneRsp p = EnterSceneDoneRsp.newBuilder() 14 | .setEnterSceneToken(player.getEnterSceneToken()) 15 | .build(); 16 | 17 | this.setData(p); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketForgeFormulaDataNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.ForgeFormulaDataNotifyOuterClass.ForgeFormulaDataNotify; 6 | 7 | public class PacketForgeFormulaDataNotify extends BasePacket { 8 | 9 | public PacketForgeFormulaDataNotify(int itemId) { 10 | super(PacketOpcodes.ForgeFormulaDataNotify); 11 | 12 | ForgeFormulaDataNotify proto = ForgeFormulaDataNotify.newBuilder() 13 | .setForgeId(itemId) 14 | .setIsLocked(false) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketMusicGameStartRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.MusicGameStartRspOuterClass; 6 | 7 | public class PacketMusicGameStartRsp extends BasePacket { 8 | 9 | public PacketMusicGameStartRsp(int musicBasicId, long musicShareId) { 10 | super(PacketOpcodes.MusicGameStartRsp); 11 | 12 | var proto = MusicGameStartRspOuterClass.MusicGameStartRsp.newBuilder(); 13 | 14 | proto.setMusicBasicId(musicBasicId) 15 | .setMusicShareId(musicShareId); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPostEnterSceneRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.PostEnterSceneRspOuterClass.PostEnterSceneRsp; 7 | 8 | public class PacketPostEnterSceneRsp extends BasePacket { 9 | 10 | public PacketPostEnterSceneRsp(Player player) { 11 | super(PacketOpcodes.PostEnterSceneRsp); 12 | 13 | PostEnterSceneRsp p = PostEnterSceneRsp.newBuilder() 14 | .setEnterSceneToken(player.getEnterSceneToken()) 15 | .build(); 16 | 17 | this.setData(p); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketServerAnnounceRevokeNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.ServerAnnounceRevokeNotifyOuterClass; 6 | 7 | public class PacketServerAnnounceRevokeNotify extends BasePacket { 8 | 9 | public PacketServerAnnounceRevokeNotify(int tplId) { 10 | super(PacketOpcodes.ServerAnnounceRevokeNotify); 11 | 12 | var proto = ServerAnnounceRevokeNotifyOuterClass.ServerAnnounceRevokeNotify.newBuilder(); 13 | 14 | proto.addConfigIdList(tplId); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/content/ContentEnterRoom.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.content; 2 | 3 | import emu.grasscutter.data.excels.QuestData.QuestCondition; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | import emu.grasscutter.game.quest.QuestValue; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestBaseHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_CONTENT_ENTER_ROOM) 10 | public class ContentEnterRoom extends QuestBaseHandler { 11 | 12 | @Override 13 | public boolean execute(GameQuest quest, QuestCondition condition, String paramStr, int... params) { 14 | return condition.getParam()[0] == params[0]; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSceneTimeNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.SceneTimeNotifyOuterClass.SceneTimeNotify; 7 | 8 | public class PacketSceneTimeNotify extends BasePacket { 9 | 10 | public PacketSceneTimeNotify(Player player) { 11 | super(PacketOpcodes.SceneTimeNotify); 12 | 13 | SceneTimeNotify proto = SceneTimeNotify.newBuilder() 14 | .setSceneId(player.getSceneId()) 15 | .setSceneTime(0) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketWorldPlayerReviveRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.game.world.World; 5 | import emu.grasscutter.net.packet.BasePacket; 6 | import emu.grasscutter.net.packet.PacketOpcodes; 7 | import emu.grasscutter.net.proto.WorldPlayerReviveRspOuterClass.WorldPlayerReviveRsp; 8 | 9 | public class PacketWorldPlayerReviveRsp extends BasePacket { 10 | 11 | public PacketWorldPlayerReviveRsp() { 12 | super(PacketOpcodes.WorldPlayerReviveRsp); 13 | 14 | WorldPlayerReviveRsp.Builder proto = WorldPlayerReviveRsp.newBuilder(); 15 | 16 | this.setData(proto.build()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/utils/JlineLogbackAppender.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.utils; 2 | 3 | import ch.qos.logback.classic.spi.ILoggingEvent; 4 | import ch.qos.logback.core.ConsoleAppender; 5 | import emu.grasscutter.Grasscutter; 6 | import org.jline.reader.LineReader; 7 | 8 | import java.util.Arrays; 9 | 10 | public class JlineLogbackAppender extends ConsoleAppender { 11 | @Override 12 | protected void append(ILoggingEvent eventObject) { 13 | if (!started) { 14 | return; 15 | } 16 | Arrays.stream( 17 | new String(encoder.encode(eventObject)).split("\n\r") 18 | ).forEach(Grasscutter.getConsole()::printAbove); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/expedition/ExpeditionRewardDataList.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.expedition; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import emu.grasscutter.game.inventory.GameItem; 7 | import lombok.Getter; 8 | 9 | public class ExpeditionRewardDataList { 10 | @Getter private int hourTime; 11 | @Getter private List expeditionRewardData; 12 | 13 | public List getRewards() { 14 | List rewards = new ArrayList<>(); 15 | if (expeditionRewardData != null) { 16 | expeditionRewardData.forEach(data -> rewards.add(data.getReward())); 17 | } 18 | return rewards; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/conditions/BaseCondition.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.conditions; 2 | 3 | import emu.grasscutter.game.quest.QuestValue; 4 | import emu.grasscutter.data.excels.QuestData.QuestCondition; 5 | import emu.grasscutter.game.quest.GameQuest; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestBaseHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_CONTENT_NONE) 10 | public class BaseCondition extends QuestBaseHandler { 11 | 12 | @Override 13 | public boolean execute(GameQuest quest, QuestCondition condition, String paramStr, int... params) { 14 | // TODO Auto-generated method stub 15 | return false; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/content/ContentLuaNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.content; 2 | 3 | import emu.grasscutter.data.excels.QuestData.QuestCondition; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | import emu.grasscutter.game.quest.QuestValue; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestBaseHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_CONTENT_LUA_NOTIFY) 10 | public class ContentLuaNotify extends QuestBaseHandler { 11 | 12 | @Override 13 | public boolean execute(GameQuest quest, QuestCondition condition, String paramStr, int... params) { 14 | return condition.getParamStr().equals(paramStr); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSceneInitFinishRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.SceneInitFinishRspOuterClass.SceneInitFinishRsp; 7 | 8 | public class PacketSceneInitFinishRsp extends BasePacket { 9 | 10 | public PacketSceneInitFinishRsp(Player player) { 11 | super(PacketOpcodes.SceneInitFinishRsp, 11); 12 | 13 | SceneInitFinishRsp p = SceneInitFinishRsp.newBuilder().setEnterSceneToken(player.getEnterSceneToken()).build(); 14 | 15 | this.setData(p.toByteArray()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetAllH5ActivityInfoReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketH5ActivityIdsNotify; 8 | 9 | @Opcodes(PacketOpcodes.GetAllH5ActivityInfoReq) 10 | public class HandlerGetAllH5ActivityInfoReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | session.send(new PacketH5ActivityIdsNotify()); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerHomeSceneInitFinishReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketHomeSceneInitFinishRsp; 8 | 9 | @Opcodes(PacketOpcodes.HomeSceneInitFinishReq) 10 | public class HandlerHomeSceneInitFinishReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | session.send(new PacketHomeSceneInitFinishRsp()); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAddQuestContentProgressRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.AddQuestContentProgressRspOuterClass; 6 | 7 | public class PacketAddQuestContentProgressRsp extends BasePacket { 8 | 9 | public PacketAddQuestContentProgressRsp(int contentType) { 10 | super(PacketOpcodes.AddQuestContentProgressRsp); 11 | 12 | var proto = AddQuestContentProgressRspOuterClass.AddQuestContentProgressRsp.newBuilder(); 13 | 14 | proto.setContentType(contentType); 15 | 16 | this.setData(proto); 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterDungeonRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.PlayerEnterDungeonRspOuterClass.PlayerEnterDungeonRsp; 6 | 7 | public class PacketPlayerEnterDungeonRsp extends BasePacket { 8 | 9 | public PacketPlayerEnterDungeonRsp(int pointId, int dungeonId) { 10 | super(PacketOpcodes.PlayerEnterDungeonRsp); 11 | 12 | PlayerEnterDungeonRsp proto = PlayerEnterDungeonRsp.newBuilder() 13 | .setPointId(pointId) 14 | .setDungeonId(dungeonId) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSetWidgetSlotRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.SetWidgetSlotRspOuterClass; 6 | 7 | public class PacketSetWidgetSlotRsp extends BasePacket { 8 | 9 | public PacketSetWidgetSlotRsp(int materialId) { 10 | super(PacketOpcodes.SetWidgetSlotRsp); 11 | 12 | SetWidgetSlotRspOuterClass.SetWidgetSlotRsp proto = SetWidgetSlotRspOuterClass.SetWidgetSlotRsp.newBuilder() 13 | .setMaterialId(materialId) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/FetterCharacterCardData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | import emu.grasscutter.data.ResourceType.LoadPriority; 6 | 7 | @ResourceType(name = "FetterCharacterCardExcelConfigData.json", loadPriority = LoadPriority.HIGHEST) 8 | public class FetterCharacterCardData extends GameResource { 9 | private int avatarId; 10 | private int rewardId; 11 | 12 | @Override 13 | public int getId() { 14 | return avatarId; 15 | } 16 | 17 | public int getRewardId() { 18 | return rewardId; 19 | } 20 | 21 | @Override 22 | public void onLoad() { 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/content/ContentInteractGadget.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.content; 2 | 3 | import emu.grasscutter.data.excels.QuestData.QuestCondition; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | import emu.grasscutter.game.quest.QuestValue; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestBaseHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_CONTENT_INTERACT_GADGET) 10 | public class ContentInteractGadget extends QuestBaseHandler { 11 | 12 | @Override 13 | public boolean execute(GameQuest quest, QuestCondition condition, String paramStr, int... params) { 14 | return params[0] == condition.getParam()[0]; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerBlacklistReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.Opcodes; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.packet.PacketHandler; 7 | import emu.grasscutter.server.game.GameSession; 8 | 9 | @Opcodes(PacketOpcodes.GetPlayerBlacklistReq) 10 | public class HandlerGetPlayerBlacklistReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | session.send(new BasePacket(PacketOpcodes.GetPlayerBlacklistRsp).buildHeader(3)); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetWorldMpInfoReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketGetWorldMpInfoRsp; 8 | 9 | @Opcodes(PacketOpcodes.GetWorldMpInfoReq) 10 | public class HandlerGetWorldMpInfoReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | session.send(new PacketGetWorldMpInfoRsp(session.getPlayer().getWorld())); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPlayerGetForceQuitBanInfoRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.PlayerGetForceQuitBanInfoRspOuterClass.PlayerGetForceQuitBanInfoRsp; 6 | 7 | public class PacketPlayerGetForceQuitBanInfoRsp extends BasePacket { 8 | 9 | public PacketPlayerGetForceQuitBanInfoRsp(int retcode) { 10 | super(PacketOpcodes.PlayerGetForceQuitBanInfoRsp); 11 | 12 | PlayerGetForceQuitBanInfoRsp proto = PlayerGetForceQuitBanInfoRsp.newBuilder() 13 | .setRetcode(retcode) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketVehicleStaminaNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.VehicleStaminaNotifyOuterClass.VehicleStaminaNotify; 6 | 7 | public class PacketVehicleStaminaNotify extends BasePacket { 8 | 9 | public PacketVehicleStaminaNotify(int vehicleId, float newStamina) { 10 | super(PacketOpcodes.VehicleStaminaNotify); 11 | VehicleStaminaNotify.Builder proto = VehicleStaminaNotify.newBuilder(); 12 | 13 | proto.setEntityId(vehicleId); 14 | proto.setCurStamina(newStamina); 15 | 16 | this.setData(proto.build()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/auth/Authenticator.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.auth; 2 | 3 | import emu.grasscutter.server.http.objects.*; 4 | 5 | /** 6 | * Handles username/password authentication from the client. 7 | * @param The response object type. Should be {@link LoginResultJson} or {@link ComboTokenResJson} 8 | */ 9 | public interface Authenticator { 10 | 11 | /** 12 | * Attempt to authenticate the client with the provided credentials. 13 | * @param request The authentication request wrapped in a {@link AuthenticationSystem.AuthenticationRequest} object. 14 | * @return The result of the login in an object. 15 | */ 16 | T authenticate(AuthenticationSystem.AuthenticationRequest request); 17 | } -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketChangeAvatarRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.ChangeAvatarRspOuterClass.ChangeAvatarRsp; 6 | import emu.grasscutter.net.proto.RetcodeOuterClass; 7 | 8 | public class PacketChangeAvatarRsp extends BasePacket { 9 | 10 | public PacketChangeAvatarRsp(long guid) { 11 | super(PacketOpcodes.ChangeAvatarRsp); 12 | 13 | ChangeAvatarRsp p = ChangeAvatarRsp.newBuilder() 14 | .setRetcode(RetcodeOuterClass.Retcode.RET_SUCC_VALUE) 15 | .setCurGuid(guid) 16 | .build(); 17 | 18 | this.setData(p); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketCombineFormulaDataNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.CombineFormulaDataNotifyOuterClass.CombineFormulaDataNotify; 6 | 7 | public class PacketCombineFormulaDataNotify extends BasePacket { 8 | 9 | public PacketCombineFormulaDataNotify(int combineId) { 10 | super(PacketOpcodes.CombineFormulaDataNotify); 11 | 12 | CombineFormulaDataNotify proto = CombineFormulaDataNotify.newBuilder() 13 | .setCombineId(combineId) 14 | .setIsLocked(false) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerPullRecentChatReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketPullRecentChatRsp; 8 | 9 | @Opcodes(PacketOpcodes.PullRecentChatReq) 10 | public class HandlerPullRecentChatReq extends PacketHandler { 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | session.getServer().getChatSystem().handlePullRecentChatReq(session.getPlayer()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAvatarAddNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.avatar.Avatar; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.AvatarAddNotifyOuterClass.AvatarAddNotify; 7 | 8 | public class PacketAvatarAddNotify extends BasePacket { 9 | 10 | public PacketAvatarAddNotify(Avatar avatar, boolean addedToTeam) { 11 | super(PacketOpcodes.AvatarAddNotify); 12 | 13 | AvatarAddNotify proto = AvatarAddNotify.newBuilder() 14 | .setAvatar(avatar.toProto()) 15 | .setIsInTeam(addedToTeam) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAvatarDieAnimationEndRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.AvatarDieAnimationEndRspOuterClass.AvatarDieAnimationEndRsp; 6 | 7 | public class PacketAvatarDieAnimationEndRsp extends BasePacket { 8 | 9 | public PacketAvatarDieAnimationEndRsp(long dieGuid, int skillId) { 10 | super(PacketOpcodes.AvatarDieAnimationEndRsp); 11 | 12 | AvatarDieAnimationEndRsp proto = AvatarDieAnimationEndRsp.newBuilder() 13 | .setDieGuid(dieGuid) 14 | .setSkillId(skillId) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketEnterSceneReadyRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.EnterSceneReadyRspOuterClass.EnterSceneReadyRsp; 7 | 8 | public class PacketEnterSceneReadyRsp extends BasePacket { 9 | 10 | public PacketEnterSceneReadyRsp(Player player) { 11 | super(PacketOpcodes.EnterSceneReadyRsp, 11); 12 | 13 | EnterSceneReadyRsp p = EnterSceneReadyRsp.newBuilder() 14 | .setEnterSceneToken(player.getEnterSceneToken()) 15 | .build(); 16 | 17 | this.setData(p.toByteArray()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSelectWorktopOptionRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.SelectWorktopOptionRspOuterClass.SelectWorktopOptionRsp; 6 | 7 | public class PacketSelectWorktopOptionRsp extends BasePacket { 8 | 9 | public PacketSelectWorktopOptionRsp(int entityId, int optionId) { 10 | super(PacketOpcodes.SelectWorktopOptionRsp); 11 | 12 | SelectWorktopOptionRsp proto = SelectWorktopOptionRsp.newBuilder() 13 | .setGadgetEntityId(entityId) 14 | .setOptionId(optionId) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSetPlayerSignatureRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.SetPlayerSignatureRspOuterClass.SetPlayerSignatureRsp; 7 | 8 | public class PacketSetPlayerSignatureRsp extends BasePacket { 9 | 10 | public PacketSetPlayerSignatureRsp(Player player) { 11 | super(PacketOpcodes.SetPlayerSignatureRsp); 12 | 13 | SetPlayerSignatureRsp proto = SetPlayerSignatureRsp.newBuilder() 14 | .setSignature(player.getSignature()) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetOnlinePlayerListReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketGetOnlinePlayerListRsp; 8 | 9 | @Opcodes(PacketOpcodes.GetOnlinePlayerListReq) 10 | public class HandlerGetOnlinePlayerListReq extends PacketHandler { 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | session.send(new PacketGetOnlinePlayerListRsp(session.getPlayer())); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetShopmallDataReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketGetShopmallDataRsp; 8 | 9 | @Opcodes(PacketOpcodes.GetShopmallDataReq) 10 | public class HandlerGetShopmallDataReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | // TODO add the correct shops 15 | session.send(new PacketGetShopmallDataRsp()); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerHomeGetBasicInfoReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketHomeBasicInfoNotify; 8 | 9 | @Opcodes(PacketOpcodes.HomeGetBasicInfoReq) 10 | public class HandlerHomeGetBasicInfoReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | 15 | session.send(new PacketHomeBasicInfoNotify(session.getPlayer(), false)); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerMarkMapReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.MarkMapReqOuterClass.MarkMapReq; 7 | import emu.grasscutter.server.game.GameSession; 8 | 9 | @Opcodes(PacketOpcodes.MarkMapReq) 10 | public class HandlerMarkMapReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | MarkMapReq req = MarkMapReq.parseFrom(payload); 15 | session.getPlayer().getMapMarksManager().handleMapMarkReq(req); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketBlossomBriefInfoNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.BlossomBriefInfoNotifyOuterClass; 6 | import emu.grasscutter.net.proto.BlossomBriefInfoOuterClass; 7 | 8 | public class PacketBlossomBriefInfoNotify extends BasePacket { 9 | public PacketBlossomBriefInfoNotify(Iterable blossoms) { 10 | super(PacketOpcodes.BlossomBriefInfoNotify); 11 | this.setData(BlossomBriefInfoNotifyOuterClass.BlossomBriefInfoNotify.newBuilder().addAllBriefInfoList(blossoms)); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/common/ItemParamStringData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.common; 2 | 3 | public class ItemParamStringData { 4 | private int id; 5 | private String count; 6 | 7 | public ItemParamStringData() {} 8 | 9 | public int getId() { 10 | return id; 11 | } 12 | 13 | public String getCount() { 14 | return count; 15 | } 16 | 17 | public ItemParamData toItemParamData() { 18 | if (count.contains(";")) { 19 | String[] split = count.split(";"); 20 | count = count.split(";")[split.length - 1]; 21 | } else if (count.contains(".")) { 22 | return new ItemParamData(id, (int) Math.ceil(Double.parseDouble(count))); 23 | } 24 | return new ItemParamData(id, Integer.parseInt(count)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetAllUnlockNameCardReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketGetAllUnlockNameCardRsp; 8 | 9 | @Opcodes(PacketOpcodes.GetAllUnlockNameCardReq) 10 | public class HandlerGetAllUnlockNameCardReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | session.send(new PacketGetAllUnlockNameCardRsp(session.getPlayer())); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketCanUseSkillNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.CanUseSkillNotifyOuterClass; 6 | 7 | public class PacketCanUseSkillNotify extends BasePacket { 8 | 9 | public PacketCanUseSkillNotify(boolean canUseSkill) { 10 | super(PacketOpcodes.CanUseSkillNotify); 11 | 12 | CanUseSkillNotifyOuterClass.CanUseSkillNotify proto = CanUseSkillNotifyOuterClass.CanUseSkillNotify.newBuilder() 13 | .setIsCanUseSkill(canUseSkill) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketHostPlayerNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.world.World; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.HostPlayerNotifyOuterClass.HostPlayerNotify; 7 | 8 | public class PacketHostPlayerNotify extends BasePacket { 9 | 10 | public PacketHostPlayerNotify(World world) { 11 | super(PacketOpcodes.HostPlayerNotify); 12 | 13 | HostPlayerNotify proto = HostPlayerNotify.newBuilder() 14 | .setHostUid(world.getHost().getUid()) 15 | .setHostPeerId(world.getHost().getPeerId()) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketNpcTalkRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp; 6 | 7 | public class PacketNpcTalkRsp extends BasePacket { 8 | public PacketNpcTalkRsp(int npcEntityId, int curTalkId, int entityId) { 9 | super(PacketOpcodes.NpcTalkRsp); 10 | 11 | NpcTalkRsp p = NpcTalkRsp.newBuilder() 12 | .setNpcEntityId(npcEntityId) 13 | .setCurTalkId(curTalkId) 14 | .setEntityId(entityId) 15 | .build(); 16 | 17 | this.setData(p); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/tools/Dumpers.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.tools; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | import emu.grasscutter.net.proto.GetGachaInfoRspOuterClass.GetGachaInfoRsp; 8 | import emu.grasscutter.net.proto.GetShopRspOuterClass.GetShopRsp; 9 | 10 | public final class Dumpers { 11 | public static void extractBanner(byte[] data) throws Exception { 12 | GetGachaInfoRsp proto = GetGachaInfoRsp.parseFrom(data); 13 | System.out.println(proto); 14 | } 15 | 16 | public static void extractShop(byte[] data) throws Exception { 17 | GetShopRsp proto = GetShopRsp.parseFrom(data); 18 | System.out.println(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerHomeCompInfoReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketPlayerHomeCompInfoNotify; 8 | 9 | @Opcodes(PacketOpcodes.GetPlayerHomeCompInfoReq) 10 | public class HandlerGetPlayerHomeCompInfoReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | session.send(new PacketPlayerHomeCompInfoNotify(session.getPlayer())); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/content/ContentEnterDungeon.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.content; 2 | 3 | import emu.grasscutter.game.quest.QuestValue; 4 | import emu.grasscutter.data.excels.QuestData.QuestCondition; 5 | import emu.grasscutter.game.quest.GameQuest; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestBaseHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_CONTENT_ENTER_DUNGEON) 10 | public class ContentEnterDungeon extends QuestBaseHandler { 11 | 12 | @Override 13 | public boolean execute(GameQuest quest, QuestCondition condition, String paramStr, int... params) { 14 | return condition.getParam()[0] == params[0]; //missing params[1] 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketActivityInfoNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.ActivityInfoNotifyOuterClass; 6 | import emu.grasscutter.net.proto.ActivityInfoOuterClass; 7 | 8 | public class PacketActivityInfoNotify extends BasePacket { 9 | 10 | public PacketActivityInfoNotify(ActivityInfoOuterClass.ActivityInfo activityInfo) { 11 | super(PacketOpcodes.ActivityInfoNotify); 12 | 13 | var proto = ActivityInfoNotifyOuterClass.ActivityInfoNotify.newBuilder(); 14 | 15 | proto.setActivityInfo(activityInfo); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketFireworkNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.FireWorkNotifyOuterClass; 6 | import emu.grasscutter.net.proto.FireWorkDataOuterClass; 7 | 8 | public class PacketFireworkNotify extends BasePacket { 9 | 10 | public PacketFireworkNotify(FireWorkDataOuterClass.FireWorkData pinfo) { 11 | super(PacketOpcodes.FireworkNotify); 12 | 13 | var proto 14 | = FireWorkNotifyOuterClass.FireWorkNotify.newBuilder(); 15 | 16 | proto.addFireWorkData(pinfo); 17 | 18 | setData(proto.build()); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketGetShopmallDataRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.GetShopmallDataRspOuterClass.GetShopmallDataRsp; 6 | 7 | import java.util.List; 8 | 9 | public class PacketGetShopmallDataRsp extends BasePacket { 10 | 11 | public PacketGetShopmallDataRsp() { 12 | super(PacketOpcodes.GetShopmallDataRsp); 13 | 14 | List shop_malls = List.of(900, 1052, 902, 1001, 903); 15 | 16 | GetShopmallDataRsp proto = GetShopmallDataRsp.newBuilder() 17 | .addAllShopTypeList(shop_malls) 18 | .build(); 19 | 20 | this.setData(proto); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketMcoinExchangeHcoinRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.McoinExchangeHcoinRspOuterClass; 6 | 7 | public class PacketMcoinExchangeHcoinRsp extends BasePacket { 8 | 9 | public PacketMcoinExchangeHcoinRsp(int retCode) { 10 | super(PacketOpcodes.McoinExchangeHcoinRsp); 11 | 12 | McoinExchangeHcoinRspOuterClass.McoinExchangeHcoinRsp proto = McoinExchangeHcoinRspOuterClass.McoinExchangeHcoinRsp.newBuilder() 13 | .setRetcode(retCode) 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerSetNameCardReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.SetNameCardReqOuterClass.SetNameCardReq; 6 | import emu.grasscutter.net.packet.PacketHandler; 7 | import emu.grasscutter.server.game.GameSession; 8 | 9 | @Opcodes(PacketOpcodes.SetNameCardReq) 10 | public class HandlerSetNameCardReq extends PacketHandler { 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | SetNameCardReq req = SetNameCardReq.parseFrom(payload); 14 | 15 | session.getPlayer().setNameCard(req.getNameCardId()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketChangeGameTimeRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.game.world.World; 5 | import emu.grasscutter.net.packet.BasePacket; 6 | import emu.grasscutter.net.packet.PacketOpcodes; 7 | import emu.grasscutter.net.proto.ChangeGameTimeRspOuterClass.ChangeGameTimeRsp; 8 | 9 | public class PacketChangeGameTimeRsp extends BasePacket { 10 | 11 | public PacketChangeGameTimeRsp(Player player) { 12 | super(PacketOpcodes.ChangeGameTimeRsp); 13 | 14 | ChangeGameTimeRsp proto = ChangeGameTimeRsp.newBuilder() 15 | .setCurGameTime(player.getScene().getTime()) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketGetAllUnlockNameCardRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.GetAllUnlockNameCardRspOuterClass.GetAllUnlockNameCardRsp; 7 | 8 | public class PacketGetAllUnlockNameCardRsp extends BasePacket { 9 | 10 | public PacketGetAllUnlockNameCardRsp(Player player) { 11 | super(PacketOpcodes.GetAllUnlockNameCardRsp); 12 | 13 | GetAllUnlockNameCardRsp proto = GetAllUnlockNameCardRsp.newBuilder() 14 | .addAllNameCardList(player.getNameCardList()) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPersonalSceneJumpRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.PersonalSceneJumpRspOuterClass.PersonalSceneJumpRsp; 6 | import emu.grasscutter.utils.Position; 7 | 8 | public class PacketPersonalSceneJumpRsp extends BasePacket { 9 | 10 | public PacketPersonalSceneJumpRsp(int sceneId, Position pos) { 11 | super(PacketOpcodes.PersonalSceneJumpRsp); 12 | 13 | PersonalSceneJumpRsp proto = PersonalSceneJumpRsp.newBuilder() 14 | .setDestSceneId(sceneId) 15 | .setDestPos(pos.toProto()) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/conditions/ConditionPlayerLevelEqualGreater.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.conditions; 2 | 3 | import emu.grasscutter.game.quest.QuestValue; 4 | import emu.grasscutter.data.excels.QuestData.QuestCondition; 5 | import emu.grasscutter.game.quest.GameQuest; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestBaseHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_COND_PLAYER_LEVEL_EQUAL_GREATER) 10 | public class ConditionPlayerLevelEqualGreater extends QuestBaseHandler { 11 | 12 | @Override 13 | public boolean execute(GameQuest quest, QuestCondition condition, String paramStr, int... params) { 14 | return quest.getOwner().getLevel() >= params[0]; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/exec/ExecDecQuestVar.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.exec; 2 | 3 | import emu.grasscutter.data.excels.QuestData; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | import emu.grasscutter.game.quest.QuestValue; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestExecHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_EXEC_DEC_QUEST_VAR) 10 | public class ExecDecQuestVar extends QuestExecHandler { 11 | @Override 12 | public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) { 13 | quest.getMainQuest().decQuestVar(Integer.parseInt(paramStr[0]), Integer.parseInt(paramStr[1])); 14 | return true; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/exec/ExecIncQuestVar.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.exec; 2 | 3 | import emu.grasscutter.data.excels.QuestData; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | import emu.grasscutter.game.quest.QuestValue; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestExecHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_EXEC_INC_QUEST_VAR) 10 | public class ExecIncQuestVar extends QuestExecHandler { 11 | @Override 12 | public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) { 13 | quest.getMainQuest().incQuestVar(Integer.parseInt(paramStr[0]), Integer.parseInt(paramStr[1])); 14 | return true; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/exec/ExecSetQuestVar.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.exec; 2 | 3 | import emu.grasscutter.data.excels.QuestData; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | import emu.grasscutter.game.quest.QuestValue; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestExecHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_EXEC_SET_QUEST_VAR) 10 | public class ExecSetQuestVar extends QuestExecHandler { 11 | @Override 12 | public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) { 13 | quest.getMainQuest().setQuestVar(Integer.parseInt(paramStr[0]), Integer.parseInt(paramStr[1])); 14 | return true; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/shop/ShopChestTable.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.shop; 2 | 3 | import emu.grasscutter.data.common.ItemParamData; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public class ShopChestTable { 9 | private int itemId; 10 | private List containsItem = new ArrayList<>(); 11 | 12 | public int getItemId() { 13 | return itemId; 14 | } 15 | 16 | public void setItemId(int itemId) { 17 | this.itemId = itemId; 18 | } 19 | 20 | public List getContainsItem() { 21 | return containsItem; 22 | } 23 | 24 | public void setContainsItem(List containsItem) { 25 | this.containsItem = containsItem; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketUnlockPersonalLineRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.UnlockPersonalLineRspOuterClass; 6 | 7 | public class PacketUnlockPersonalLineRsp extends BasePacket { 8 | 9 | public PacketUnlockPersonalLineRsp(int id, int level, int chapterId) { 10 | super(PacketOpcodes.UnlockPersonalLineRsp); 11 | 12 | var proto = UnlockPersonalLineRspOuterClass.UnlockPersonalLineRsp.newBuilder(); 13 | 14 | proto.setPersonalLineId(id) 15 | .setLevel(level) 16 | .setChapterId(chapterId); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/SceneData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameData; 4 | import emu.grasscutter.data.GameResource; 5 | import emu.grasscutter.data.ResourceType; 6 | 7 | import emu.grasscutter.game.props.SceneType; 8 | 9 | @ResourceType(name = "SceneExcelConfigData.json") 10 | public class SceneData extends GameResource { 11 | private int id; 12 | private SceneType type; 13 | private String scriptData; 14 | 15 | @Override 16 | public int getId() { 17 | return this.id; 18 | } 19 | 20 | public SceneType getSceneType() { 21 | return type; 22 | } 23 | 24 | public String getScriptData() { 25 | return scriptData; 26 | } 27 | 28 | @Override 29 | public void onLoad() { 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/content/ContentUnlockTransPoint.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.content; 2 | 3 | import emu.grasscutter.data.excels.QuestData; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | import emu.grasscutter.game.quest.QuestValue; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestBaseHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_CONTENT_UNLOCK_TRANS_POINT) 10 | public class ContentUnlockTransPoint extends QuestBaseHandler { 11 | @Override 12 | public boolean execute(GameQuest quest, QuestData.QuestCondition condition, String paramStr, int... params) { 13 | return condition.getParam()[0] == params[0] && condition.getParam()[1] == params[1]; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerAskFriendListReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketGetPlayerAskFriendListRsp; 8 | 9 | @Opcodes(PacketOpcodes.GetPlayerAskFriendListReq) 10 | public class HandlerGetPlayerAskFriendListReq extends PacketHandler { 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | session.send(new PacketGetPlayerAskFriendListRsp(session.getPlayer())); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketDelMailRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.DelMailRspOuterClass.DelMailRsp; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | public class PacketDelMailRsp extends BasePacket { 12 | 13 | public PacketDelMailRsp(Player player, List toDeleteIds) { 14 | super(PacketOpcodes.DelMailRsp); 15 | 16 | DelMailRsp proto = DelMailRsp.newBuilder() 17 | .addAllMailIdList(toDeleteIds) 18 | .build(); 19 | 20 | this.setData(proto); 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPlayerApplyEnterMpResultRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.PlayerApplyEnterMpResultRspOuterClass.PlayerApplyEnterMpResultRsp; 6 | 7 | public class PacketPlayerApplyEnterMpResultRsp extends BasePacket { 8 | 9 | public PacketPlayerApplyEnterMpResultRsp(int applyUid, boolean isAgreed) { 10 | super(PacketOpcodes.PlayerApplyEnterMpResultRsp); 11 | 12 | PlayerApplyEnterMpResultRsp proto = PlayerApplyEnterMpResultRsp.newBuilder() 13 | .setApplyUid(applyUid) 14 | .setIsAgreed(isAgreed) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/PersonalLineData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | import lombok.AccessLevel; 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | import lombok.experimental.FieldDefaults; 9 | 10 | import java.util.List; 11 | 12 | @ResourceType(name = "PersonalLineExcelConfigData.json") 13 | @Getter 14 | @Setter 15 | @FieldDefaults(level = AccessLevel.PRIVATE) 16 | public class PersonalLineData extends GameResource { 17 | int id; 18 | int avatarID; 19 | List preQuestId; 20 | int startQuestId; 21 | int chapterId; 22 | 23 | @Override 24 | public int getId() { 25 | return this.id; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAvatarChangeCostumeNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.entity.EntityAvatar; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.AvatarChangeCostumeNotifyOuterClass.AvatarChangeCostumeNotify; 7 | 8 | public class PacketAvatarChangeCostumeNotify extends BasePacket { 9 | 10 | public PacketAvatarChangeCostumeNotify(EntityAvatar entity) { 11 | super(PacketOpcodes.AvatarChangeCostumeNotify); 12 | 13 | AvatarChangeCostumeNotify proto = AvatarChangeCostumeNotify.newBuilder() 14 | .setEntityInfo(entity.toProto()) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketHomeChooseModuleRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.HomeChooseModuleRspOuterClass; 6 | 7 | public class PacketHomeChooseModuleRsp extends BasePacket { 8 | 9 | public PacketHomeChooseModuleRsp(int moduleId) { 10 | super(PacketOpcodes.HomeChooseModuleRsp); 11 | 12 | HomeChooseModuleRspOuterClass.HomeChooseModuleRsp proto = HomeChooseModuleRspOuterClass.HomeChooseModuleRsp.newBuilder() 13 | .setRetcode(0) 14 | .setModuleId(moduleId) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPlayerApplyEnterMpNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.PlayerApplyEnterMpNotifyOuterClass.PlayerApplyEnterMpNotify; 7 | 8 | public class PacketPlayerApplyEnterMpNotify extends BasePacket { 9 | 10 | public PacketPlayerApplyEnterMpNotify(Player srcPlayer) { 11 | super(PacketOpcodes.PlayerApplyEnterMpNotify); 12 | 13 | PlayerApplyEnterMpNotify proto = PlayerApplyEnterMpNotify.newBuilder() 14 | .setSrcPlayerInfo(srcPlayer.getOnlinePlayerInfo()) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketTowerMiddleLevelChangeTeamNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.TowerMiddleLevelChangeTeamNotifyOuterClass; 6 | 7 | public class PacketTowerMiddleLevelChangeTeamNotify extends BasePacket { 8 | 9 | public PacketTowerMiddleLevelChangeTeamNotify() { 10 | super(PacketOpcodes.TowerMiddleLevelChangeTeamNotify); 11 | 12 | TowerMiddleLevelChangeTeamNotifyOuterClass.TowerMiddleLevelChangeTeamNotify proto = 13 | TowerMiddleLevelChangeTeamNotifyOuterClass.TowerMiddleLevelChangeTeamNotify.newBuilder() 14 | .build(); 15 | 16 | this.setData(proto); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketUnlockAvatarTalentRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.avatar.Avatar; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.UnlockAvatarTalentRspOuterClass.UnlockAvatarTalentRsp; 7 | 8 | public class PacketUnlockAvatarTalentRsp extends BasePacket { 9 | 10 | public PacketUnlockAvatarTalentRsp(Avatar avatar, int talentId) { 11 | super(PacketOpcodes.UnlockAvatarTalentRsp); 12 | 13 | UnlockAvatarTalentRsp proto = UnlockAvatarTalentRsp.newBuilder() 14 | .setAvatarGuid(avatar.getGuid()) 15 | .setTalentId(talentId) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAskAddFriendNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.friends.Friendship; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.AskAddFriendNotifyOuterClass.AskAddFriendNotify; 7 | 8 | public class PacketAskAddFriendNotify extends BasePacket { 9 | 10 | public PacketAskAddFriendNotify(Friendship friendship) { 11 | super(PacketOpcodes.AskAddFriendNotify); 12 | 13 | AskAddFriendNotify proto = AskAddFriendNotify.newBuilder() 14 | .setTargetUid(friendship.getFriendId()) 15 | .setTargetFriendBrief(friendship.toProto()) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerEnterTransPointRegionNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.game.managers.SotSManager; 4 | import emu.grasscutter.game.player.Player; 5 | import emu.grasscutter.net.packet.Opcodes; 6 | import emu.grasscutter.net.packet.PacketHandler; 7 | import emu.grasscutter.net.packet.PacketOpcodes; 8 | import emu.grasscutter.server.game.GameSession; 9 | 10 | @Opcodes(PacketOpcodes.EnterTransPointRegionNotify) 11 | public class HandlerEnterTransPointRegionNotify extends PacketHandler { 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception{ 14 | session.getPlayer().getSotsManager().handleEnterTransPointRegionNotify(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketChapterStateNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.ChapterStateNotifyOuterClass; 6 | import emu.grasscutter.net.proto.ChapterStateOuterClass; 7 | 8 | public class PacketChapterStateNotify extends BasePacket { 9 | 10 | public PacketChapterStateNotify(int id, ChapterStateOuterClass.ChapterState state) { 11 | super(PacketOpcodes.ChapterStateNotify); 12 | 13 | var proto = ChapterStateNotifyOuterClass.ChapterStateNotify.newBuilder(); 14 | 15 | proto.setChapterId(id) 16 | .setChapterState(state); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketFurnitureCurModuleArrangeCountNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.FurnitureCurModuleArrangeCountNotifyOuterClass; 6 | import emu.grasscutter.net.proto.Uint32PairOuterClass; 7 | 8 | public class PacketFurnitureCurModuleArrangeCountNotify extends BasePacket { 9 | 10 | public PacketFurnitureCurModuleArrangeCountNotify() { 11 | super(PacketOpcodes.FurnitureCurModuleArrangeCountNotify); 12 | 13 | var proto = FurnitureCurModuleArrangeCountNotifyOuterClass.FurnitureCurModuleArrangeCountNotify.newBuilder(); 14 | 15 | // TODO 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/b_feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for Grasscutter 4 | title: '[Feature Request] ' 5 | labels: 'enhancement, suggestion' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | 12 | 13 | **Describe the solution you'd like** 14 | 15 | 16 | **Describe alternatives you've considered** 17 | 18 | 19 | **Additional context** 20 | 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/dungeons/challenge/trigger/ChallengeTrigger.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.dungeons.challenge.trigger; 2 | 3 | import emu.grasscutter.game.dungeons.challenge.WorldChallenge; 4 | import emu.grasscutter.game.entity.EntityGadget; 5 | import emu.grasscutter.game.entity.EntityMonster; 6 | 7 | public abstract class ChallengeTrigger { 8 | public void onBegin(WorldChallenge challenge){} 9 | public void onFinish(WorldChallenge challenge){} 10 | public void onMonsterDeath(WorldChallenge challenge, EntityMonster monster){} 11 | public void onGadgetDeath(WorldChallenge challenge, EntityGadget gadget){} 12 | public void onCheckTimeout(WorldChallenge challenge){} 13 | public void onGadgetDamage(WorldChallenge challenge, EntityGadget gadget){} 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/entity/gadget/GadgetObject.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.entity.gadget; 2 | 3 | import emu.grasscutter.game.entity.EntityGadget; 4 | import emu.grasscutter.game.player.Player; 5 | import emu.grasscutter.net.proto.GadgetInteractReqOuterClass; 6 | import emu.grasscutter.net.proto.SceneGadgetInfoOuterClass; 7 | 8 | public class GadgetObject extends GadgetContent{ 9 | public GadgetObject(EntityGadget gadget) { 10 | super(gadget); 11 | } 12 | 13 | @Override 14 | public boolean onInteract(Player player, GadgetInteractReqOuterClass.GadgetInteractReq req) { 15 | return false; 16 | } 17 | 18 | @Override 19 | public void onBuildProto(SceneGadgetInfoOuterClass.SceneGadgetInfo.Builder gadgetInfo) { 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetFurnitureCurModuleArrangeCountReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketFurnitureCurModuleArrangeCountNotify; 8 | 9 | @Opcodes(PacketOpcodes.GetFurnitureCurModuleArrangeCountReq) 10 | public class HandlerGetFurnitureCurModuleArrangeCountReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | session.send(new PacketFurnitureCurModuleArrangeCountNotify()); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketActivityTakeWatcherRewardRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.ActivityTakeWatcherRewardRspOuterClass; 6 | 7 | public class PacketActivityTakeWatcherRewardRsp extends BasePacket { 8 | 9 | public PacketActivityTakeWatcherRewardRsp(int activityId, int watcherId) { 10 | super(PacketOpcodes.ActivityTakeWatcherRewardRsp); 11 | 12 | var proto = ActivityTakeWatcherRewardRspOuterClass.ActivityTakeWatcherRewardRsp.newBuilder(); 13 | 14 | proto.setActivityId(activityId) 15 | .setWatcherId(watcherId); 16 | 17 | this.setData(proto); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAvatarFightPropNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.avatar.Avatar; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.AvatarFightPropNotifyOuterClass.AvatarFightPropNotify; 7 | 8 | public class PacketAvatarFightPropNotify extends BasePacket { 9 | 10 | public PacketAvatarFightPropNotify(Avatar avatar) { 11 | super(PacketOpcodes.AvatarFightPropNotify); 12 | 13 | AvatarFightPropNotify proto = AvatarFightPropNotify.newBuilder() 14 | .setAvatarGuid(avatar.getGuid()) 15 | .putAllFightPropMap(avatar.getFightProperties()) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketFireworkSetNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.FireworkSetNotifyOuterClass; 6 | import emu.grasscutter.net.proto.FireworkSetDataOuterClass; 7 | 8 | public class PacketFireworkSetNotify extends BasePacket { 9 | 10 | public PacketFireworkSetNotify(FireworkSetDataOuterClass.FireworkSetData notify) { 11 | super(PacketOpcodes.FireworkSetNotify); 12 | 13 | var proto 14 | = FireworkSetNotifyOuterClass.FireworkSetNotify.newBuilder(); 15 | 16 | proto.setCode(1).addData(notify); 17 | 18 | setData(proto.build()); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPlayerTimeNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.PlayerTimeNotifyOuterClass.PlayerTimeNotify; 7 | 8 | public class PacketPlayerTimeNotify extends BasePacket { 9 | 10 | public PacketPlayerTimeNotify(Player player) { 11 | super(PacketOpcodes.PlayerTimeNotify); 12 | 13 | PlayerTimeNotify proto = PlayerTimeNotify.newBuilder() 14 | .setIsPaused(player.isPaused()) 15 | .setPlayerTime(player.getClientTime()) 16 | .setServerTime(System.currentTimeMillis()) 17 | .build(); 18 | 19 | this.setData(proto); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/command/commands/PositionCommand.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.command.commands; 2 | 3 | import emu.grasscutter.command.Command; 4 | import emu.grasscutter.command.CommandHandler; 5 | import emu.grasscutter.game.player.Player; 6 | import emu.grasscutter.utils.Position; 7 | 8 | import java.util.List; 9 | 10 | @Command(label = "position", aliases = {"pos"}) 11 | public final class PositionCommand implements CommandHandler { 12 | 13 | @Override 14 | public void execute(Player sender, Player targetPlayer, List args) { 15 | Position pos = targetPlayer.getPosition(); 16 | CommandHandler.sendTranslatedMessage(sender, "commands.position.success", 17 | pos.getX(), pos.getY(), pos.getZ(), targetPlayer.getSceneId()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/entity/gadget/GadgetContent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.entity.gadget; 2 | 3 | import emu.grasscutter.game.entity.EntityGadget; 4 | import emu.grasscutter.game.player.Player; 5 | import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq; 6 | import emu.grasscutter.net.proto.SceneGadgetInfoOuterClass.SceneGadgetInfo; 7 | 8 | public abstract class GadgetContent { 9 | private final EntityGadget gadget; 10 | 11 | public GadgetContent(EntityGadget gadget) { 12 | this.gadget = gadget; 13 | } 14 | 15 | public EntityGadget getGadget() { 16 | return gadget; 17 | } 18 | 19 | public abstract boolean onInteract(Player player, GadgetInteractReq req); 20 | 21 | public abstract void onBuildProto(SceneGadgetInfo.Builder gadgetInfo); 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/content/ContentLeaveScene.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.content; 2 | 3 | import emu.grasscutter.data.excels.QuestData.QuestCondition; 4 | import emu.grasscutter.game.player.Player; 5 | import emu.grasscutter.game.quest.GameQuest; 6 | import emu.grasscutter.game.quest.QuestValue; 7 | import emu.grasscutter.game.quest.enums.QuestTrigger; 8 | import emu.grasscutter.game.quest.handlers.QuestBaseHandler; 9 | 10 | @QuestValue(QuestTrigger.QUEST_CONTENT_LEAVE_SCENE) 11 | public class ContentLeaveScene extends QuestBaseHandler { 12 | 13 | @Override 14 | public boolean execute(GameQuest quest, QuestCondition condition, String paramStr, int... params) { 15 | return quest.getOwner().getScene().getPrevScene() == params[0]; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/scripts/ScriptUtils.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.scripts; 2 | 3 | import java.util.HashMap; 4 | 5 | import org.luaj.vm2.LuaTable; 6 | import org.luaj.vm2.LuaValue; 7 | 8 | import emu.grasscutter.Grasscutter; 9 | 10 | public class ScriptUtils { 11 | 12 | public static HashMap toMap(LuaTable table) { 13 | HashMap map = new HashMap<>(); 14 | LuaValue[] rootKeys = table.keys(); 15 | for (LuaValue k : rootKeys) { 16 | if (table.get(k).istable()) { 17 | map.put(k, toMap(table.get(k).checktable())); 18 | } else { 19 | map.put(k, table.get(k)); 20 | } 21 | } 22 | return map; 23 | } 24 | 25 | public static void print(LuaTable table) { 26 | Grasscutter.getLogger().info(toMap(table).toString()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/entity/EntityDeathEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.entity; 2 | 3 | import emu.grasscutter.game.entity.GameEntity; 4 | import emu.grasscutter.server.event.types.EntityEvent; 5 | import emu.grasscutter.utils.Location; 6 | import lombok.Getter; 7 | 8 | import javax.annotation.Nullable; 9 | 10 | public final class EntityDeathEvent extends EntityEvent { 11 | @Getter private final Location deathLocation; 12 | @Getter @Nullable private final GameEntity killer; 13 | 14 | public EntityDeathEvent(GameEntity entity, int killerId) { 15 | super(entity); 16 | 17 | this.deathLocation = new Location(entity.getScene(), entity.getPosition()); 18 | this.killer = entity.getScene().getEntityById(killerId); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/player/PlayerTeamDeathEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.player; 2 | 3 | import emu.grasscutter.game.entity.EntityAvatar; 4 | import emu.grasscutter.game.player.Player; 5 | import emu.grasscutter.server.event.types.PlayerEvent; 6 | import lombok.Getter; 7 | 8 | /** 9 | * This event is invoked when the ENTIRE TEAM dies. 10 | * To listen for one player death, use {@link emu.grasscutter.server.event.entity.EntityDeathEvent}. 11 | */ 12 | public final class PlayerTeamDeathEvent extends PlayerEvent { 13 | @Getter private final EntityAvatar selectedAvatar; 14 | 15 | public PlayerTeamDeathEvent(Player player, EntityAvatar selectedAvatar) { 16 | super(player); 17 | 18 | this.selectedAvatar = selectedAvatar; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerChangeAvatarReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.ChangeAvatarReqOuterClass.ChangeAvatarReq; 6 | import emu.grasscutter.net.packet.PacketHandler; 7 | import emu.grasscutter.server.game.GameSession; 8 | 9 | @Opcodes(PacketOpcodes.ChangeAvatarReq) 10 | public class HandlerChangeAvatarReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | ChangeAvatarReq req = ChangeAvatarReq.parseFrom(payload); 15 | 16 | session.getPlayer().getTeamManager().changeAvatar(req.getGuid()); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerPersonalLineAllDataReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketPersonalLineAllDataRsp; 8 | 9 | @Opcodes(PacketOpcodes.PersonalLineAllDataReq) 10 | public class HandlerPersonalLineAllDataReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | session.send(new PacketPersonalLineAllDataRsp(session.getPlayer().getQuestManager().getMainQuests().values())); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAbilityChangeNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.entity.EntityAvatar; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.AbilityChangeNotifyOuterClass.AbilityChangeNotify; 7 | 8 | public class PacketAbilityChangeNotify extends BasePacket { 9 | 10 | public PacketAbilityChangeNotify(EntityAvatar entity) { 11 | super(PacketOpcodes.AbilityChangeNotify, true); 12 | 13 | AbilityChangeNotify proto = AbilityChangeNotify.newBuilder() 14 | .setEntityId(entity.getId()) 15 | .setAbilityControlBlock(entity.getAbilityControlBlock()) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSyncScenePlayTeamEntityNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.SyncScenePlayTeamEntityNotifyOuterClass.SyncScenePlayTeamEntityNotify; 7 | 8 | public class PacketSyncScenePlayTeamEntityNotify extends BasePacket { 9 | 10 | public PacketSyncScenePlayTeamEntityNotify(Player player) { 11 | super(PacketOpcodes.SyncScenePlayTeamEntityNotify); 12 | 13 | SyncScenePlayTeamEntityNotify proto = SyncScenePlayTeamEntityNotify.newBuilder() 14 | .setSceneId(player.getSceneId()) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketTowerEnterLevelRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.TowerEnterLevelRspOuterClass.TowerEnterLevelRsp; 6 | 7 | public class PacketTowerEnterLevelRsp extends BasePacket { 8 | 9 | public PacketTowerEnterLevelRsp(int floorId, int levelIndex) { 10 | super(PacketOpcodes.TowerEnterLevelRsp); 11 | 12 | TowerEnterLevelRsp proto = TowerEnterLevelRsp.newBuilder() 13 | .setFloorId(floorId) 14 | .setLevelIndex(levelIndex) 15 | .addTowerBuffIdList(4) 16 | .addTowerBuffIdList(28) 17 | .addTowerBuffIdList(18) 18 | .build(); 19 | 20 | this.setData(proto); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerDeleteFriendReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.DeleteFriendReqOuterClass.DeleteFriendReq; 6 | import emu.grasscutter.net.packet.PacketHandler; 7 | import emu.grasscutter.server.game.GameSession; 8 | 9 | @Opcodes(PacketOpcodes.DeleteFriendReq) 10 | public class HandlerDeleteFriendReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | DeleteFriendReq req = DeleteFriendReq.parseFrom(payload); 15 | 16 | session.getPlayer().getFriendsList().deleteFriend(req.getTargetUid()); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerHomeUnknown2Req.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketHomeUnknown2Rsp; 8 | 9 | @Opcodes(PacketOpcodes.Unk2700_ACILPONNGGK_ClientReq) 10 | public class HandlerHomeUnknown2Req extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | /* 15 | * This packet is about the edit mode 16 | */ 17 | session.send(new PacketHomeUnknown2Rsp()); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketGadgetStateNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.entity.EntityGadget; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.GadgetStateNotifyOuterClass.GadgetStateNotify; 7 | 8 | public class PacketGadgetStateNotify extends BasePacket { 9 | 10 | public PacketGadgetStateNotify(EntityGadget gadget, int newState) { 11 | super(PacketOpcodes.GadgetStateNotify); 12 | 13 | GadgetStateNotify proto = GadgetStateNotify.newBuilder() 14 | .setGadgetEntityId(gadget.getId()) 15 | .setGadgetState(newState) 16 | .setIsEnableInteract(true) 17 | .build(); 18 | 19 | this.setData(proto); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/ReliquaryMainPropData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import emu.grasscutter.data.GameResource; 4 | import emu.grasscutter.data.ResourceType; 5 | import emu.grasscutter.game.props.FightProperty; 6 | 7 | @ResourceType(name = "ReliquaryMainPropExcelConfigData.json") 8 | public class ReliquaryMainPropData extends GameResource { 9 | private int id; 10 | 11 | private int propDepotId; 12 | private FightProperty propType; 13 | private int weight; 14 | 15 | @Override 16 | public int getId() { 17 | return id; 18 | } 19 | 20 | public int getPropDepotId() { 21 | return propDepotId; 22 | } 23 | 24 | public int getWeight() { 25 | return weight; 26 | } 27 | 28 | public FightProperty getFightProp() { 29 | return propType; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/http/handlers/LogHandler.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.http.handlers; 2 | 3 | import emu.grasscutter.server.http.Router; 4 | import io.javalin.Javalin; 5 | import io.javalin.http.Context; 6 | 7 | /** 8 | * Handles logging requests made to the server. 9 | */ 10 | public final class LogHandler implements Router { 11 | @Override public void applyRoutes(Javalin javalin) { 12 | // overseauspider.yuanshen.com 13 | javalin.post("/log", LogHandler::log); 14 | // log-upload-os.mihoyo.com 15 | javalin.post("/crash/dataUpload", LogHandler::log); 16 | } 17 | 18 | private static void log(Context ctx) { 19 | // TODO: Figure out how to dump request body and log to file. 20 | ctx.result("{\"code\":0}"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerAskAddFriendReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.AskAddFriendReqOuterClass.AskAddFriendReq; 6 | import emu.grasscutter.net.packet.PacketHandler; 7 | import emu.grasscutter.server.game.GameSession; 8 | 9 | @Opcodes(PacketOpcodes.AskAddFriendReq) 10 | public class HandlerAskAddFriendReq extends PacketHandler { 11 | 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | AskAddFriendReq req = AskAddFriendReq.parseFrom(payload); 15 | 16 | session.getPlayer().getFriendsList().sendFriendRequest(req.getTargetUid()); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketDealAddFriendRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.DealAddFriendResultTypeOuterClass.DealAddFriendResultType; 6 | import emu.grasscutter.net.proto.DealAddFriendRspOuterClass.DealAddFriendRsp; 7 | 8 | public class PacketDealAddFriendRsp extends BasePacket { 9 | 10 | public PacketDealAddFriendRsp(int targetUid, DealAddFriendResultType result) { 11 | super(PacketOpcodes.DealAddFriendRsp); 12 | 13 | DealAddFriendRsp proto = DealAddFriendRsp.newBuilder() 14 | .setTargetUid(targetUid) 15 | .setDealAddFriendResult(result) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketWorldPlayerDieNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.PlayerDieTypeOuterClass.PlayerDieType; 6 | import emu.grasscutter.net.proto.WorldPlayerDieNotifyOuterClass.WorldPlayerDieNotify; 7 | 8 | public class PacketWorldPlayerDieNotify extends BasePacket { 9 | 10 | public PacketWorldPlayerDieNotify(PlayerDieType playerDieType, int killerId) { 11 | super(PacketOpcodes.WorldPlayerDieNotify); 12 | 13 | WorldPlayerDieNotify proto = WorldPlayerDieNotify.newBuilder() 14 | .setDieType(playerDieType) 15 | .setMonsterId(killerId) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/data/excels/RewardData.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.data.excels; 2 | 3 | import java.util.List; 4 | 5 | import emu.grasscutter.data.GameResource; 6 | import emu.grasscutter.data.ResourceType; 7 | import emu.grasscutter.data.common.ItemParamData; 8 | 9 | @ResourceType(name = "RewardExcelConfigData.json") 10 | public class RewardData extends GameResource { 11 | public int rewardId; 12 | public List rewardItemList; 13 | 14 | @Override 15 | public int getId() { 16 | return rewardId; 17 | } 18 | 19 | public List getRewardItemList() { 20 | return rewardItemList; 21 | } 22 | 23 | @Override 24 | public void onLoad() { 25 | rewardItemList = rewardItemList.stream().filter(i -> i.getId() > 0).toList(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/CoopRequest.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | 5 | public class CoopRequest { 6 | private final Player requester; 7 | private final long requestTime; 8 | private final long expireTime; 9 | 10 | public CoopRequest(Player requester) { 11 | this.requester = requester; 12 | this.requestTime = System.currentTimeMillis(); 13 | this.expireTime = this.requestTime + 10000; 14 | } 15 | 16 | public Player getRequester() { 17 | return requester; 18 | } 19 | 20 | public long getRequestTime() { 21 | return requestTime; 22 | } 23 | 24 | public long getExpireTime() { 25 | return expireTime; 26 | } 27 | 28 | public boolean isExpired() { 29 | return System.currentTimeMillis() > getExpireTime(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/conditions/ConditionLuaNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.conditions; 2 | 3 | import emu.grasscutter.data.excels.QuestData.QuestCondition; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | import emu.grasscutter.game.quest.QuestValue; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestBaseHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_COND_LUA_NOTIFY) 10 | public class ConditionLuaNotify extends QuestBaseHandler { 11 | //Wrong implementation. Example: 7010226 has no paramStr 12 | @Override 13 | public boolean execute(GameQuest quest, QuestCondition condition, String paramStr, int... params) { 14 | return condition.getParam()[0] == Integer.parseInt(paramStr); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/exec/ExecIncQuestGlobalVar.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.exec; 2 | 3 | import emu.grasscutter.data.excels.QuestData; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | import emu.grasscutter.game.quest.QuestValue; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestExecHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_EXEC_INC_QUEST_GLOBAL_VAR) 10 | public class ExecIncQuestGlobalVar extends QuestExecHandler { 11 | @Override 12 | public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) { 13 | quest.getOwner().getQuestManager().incQuestGlobalVarValue(Integer.valueOf(paramStr[0]),Integer.valueOf(paramStr[1])); 14 | return true; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/exec/ExecSetQuestGlobalVar.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.exec; 2 | 3 | import emu.grasscutter.data.excels.QuestData; 4 | import emu.grasscutter.game.quest.GameQuest; 5 | import emu.grasscutter.game.quest.QuestValue; 6 | import emu.grasscutter.game.quest.enums.QuestTrigger; 7 | import emu.grasscutter.game.quest.handlers.QuestExecHandler; 8 | 9 | @QuestValue(QuestTrigger.QUEST_EXEC_SET_QUEST_GLOBAL_VAR) 10 | public class ExecSetQuestGlobalVar extends QuestExecHandler { 11 | @Override 12 | public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) { 13 | quest.getOwner().getQuestManager().setQuestGlobalVarValue(Integer.valueOf(paramStr[0]),Integer.valueOf(paramStr[1])); 14 | return true; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/player/PlayerReceiveMailEvent.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event.player; 2 | 3 | import emu.grasscutter.game.mail.Mail; 4 | import emu.grasscutter.game.player.Player; 5 | import emu.grasscutter.server.event.Cancellable; 6 | import emu.grasscutter.server.event.types.PlayerEvent; 7 | 8 | public final class PlayerReceiveMailEvent extends PlayerEvent implements Cancellable { 9 | private Mail message; 10 | 11 | public PlayerReceiveMailEvent(Player player, Mail message) { 12 | super(player); 13 | 14 | this.message = message; 15 | } 16 | 17 | public void setMessage(Mail message) { 18 | this.message = message; 19 | } 20 | 21 | public Mail getMessage() { 22 | return this.message; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerDoGachaReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.DoGachaReqOuterClass.DoGachaReq; 6 | import emu.grasscutter.net.packet.PacketHandler; 7 | import emu.grasscutter.server.game.GameSession; 8 | 9 | @Opcodes(PacketOpcodes.DoGachaReq) 10 | public class HandlerDoGachaReq extends PacketHandler { 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | DoGachaReq req = DoGachaReq.parseFrom(payload); 14 | 15 | session.getServer().getGachaSystem().doPulls(session.getPlayer(), req.getGachaScheduleId(), req.getGachaTimes()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerFriendListReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.packet.PacketHandler; 6 | import emu.grasscutter.server.game.GameSession; 7 | import emu.grasscutter.server.packet.send.PacketGetPlayerFriendListRsp; 8 | 9 | @Opcodes(PacketOpcodes.GetPlayerFriendListReq) 10 | public class HandlerGetPlayerFriendListReq extends PacketHandler { 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | //session.send(new PacketGetPlayerAskFriendListRsp(session.getPlayer())); 14 | session.send(new PacketGetPlayerFriendListRsp(session.getPlayer())); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketCookDataNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import java.util.List; 4 | 5 | import emu.grasscutter.net.packet.BasePacket; 6 | import emu.grasscutter.net.packet.PacketOpcodes; 7 | import emu.grasscutter.net.proto.CookDataNotifyOuterClass.CookDataNotify; 8 | import emu.grasscutter.net.proto.CookRecipeDataOuterClass.CookRecipeData; 9 | 10 | public class PacketCookDataNotify extends BasePacket { 11 | 12 | public PacketCookDataNotify(List recipies) { 13 | super(PacketOpcodes.CookDataNotify); 14 | 15 | CookDataNotify proto = CookDataNotify.newBuilder() 16 | .addAllRecipeDataList(recipies) 17 | .build(); 18 | 19 | this.setData(proto); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketMusicGameSettleRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.MusicGameSettleRspOuterClass; 6 | 7 | public class PacketMusicGameSettleRsp extends BasePacket { 8 | 9 | public PacketMusicGameSettleRsp(int musicBasicId, long musicShareId, boolean isNewRecord) { 10 | super(PacketOpcodes.MusicGameSettleRsp); 11 | 12 | var proto = MusicGameSettleRspOuterClass.MusicGameSettleRsp.newBuilder(); 13 | 14 | proto.setMusicBasicId(musicBasicId) 15 | .setMusicShareId(musicShareId) 16 | .setIsNewRecord(isNewRecord); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSetEquipLockStateRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.inventory.GameItem; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.SetEquipLockStateRspOuterClass.SetEquipLockStateRsp; 7 | 8 | public class PacketSetEquipLockStateRsp extends BasePacket { 9 | 10 | public PacketSetEquipLockStateRsp(GameItem equip) { 11 | super(PacketOpcodes.SetEquipLockStateRsp); 12 | 13 | this.buildHeader(0); 14 | 15 | SetEquipLockStateRsp proto = SetEquipLockStateRsp.newBuilder() 16 | .setTargetEquipGuid(equip.getGuid()) 17 | .setIsLocked(equip.isLocked()) 18 | .build(); 19 | 20 | this.setData(proto); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/utils/ByteHelper.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.utils; 2 | 3 | public class ByteHelper { 4 | public static byte[] changeBytes(byte[] a) { 5 | byte[] b = new byte[a.length]; 6 | for (int i = 0; i < a.length; i++) { 7 | b[i] = a[a.length - i - 1]; 8 | } 9 | return b; 10 | } 11 | 12 | public static byte[] longToBytes(long x) { 13 | byte[] bytes = new byte[8]; 14 | bytes[0] = (byte) (x >> 56); 15 | bytes[1] = (byte) (x >> 48); 16 | bytes[2] = (byte) (x >> 40); 17 | bytes[3] = (byte) (x >> 32); 18 | bytes[4] = (byte) (x >> 24); 19 | bytes[5] = (byte) (x >> 16); 20 | bytes[6] = (byte) (x >> 8); 21 | bytes[7] = (byte) (x); 22 | return bytes; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /start_config.cmd: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright (C) 2002-2022 MlgmXyysd All Rights Reserved. 3 | @rem 4 | 5 | @echo off 6 | pushd %~dp0 7 | set CUR_PATH=%~dp0 8 | 9 | @rem This will not work if your java or mitmproxy is in a different location, plugin as necessary 10 | @rem this just saves you from changing your PATH 11 | 12 | @rem Executable Path 13 | @rem Note: Fill DO_NOT_CHECK_PATH if you need to run it from PATH 14 | @rem without detecting whether the executable file exists 15 | set JAVA_PATH=%JAVA_HOME%\bin\ 16 | set MITMDUMP_PATH=%CUR_PATH% 17 | set MONGODB_PATH=%CUR_PATH% 18 | 19 | @rem Utility Path 20 | set SERVER_JAR_PATH=%CUR_PATH% 21 | set DATABASE_STORAGE_PATH=%CUR_PATH%resources\Database 22 | 23 | @rem Utility Name 24 | set SERVER_JAR_NAME=grasscutter.jar 25 | set PROXY_SCRIPT_NAME=proxy -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/game/quest/exec/ExecDecQuestGlobalVar.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.game.quest.exec; 2 | 3 | 4 | import emu.grasscutter.data.excels.QuestData; 5 | import emu.grasscutter.game.quest.GameQuest; 6 | import emu.grasscutter.game.quest.QuestValue; 7 | import emu.grasscutter.game.quest.enums.QuestTrigger; 8 | import emu.grasscutter.game.quest.handlers.QuestExecHandler; 9 | 10 | @QuestValue(QuestTrigger.QUEST_EXEC_DEC_QUEST_GLOBAL_VAR) 11 | public class ExecDecQuestGlobalVar extends QuestExecHandler { 12 | @Override 13 | public boolean execute(GameQuest quest, QuestData.QuestExecParam condition, String... paramStr) { 14 | quest.getOwner().getQuestManager().decQuestGlobalVarValue(Integer.valueOf(paramStr[0]),Integer.valueOf(paramStr[1])); 15 | return true; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/event/Event.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.event; 2 | 3 | import emu.grasscutter.Grasscutter; 4 | 5 | /** 6 | * A generic server event. 7 | */ 8 | public abstract class Event { 9 | private boolean cancelled = false; 10 | 11 | /** 12 | * Return the cancelled state of the event. 13 | */ 14 | public boolean isCanceled() { 15 | return this.cancelled; 16 | } 17 | 18 | /** 19 | * Cancels the event if possible. 20 | */ 21 | public void cancel() { 22 | if(this instanceof Cancellable) 23 | this.cancelled = true; 24 | } 25 | 26 | /** 27 | * Pushes this event to all listeners. 28 | */ 29 | public void call() { 30 | Grasscutter.getPluginManager().invokeEvent(this); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerPlayerCookReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.PlayerCookReqOuterClass; 7 | import emu.grasscutter.server.game.GameSession; 8 | 9 | @Opcodes(PacketOpcodes.PlayerCookReq) 10 | public class HandlerPlayerCookReq extends PacketHandler { 11 | @Override 12 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 13 | PlayerCookReqOuterClass.PlayerCookReq req = PlayerCookReqOuterClass.PlayerCookReq.parseFrom(payload); 14 | session.getPlayer().getCookingManager().handlePlayerCookReq(req); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketPlayerGameTimeNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.game.world.World; 5 | import emu.grasscutter.net.packet.BasePacket; 6 | import emu.grasscutter.net.packet.PacketOpcodes; 7 | import emu.grasscutter.net.proto.PlayerGameTimeNotifyOuterClass.PlayerGameTimeNotify; 8 | 9 | public class PacketPlayerGameTimeNotify extends BasePacket { 10 | 11 | public PacketPlayerGameTimeNotify(Player player) { 12 | super(PacketOpcodes.PlayerGameTimeNotify); 13 | 14 | PlayerGameTimeNotify proto = PlayerGameTimeNotify.newBuilder() 15 | .setGameTime(player.getScene().getTime()) 16 | .setUid(player.getUid()) 17 | .build(); 18 | 19 | this.setData(proto); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/recv/HandlerGetShopReq.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.recv; 2 | 3 | import emu.grasscutter.net.packet.Opcodes; 4 | import emu.grasscutter.net.packet.PacketHandler; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.GetShopReqOuterClass.GetShopReq; 7 | import emu.grasscutter.server.game.GameSession; 8 | import emu.grasscutter.server.packet.send.PacketGetShopRsp; 9 | 10 | @Opcodes(PacketOpcodes.GetShopReq) 11 | public class HandlerGetShopReq extends PacketHandler { 12 | @Override 13 | public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { 14 | GetShopReq req = GetShopReq.parseFrom(payload); 15 | 16 | session.send(new PacketGetShopRsp(session.getPlayer(), req.getShopType())); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketAvatarFlycloakChangeNotify.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.avatar.Avatar; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.AvatarFlycloakChangeNotifyOuterClass.AvatarFlycloakChangeNotify; 7 | 8 | public class PacketAvatarFlycloakChangeNotify extends BasePacket { 9 | 10 | public PacketAvatarFlycloakChangeNotify(Avatar avatar) { 11 | super(PacketOpcodes.AvatarFlycloakChangeNotify); 12 | 13 | AvatarFlycloakChangeNotify proto = AvatarFlycloakChangeNotify.newBuilder() 14 | .setAvatarGuid(avatar.getGuid()) 15 | .setFlycloakId(avatar.getFlyCloak()) 16 | .build(); 17 | 18 | this.setData(proto); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSetPlayerPropRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.player.Player; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.SetPlayerPropRspOuterClass; 7 | import emu.grasscutter.net.proto.SetPlayerPropRspOuterClass.SetPlayerPropRsp; 8 | 9 | public class PacketSetPlayerPropRsp extends BasePacket { 10 | 11 | public PacketSetPlayerPropRsp(int retCode) { 12 | super(PacketOpcodes.SetPlayerPropRsp); 13 | SetPlayerPropRspOuterClass.SetPlayerPropRsp.Builder proto = SetPlayerPropRspOuterClass.SetPlayerPropRsp.newBuilder(); 14 | if (retCode != 0) { 15 | proto.setRetcode(retCode); 16 | } 17 | this.setData(proto.build()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketSetUpLunchBoxWidgetRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.net.packet.BasePacket; 4 | import emu.grasscutter.net.packet.PacketOpcodes; 5 | import emu.grasscutter.net.proto.LunchBoxDataOuterClass; 6 | import emu.grasscutter.net.proto.SetUpLunchBoxWidgetRspOuterClass; 7 | 8 | public class PacketSetUpLunchBoxWidgetRsp extends BasePacket { 9 | 10 | public PacketSetUpLunchBoxWidgetRsp(LunchBoxDataOuterClass.LunchBoxData lunchBoxData) { 11 | super(PacketOpcodes.SetUpLunchBoxWidgetRsp); 12 | var rsp 13 | = SetUpLunchBoxWidgetRspOuterClass.SetUpLunchBoxWidgetRsp.newBuilder(); 14 | rsp.setLunchBoxData(lunchBoxData); 15 | 16 | setData(rsp.build()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/emu/grasscutter/server/packet/send/PacketUnlockTransPointRsp.java: -------------------------------------------------------------------------------- 1 | package emu.grasscutter.server.packet.send; 2 | 3 | import emu.grasscutter.game.avatar.Avatar; 4 | import emu.grasscutter.net.packet.BasePacket; 5 | import emu.grasscutter.net.packet.PacketOpcodes; 6 | import emu.grasscutter.net.proto.RetcodeOuterClass.Retcode; 7 | import emu.grasscutter.net.proto.UnlockTransPointRspOuterClass.UnlockTransPointRsp; 8 | 9 | public class PacketUnlockTransPointRsp extends BasePacket { 10 | public PacketUnlockTransPointRsp(Retcode retcode) { 11 | super(PacketOpcodes.UnlockTransPointRsp); 12 | 13 | UnlockTransPointRsp proto = UnlockTransPointRsp.newBuilder() 14 | .setRetcode(retcode.getNumber()) 15 | .build(); 16 | 17 | this.setData(proto); 18 | } 19 | } 20 | --------------------------------------------------------------------------------