├── .editorconfig ├── .env.example ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature-missing.md └── workflows │ └── dotnet.yml ├── .gitignore ├── .luaFormatConfig ├── CONTRIBUTING.md ├── GameDataParser ├── Files │ ├── Hash.cs │ ├── MetadataExporter │ │ ├── Exporter.cs │ │ └── MetadataExporter.cs │ └── Resources.cs ├── GameDataParser.csproj ├── Hash │ ├── ms2-ad-banner-metadata-hash │ ├── ms2-additional-effect-metadata-hash │ ├── ms2-animation-metadata-hash │ ├── ms2-black-market-table-metadata-hash │ ├── ms2-character-create-metadata-hash │ ├── ms2-chat-sticker-metadata-hash │ ├── ms2-color-palette-metadata-hash │ ├── ms2-constants-metadata-hash │ ├── ms2-default-items-metadata-hash │ ├── ms2-dungeon-metadata-hash │ ├── ms2-enchant-limit-metadata-hash │ ├── ms2-enchant-scroll-metadata-hash │ ├── ms2-exp-table-metadata-hash │ ├── ms2-field-war-metadata-hash │ ├── ms2-fish-metadata-hash │ ├── ms2-fishing-rod-metadata-hash │ ├── ms2-fishing-spot-metadata-hash │ ├── ms2-function-cube-metadata-hash │ ├── ms2-furnishing-shop-metadata-hash │ ├── ms2-gacha-metadata-hash │ ├── ms2-guild-buff-metadata-hash │ ├── ms2-guild-contribution-metadata-hash │ ├── ms2-guild-house-metadata-hash │ ├── ms2-guild-property-metadata-hash │ ├── ms2-guild-service-metadata-hash │ ├── ms2-home-template-metadata-hash │ ├── ms2-insignia-metadata-hash │ ├── ms2-instrument-category-info-metadata-hash │ ├── ms2-instrument-info-metadata-hash │ ├── ms2-interact-object-metadata-hash │ ├── ms2-item-drop-metadata-hash │ ├── ms2-item-enchant-transfer-metadata-hash │ ├── ms2-item-exchange-scroll-metadata-hash │ ├── ms2-item-extraction-metadata-hash │ ├── ms2-item-gemstone-upgrade-metadata-hash │ ├── ms2-item-metadata-hash │ ├── ms2-item-option-constant-metadata-hash │ ├── ms2-item-option-pick-metadata-hash │ ├── ms2-item-option-random-metadata-hash │ ├── ms2-item-option-range-metadata-hash │ ├── ms2-item-option-static-metadata-hash │ ├── ms2-item-repackage-metadata-hash │ ├── ms2-item-socket-metadata-hash │ ├── ms2-item-socket-scroll-metadata-hash │ ├── ms2-job-metadata-hash │ ├── ms2-magic-path-metadata-hash │ ├── ms2-map-metadata-hash │ ├── ms2-mastery-factor-metadata-hash │ ├── ms2-mastery-metadata-hash │ ├── ms2-mastery-ugc-housing-metadata-hash │ ├── ms2-meret-market-category-metadata-hash │ ├── ms2-mount-metadata-hash │ ├── ms2-npc-metadata-hash │ ├── ms2-premium-club-daily-benefit-metadata-hash │ ├── ms2-premium-club-effect-metadata-hash │ ├── ms2-premium-club-package-metadata-hash │ ├── ms2-prestige-level-mission-metadata-hash │ ├── ms2-prestige-reward-metadata-hash │ ├── ms2-quest-metadata-hash │ ├── ms2-recipe-metadata-hash │ ├── ms2-reward-content-metadata-hash │ ├── ms2-script-metadata-hash │ ├── ms2-set-item-info-metadata-hash │ ├── ms2-set-item-option-metadata-hash │ ├── ms2-skill-metadata-hash │ ├── ms2-survival-gold-pass-reward-metadata-hash │ ├── ms2-survival-level-metadata-hash │ ├── ms2-survival-period-metadata-hash │ ├── ms2-survival-silver-pass-reward-metadata-hash │ ├── ms2-title-metadata-hash │ ├── ms2-trophy-metadata-hash │ ├── ms2-ugc-design-metadata-hash │ └── ms2-ugc-map-metadata-hash ├── Parsers │ ├── AdBannerParser.cs │ ├── AdditionalEffectParser.cs │ ├── AnimationParser.cs │ ├── BlackMarketTableParser.cs │ ├── CharacterCreateParser.cs │ ├── ChatStickerParser.cs │ ├── ColorPaletteParser.cs │ ├── ConstantsParser.cs │ ├── DefaultItemsParser.cs │ ├── DungeonParser.cs │ ├── EnchantLimitParser.cs │ ├── EnchantScrollParser.cs │ ├── ExpTableParser.cs │ ├── FieldWarParser.cs │ ├── FishParser.cs │ ├── FishingRodParser.cs │ ├── FishingSpotParser.cs │ ├── FunctionCubeParser.cs │ ├── FurnishingShopParser.cs │ ├── GachaParser.cs │ ├── GuildBuffParser.cs │ ├── GuildContributionParser.cs │ ├── GuildHouseParser.cs │ ├── GuildPropertyParser.cs │ ├── GuildServiceParser.cs │ ├── Helpers │ │ ├── ParserHelper.cs │ │ └── StatParser.cs │ ├── HomeTemplateParser.cs │ ├── InsigniaParser.cs │ ├── InstrumentCategoryInfoParser.cs │ ├── InstrumentInfoParser.cs │ ├── InteractObjectParser.cs │ ├── ItemDropParser.cs │ ├── ItemEnchantTransferParser.cs │ ├── ItemExchangeScrollParser.cs │ ├── ItemExtractionParser.cs │ ├── ItemGemstoneUpgradeParser.cs │ ├── ItemOptionConstantParser.cs │ ├── ItemOptionPickParser.cs │ ├── ItemOptionRandomParser.cs │ ├── ItemOptionRangeParser.cs │ ├── ItemOptionStaticParser.cs │ ├── ItemParser.cs │ ├── ItemRepackageParser.cs │ ├── ItemSocketParser.cs │ ├── ItemSocketScrollParser.cs │ ├── JobParser.cs │ ├── MagicPathParser.cs │ ├── MapParser.cs │ ├── MasteryFactorParser.cs │ ├── MasteryParser.cs │ ├── MasteryUgcHousingParser.cs │ ├── MeretMarketCategoryParser.cs │ ├── MeshParser.cs │ ├── MountParser.cs │ ├── NpcParser.cs │ ├── PremiumClubDailyBenefitParser.cs │ ├── PremiumClubEffectParser.cs │ ├── PremiumClubPackageParser.cs │ ├── PrestigeLevelMissionParser.cs │ ├── PrestigeRewardParser.cs │ ├── QuestParser.cs │ ├── RecipeParser.cs │ ├── RewardContentParser.cs │ ├── ScriptParser.cs │ ├── SetItemInfoParser.cs │ ├── SetItemOptionParser.cs │ ├── SkillParser.cs │ ├── SurvivalGoldPassRewardParser.cs │ ├── SurvivalLevelParser.cs │ ├── SurvivalPeriodParser.cs │ ├── SurvivalSilverPassRewardParser.cs │ ├── TitleParser.cs │ ├── TrophyParser.cs │ ├── UgcDesignParser.cs │ └── UgcMapParser.cs ├── Program.cs └── Tools │ └── StringExtensions.cs ├── LICENSE ├── Maple2Storage ├── Enums │ ├── BeautyShopType.cs │ ├── CurrencyType.cs │ ├── EnchantScrollType.cs │ ├── GemSlot.cs │ ├── Gender.cs │ ├── InteractObjectType.cs │ ├── InventoryTab.cs │ ├── ItemExpirationType.cs │ ├── ItemHousingCategory.cs │ ├── ItemOptionRangeType.cs │ ├── ItemSkinType.cs │ ├── ItemSlot.cs │ ├── ItemStringTag.cs │ ├── ItemTransferFlag.cs │ ├── ItemType.cs │ ├── MedalSlot.cs │ ├── MeretMarket.cs │ ├── NpcAction.cs │ ├── NpcKind.cs │ ├── NpcState.cs │ ├── NpcTalkMode.cs │ ├── NpcType.cs │ ├── PatchType.cs │ ├── PlayerState.cs │ ├── PortalTypes.cs │ ├── QuestState.cs │ ├── QuestType.cs │ ├── RewardType.cs │ ├── ShopCurrencyType.cs │ ├── ShopItemLabel.cs │ ├── ShopType.cs │ ├── SkillType.cs │ ├── StatAttribute.cs │ ├── TransferType.cs │ └── UGCType.cs ├── Extensions │ └── StringExtensions.cs ├── Json │ ├── Constants.json │ ├── FishingRewards.json │ └── GlobalEvents.json ├── Maple2Storage.csproj ├── Scripts │ ├── Functions │ │ ├── ItemEnchantScroll │ │ │ └── getSuccessRate.lua │ │ ├── ItemSocketScroll │ │ │ ├── getSocketCount.lua │ │ │ └── getSuccessRate.lua │ │ ├── calcAirTaxiCost.lua │ │ ├── calcBlackMarketCostRate.lua │ │ ├── calcEnchantValues.lua │ │ ├── calcGetGemStonePutOffPrice.lua │ │ ├── calcGetItemRemakeIngredient.lua │ │ ├── calcItemSocketMaxCount.lua │ │ ├── calcItemSocketUnlockIngredient.lua │ │ ├── calcItemValues.lua │ │ ├── calcKillCountBonusExpRate.lua │ │ ├── calcLimitBreakValues.lua │ │ ├── calcMeretMarketRegisterFee.lua │ │ └── calcTaxiCost.lua │ └── Npcs │ │ ├── 11000001.lua │ │ ├── 11000002.lua │ │ ├── 11000003.lua │ │ ├── 11000005.lua │ │ ├── 11000007.lua │ │ ├── 11000020.lua │ │ ├── 11000021.lua │ │ ├── 11000024.lua │ │ ├── 11000025.lua │ │ ├── 11000033.lua │ │ ├── 11000037.lua │ │ ├── 11000040.lua │ │ ├── 11000041.lua │ │ ├── 11000042.lua │ │ ├── 11000043.lua │ │ ├── 11000045.lua │ │ ├── 11000046.lua │ │ ├── 11000050.lua │ │ ├── 11000051.lua │ │ ├── 11000053.lua │ │ ├── 11000054.lua │ │ ├── 11000058.lua │ │ ├── 11000064.lua │ │ ├── 11000071.lua │ │ ├── 11000072.lua │ │ ├── 11000074.lua │ │ ├── 11000075.lua │ │ ├── 11000096.lua │ │ ├── 11000098.lua │ │ ├── 11000106.lua │ │ ├── 11000110.lua │ │ ├── 11000119.lua │ │ ├── 11000139.lua │ │ ├── 11000143.lua │ │ ├── 11000144.lua │ │ ├── 11000145.lua │ │ ├── 11000146.lua │ │ ├── 11000157.lua │ │ ├── 11000158.lua │ │ ├── 11000159.lua │ │ ├── 11000160.lua │ │ ├── 11000164.lua │ │ ├── 11000169.lua │ │ ├── 11000170.lua │ │ ├── 11000171.lua │ │ ├── 11000173.lua │ │ ├── 11000179.lua │ │ ├── 11000186.lua │ │ ├── 11000188.lua │ │ ├── 11000190.lua │ │ ├── 11000191.lua │ │ ├── 11000200.lua │ │ ├── 11000201.lua │ │ ├── 11000203.lua │ │ ├── 11000208.lua │ │ ├── 11000212.lua │ │ ├── 11000215.lua │ │ ├── 11000220.lua │ │ ├── 11000233.lua │ │ ├── 11000234.lua │ │ ├── 11000244.lua │ │ ├── 11000251.lua │ │ ├── 11000253.lua │ │ ├── 11000254.lua │ │ ├── 11000255.lua │ │ ├── 11000256.lua │ │ ├── 11000257.lua │ │ ├── 11000259.lua │ │ ├── 11000264.lua │ │ ├── 11000266.lua │ │ ├── 11000283.lua │ │ ├── 11000323.lua │ │ ├── 11000327.lua │ │ ├── 11000331.lua │ │ ├── 11000340.lua │ │ ├── 11000348.lua │ │ ├── 11000349.lua │ │ ├── 11000351.lua │ │ ├── 11000354.lua │ │ ├── 11000359.lua │ │ ├── 11000373.lua │ │ ├── 11000374.lua │ │ ├── 11000390.lua │ │ ├── 11000396.lua │ │ ├── 11000400.lua │ │ ├── 11000401.lua │ │ ├── 11000402.lua │ │ ├── 11000404.lua │ │ ├── 11000406.lua │ │ ├── 11000408.lua │ │ ├── 11000409.lua │ │ ├── 11000420.lua │ │ ├── 11000422.lua │ │ ├── 11000429.lua │ │ ├── 11000430.lua │ │ ├── 11000431.lua │ │ ├── 11000432.lua │ │ ├── 11000450.lua │ │ ├── 11000451.lua │ │ ├── 11000452.lua │ │ ├── 11000508.lua │ │ ├── 11000510.lua │ │ ├── 11000585.lua │ │ ├── 11000601.lua │ │ ├── 11000994.lua │ │ ├── 11001257.lua │ │ ├── 11001513.lua │ │ ├── 11001514.lua │ │ ├── 11001677.lua │ │ ├── 11001953.lua │ │ ├── 11003472.lua │ │ ├── 11003511.lua │ │ ├── 11004319.lua │ │ ├── 11004320.lua │ │ ├── 11004321.lua │ │ ├── 11004322.lua │ │ ├── 11004323.lua │ │ ├── 11004324.lua │ │ ├── 11004329.lua │ │ ├── 11004330.lua │ │ ├── 11004331.lua │ │ └── 11004332.lua ├── Tools │ ├── ConsoleUtility.cs │ └── DotEnv.cs └── Types │ ├── Block.cs │ ├── Color.cs │ ├── Coord.cs │ ├── Direction.cs │ ├── HairData.cs │ ├── HatData.cs │ ├── Metadata │ ├── AdBannerMetadata.cs │ ├── AdditionalEffectMetadata.cs │ ├── AnimationMetadata.cs │ ├── BlackMarketTableMetadata.cs │ ├── CharacterCreateMetadata.cs │ ├── ChatStickerMetadata.cs │ ├── ColorPaletteMetadata.cs │ ├── ConstantsMetadata.cs │ ├── DefaultItemsMetadata.cs │ ├── DungeonMetadata.cs │ ├── EnchantLimitMetadata.cs │ ├── EnchantScrollMetadata.cs │ ├── ExpMetadata.cs │ ├── FieldWarMetadata.cs │ ├── FishMetadata.cs │ ├── FishingRodMetadata.cs │ ├── FishingSpotMetadata.cs │ ├── FunctionCubeMetadata.cs │ ├── FurnishingShopMetadata.cs │ ├── GachaMetadata.cs │ ├── GuildBuffMetadata.cs │ ├── GuildContributionMetadata.cs │ ├── GuildHouseMetadata.cs │ ├── GuildPropertyMetadata.cs │ ├── GuildServiceMetadata.cs │ ├── HomeTemplateMetadata.cs │ ├── InsigniaMetadata.cs │ ├── InstrumentCategoryInfoMetadata.cs │ ├── InstrumentInfoMetadata.cs │ ├── InteractObjectMetadata.cs │ ├── ItemDropMetadata.cs │ ├── ItemEnchantTransferMetadata.cs │ ├── ItemExchangeScrollMetadata.cs │ ├── ItemExtractionMetadata.cs │ ├── ItemGemstoneUpgradeMetadata.cs │ ├── ItemMetadata.cs │ ├── ItemOptionConstantMetadata.cs │ ├── ItemOptionPickMetadata.cs │ ├── ItemOptionRandomMetadata.cs │ ├── ItemOptionRangeMetadata.cs │ ├── ItemOptionStaticMetadata.cs │ ├── ItemOptionsConstantMetadata.cs │ ├── ItemRepackageMetadata.cs │ ├── ItemSocketMetadata.cs │ ├── ItemSocketScrollMetadata.cs │ ├── JobMetadata.cs │ ├── MagicPathMetadata.cs │ ├── MapEntityMetadata.cs │ ├── MapMetadata.cs │ ├── MasteryFactorMetadata.cs │ ├── MasteryMetadata.cs │ ├── MasteryUgcHousingMetadata.cs │ ├── MeretMarketCategoryMetadata.cs │ ├── MountMetadata.cs │ ├── NpcMetadata.cs │ ├── PremiumClubDailyBenefitMetadata.cs │ ├── PremiumClubEffectMetadata.cs │ ├── PremiumClubPackageMetadata.cs │ ├── PrestigeLevelMissionMetadata.cs │ ├── PrestigeRewardMetadata.cs │ ├── QuestMetadata.cs │ ├── RecipeMetadata.cs │ ├── RewardContentMetadata.cs │ ├── ScriptMetadata.cs │ ├── SetItemInfoMetadata.cs │ ├── SetItemOptionMetadata.cs │ ├── SkillMetadata.cs │ ├── SurvivalGoldPassRewardMetadata.cs │ ├── SurvivalLevelMetadata.cs │ ├── SurvivalPeriodMetadata.cs │ ├── SurvivalSilverPassRewardMetadata.cs │ ├── TitleMetadata.cs │ ├── TrophyMetadata.cs │ ├── UgcDesignMetadata.cs │ └── UgcMapMetadata.cs │ ├── MetadataName.cs │ ├── Paths.cs │ ├── StatEntry.cs │ └── XmlStats.cs ├── MaplePacketLib2 ├── Crypto │ ├── ICrypter.cs │ ├── MapleCipher.cs │ ├── Rand32.cs │ ├── RearrangeCrypter.cs │ ├── TableCrypter.cs │ └── XORCrypter.cs ├── LICENSE ├── MaplePacketLib2.csproj ├── README.md └── Tools │ ├── HexEncoding.cs │ ├── IPacketReader.cs │ ├── IPacketSerializable.cs │ ├── IPacketWriter.cs │ ├── PacketExtensions.cs │ ├── PacketReader.cs │ ├── PacketWriter.cs │ ├── PoolPacketReader.cs │ └── PoolPacketWriter.cs ├── MapleServer2.Tests ├── MapleServer2.Tests.csproj └── Tools │ └── ConditionHelperTests.cs ├── MapleServer2.sln ├── MapleServer2.sln.DotSettings ├── MapleServer2 ├── AI │ ├── AIHelper.cs │ ├── AIScript.cs │ ├── Functions │ │ ├── AIAction.cs │ │ ├── AICondition.cs │ │ ├── AIContext.cs │ │ └── AITrigger.cs │ └── Scripts │ │ ├── AI_DefaultNew.cs │ │ └── AI_PrisonGovernor2_battle.cs ├── Commands │ ├── Core │ │ ├── CommandBase.cs │ │ ├── CommandHelpers.cs │ │ ├── CommandTrigger.cs │ │ ├── GameCommandTrigger.cs │ │ ├── IParameter.cs │ │ ├── InGameCommand.cs │ │ └── Parameter.cs │ └── Game │ │ ├── CurrencyCommands.cs │ │ ├── DebugCommands.cs │ │ ├── EntityCommands.cs │ │ ├── EventCommands.cs │ │ ├── GMCommands.cs │ │ ├── GearCommands.cs │ │ ├── GotoCommands.cs │ │ ├── GuildCommands.cs │ │ ├── HomeCommands │ │ ├── AlarmCommand.cs │ │ ├── BallCommand.cs │ │ ├── GravityCommand.cs │ │ ├── RandomCommand.cs │ │ └── SurveyCommand.cs │ │ ├── InfoCommands.cs │ │ ├── ItemCommands.cs │ │ ├── PlayerCommands.cs │ │ ├── QuestCommands.cs │ │ └── UnlockCommands.cs ├── Constants │ ├── Constant.cs │ ├── Map.cs │ ├── RecvOp.cs │ └── SendOp.cs ├── Data │ └── Static │ │ ├── AdBannerMetadataStorage.cs │ │ ├── AdditionalEffectMetadataStorage.cs │ │ ├── AnimationStorage.cs │ │ ├── BlackMarketTableMetadataStorage.cs │ │ ├── CharacterCreateMetadataStorage.cs │ │ ├── ChatStickerMetadataStorage.cs │ │ ├── ColorPaletteMetadataStorage.cs │ │ ├── ConstantsMetadataStorage.cs │ │ ├── DefaultItemsMetadataStorage.cs │ │ ├── DungeonMetadataStorage.cs │ │ ├── EnchantLimitMetadataStorage.cs │ │ ├── EnchantScrollMetadataStorage.cs │ │ ├── ExpMetadataStorage.cs │ │ ├── FieldWarMetadataStorage.cs │ │ ├── FishMetadataStorage.cs │ │ ├── FishingRewardsMetadataStorage.cs │ │ ├── FishingRodMetadataStorage.cs │ │ ├── FishingSpotMetadataStorage.cs │ │ ├── FunctionCubeMetadataStorage.cs │ │ ├── FurnishingShopMetadataStorage.cs │ │ ├── GachaMetadataStorage.cs │ │ ├── GlobalEventsMetadataStorage.cs │ │ ├── GuildBuffMetadataStorage.cs │ │ ├── GuildContributionMetadataStorage.cs │ │ ├── GuildHouseMetadataStorage.cs │ │ ├── GuildPropertyMetadataStorage.cs │ │ ├── GuildServiceMetadataStorage.cs │ │ ├── HomeTemplateMetadataStorage.cs │ │ ├── InsigniaMetadataStorage.cs │ │ ├── InstrumentCategoryInfoMetadataStorage.cs │ │ ├── InstrumentInfoMetadataStorage.cs │ │ ├── InteractObjectMetadataStorage.cs │ │ ├── ItemDropMetadataStorage.cs │ │ ├── ItemEnchantTransferMetadataStorage.cs │ │ ├── ItemExchangeScrollMetadataStorage.cs │ │ ├── ItemExtractionMetadataStorage.cs │ │ ├── ItemGemstoneUpgradeMetadataStorage.cs │ │ ├── ItemMetadataStorage.cs │ │ ├── ItemOptionConstantMetadataStorage.cs │ │ ├── ItemOptionPickMetadataStorage.cs │ │ ├── ItemOptionRandomMetadataStorage.cs │ │ ├── ItemOptionRangeStorage.cs │ │ ├── ItemOptionStaticMetadataStorage.cs │ │ ├── ItemRepackageMetadataStorage.cs │ │ ├── ItemSocketMetadataStorage.cs │ │ ├── ItemSocketScrollMetadataStorage.cs │ │ ├── JobMetadataStorage.cs │ │ ├── MagicPathMetadataStorage.cs │ │ ├── MapEntityMetadataStorage.cs │ │ ├── MapMetadataStorage.cs │ │ ├── MasteryFactorMetadataStorage.cs │ │ ├── MasteryMetadataStorage.cs │ │ ├── MasteryUgcHousingMetadataStorage.cs │ │ ├── MeretMarketCategoryMetadataStorage.cs │ │ ├── MountMetadataStorage.cs │ │ ├── NpcMetadataStorage.cs │ │ ├── PremiumClubDailyBenefitMetadataStorage.cs │ │ ├── PremiumClubEffectMetadataStorage.cs │ │ ├── PremiumClubPackageMetadataStorage.cs │ │ ├── PrestigeLevelMissionMetadataStorage.cs │ │ ├── PrestigeRewardMetadataStorage.cs │ │ ├── QuestMetadataStorage.cs │ │ ├── RecipeMetadataStorage.cs │ │ ├── RewardContentMetadataStorage.cs │ │ ├── ScriptMetadataStorage.cs │ │ ├── SetItemInfoMetadataStorage.cs │ │ ├── SetItemOptionMetadataStorage.cs │ │ ├── SkillMetadataStorage.cs │ │ ├── SurvivalGoldPassRewardMetadataStorage.cs │ │ ├── SurvivalLevelMetadataStorage.cs │ │ ├── SurvivalPeriodMetadataStorage.cs │ │ ├── SurvivalSilverPassRewardMetadataStorage.cs │ │ ├── TitleMetadataStorage.cs │ │ ├── TrophyMetadataStorage.cs │ │ ├── UgcDesignMetadataStorage.cs │ │ ├── UgcMapMetadataStorage.cs │ │ └── WorldMapGraphStorage.cs ├── Database │ ├── Classes │ │ ├── DatabaseAccount.cs │ │ ├── DatabaseAuthData.cs │ │ ├── DatabaseBankInventory.cs │ │ ├── DatabaseBanner.cs │ │ ├── DatabaseBannerSlot.cs │ │ ├── DatabaseBeautyShop.cs │ │ ├── DatabaseBeautyShopItem.cs │ │ ├── DatabaseBlackMarketListing.cs │ │ ├── DatabaseBuddy.cs │ │ ├── DatabaseCardReverseGame.cs │ │ ├── DatabaseCharacter.cs │ │ ├── DatabaseClub.cs │ │ ├── DatabaseClubMember.cs │ │ ├── DatabaseCube.cs │ │ ├── DatabaseEvent.cs │ │ ├── DatabaseGameEventUserValue.cs │ │ ├── DatabaseGameOptions.cs │ │ ├── DatabaseGuild.cs │ │ ├── DatabaseGuildApplication.cs │ │ ├── DatabaseGuildMember.cs │ │ ├── DatabaseHome.cs │ │ ├── DatabaseHomeLayout.cs │ │ ├── DatabaseHotbar.cs │ │ ├── DatabaseInventory.cs │ │ ├── DatabaseItem.cs │ │ ├── DatabaseLevels.cs │ │ ├── DatabaseMacros.cs │ │ ├── DatabaseMail.cs │ │ ├── DatabaseMapleopoly.cs │ │ ├── DatabaseMedal.cs │ │ ├── DatabaseMeretMarket.cs │ │ ├── DatabaseMesoMarketListing.cs │ │ ├── DatabaseMushkingRoyaleStats.cs │ │ ├── DatabaseOXQuizQuestion.cs │ │ ├── DatabasePets.cs │ │ ├── DatabasePlayerShopInfo.cs │ │ ├── DatabasePlayerShopInventory.cs │ │ ├── DatabasePrestiges.cs │ │ ├── DatabaseQuest.cs │ │ ├── DatabaseRouletteGameItem.cs │ │ ├── DatabaseServer.cs │ │ ├── DatabaseShop.cs │ │ ├── DatabaseShopItem.cs │ │ ├── DatabaseSkillTab.cs │ │ ├── DatabaseTrophy.cs │ │ ├── DatabaseUGC.cs │ │ ├── DatabaseUgcMarketItem.cs │ │ ├── DatabaseUgcMarketSale.cs │ │ ├── DatabaseWallet.cs │ │ └── DatabaseWardrobe.cs │ ├── DatabaseManager.cs │ ├── DatabaseTable.cs │ ├── SQL │ │ └── Database.sql │ ├── Seeding │ │ ├── BeautyShopItemsSeeding.sql │ │ ├── BeautyShopsSeeding.sql │ │ ├── CardReverseGameSeeding.sql │ │ ├── EventsSeeding.sql │ │ ├── MapleopolySeeding.sql │ │ ├── MeretMarketSeeding.sql │ │ ├── OXQuizSeeding.sql │ │ ├── RouletteGameItemsSeeding.sql │ │ ├── ShopItemsSeeding.sql │ │ └── ShopsSeeding.sql │ └── Types │ │ ├── Banner.cs │ │ ├── BeautyShop.cs │ │ ├── BeautyShopItem.cs │ │ ├── CardReverseGame.cs │ │ ├── GameEvent.cs │ │ ├── OXQuizQuestion.cs │ │ └── RouletteGameItem.cs ├── Enums │ ├── BuildModeType.cs │ ├── ChatLinkType.cs │ ├── ChatType.cs │ ├── EnchantType.cs │ ├── EventBannerType.cs │ ├── FieldObjectUpdate.cs │ ├── GameEventUserValueType.cs │ ├── HomePermission.cs │ ├── InteractObjectState.cs │ ├── ItemRarity.cs │ ├── ItemStatType.cs │ ├── Job.cs │ ├── MailType.cs │ ├── MasteryType.cs │ ├── MobMovement.cs │ ├── NoticeType.cs │ ├── OtherStatsIndex.cs │ ├── PartyNotice.cs │ ├── PrestigePerk.cs │ ├── RideType.cs │ ├── RockPaperScissors.cs │ ├── SessionType.cs │ ├── ShopNotice.cs │ ├── ShopRestockInterval.cs │ ├── SkillEnums.cs │ ├── SyncStateFlag.cs │ ├── SystemNotice.cs │ ├── UgcMarket.cs │ └── UgcPortals.cs ├── Extensions │ ├── EnumExtensions.cs │ └── PacketExtensions.cs ├── Managers │ ├── Actors │ │ ├── Character.cs │ │ ├── FieldActor.cs │ │ ├── FieldObject.cs │ │ ├── Npc.cs │ │ └── Pet.cs │ ├── BlackMarketManager.cs │ ├── BuddyManager.cs │ ├── ClubManager.cs │ ├── CommandManager.cs │ ├── DungeonManager.cs │ ├── FieldManager.cs │ ├── FieldWarManager.cs │ ├── GlobalEventManager.cs │ ├── GroupChatManager.cs │ ├── GuildManager.cs │ ├── HomeManager.cs │ ├── HongBaoManager.cs │ ├── MailManager.cs │ ├── MesoMarketManager.cs │ ├── MobAIManager.cs │ ├── MushkingRoyaleQueueManager.cs │ ├── MushkingRoyaleSessionManager.cs │ ├── PartyManager.cs │ ├── PlayerManager.cs │ ├── QuestManager.cs │ ├── ScriptManager.cs │ ├── ShopManager.cs │ ├── TrophyManager.cs │ ├── UGCBannerManager.cs │ └── UgcMarketManager.cs ├── MapleServer.cs ├── MapleServer2.csproj ├── Network │ ├── PacketRouter.cs │ ├── QueuedPipeScheduler.cs │ ├── Server.cs │ └── Session.cs ├── PacketHandlers │ ├── Common │ │ ├── HeartbeatHandler.cs │ │ ├── LogSendHandler.cs │ │ ├── QuitHandler.cs │ │ ├── ResponseKeyHandler.cs │ │ ├── ResponseVersionHandler.cs │ │ └── SystemInfoHandler.cs │ ├── CommonPacketHandler.cs │ ├── Game │ │ ├── AttendanceHandler.cs │ │ ├── BeautyHandler.cs │ │ ├── BlackMarketHandler.cs │ │ ├── BreakableHandler.cs │ │ ├── BuddyEmoteHandler.cs │ │ ├── BuddyHandler.cs │ │ ├── BuildModeHandler.cs │ │ ├── CardReverseGameHandler.cs │ │ ├── ChangeAttributesHandler.cs │ │ ├── ChangeAttributesScrollHandler.cs │ │ ├── ChannelHandler.cs │ │ ├── CharacterInfoHandler.cs │ │ ├── CharacterNameChangeHandler.cs │ │ ├── ChatStickerHandler.cs │ │ ├── ClientTickSyncHandler.cs │ │ ├── ClubHandler.cs │ │ ├── CubeHandler.cs │ │ ├── DungeonHandler.cs │ │ ├── EmoteHandler.cs │ │ ├── EnchantScrollHandler.cs │ │ ├── EnterEventFieldHandler.cs │ │ ├── FallDamageHandler.cs │ │ ├── FieldEnterHandler.cs │ │ ├── FieldWarHandler.cs │ │ ├── FileHashHandler.cs │ │ ├── FishingHandler.cs │ │ ├── FunctionCubeHandler.cs │ │ ├── GemEquipmentHandler.cs │ │ ├── GlobalPortalHandler.cs │ │ ├── GroupChatHandler.cs │ │ ├── GuideObjectSyncHandler.cs │ │ ├── GuildHandler.cs │ │ ├── Helpers │ │ │ ├── BeautyHelper.cs │ │ │ ├── EnchantHelper.cs │ │ │ ├── GameEventHelper.cs │ │ │ ├── GatheringHelper.cs │ │ │ ├── ItemBoxHelper.cs │ │ │ ├── ItemSocketScrollHelper.cs │ │ │ ├── JobHelper.cs │ │ │ ├── MailHelper.cs │ │ │ ├── MeretMarketHelper.cs │ │ │ ├── QuestHelper.cs │ │ │ └── ShopHelper.cs │ │ ├── HomeActionHandler.cs │ │ ├── HomeBankHandler.cs │ │ ├── HomeDoctorHandler.cs │ │ ├── HomeHandler.cs │ │ ├── InsigniaHandler.cs │ │ ├── InstrumentHandler.cs │ │ ├── InteractObjectHandler.cs │ │ ├── ItemBreakHandler.cs │ │ ├── ItemEnchantHandler.cs │ │ ├── ItemEnchantTransferHandler.cs │ │ ├── ItemEquipHandler.cs │ │ ├── ItemExchangeHandler.cs │ │ ├── ItemExtractionHandler.cs │ │ ├── ItemInventoryHandler.cs │ │ ├── ItemLockHandler.cs │ │ ├── ItemPickupHandler.cs │ │ ├── ItemRepackageHandler.cs │ │ ├── ItemSocketScrollHandler.cs │ │ ├── ItemSocketSystemHandler.cs │ │ ├── ItemStorageHandler.cs │ │ ├── ItemUseHandler.cs │ │ ├── ItemUseMultipleHandler.cs │ │ ├── JobHandler.cs │ │ ├── KeyTableHandler.cs │ │ ├── LapenshardHandler.cs │ │ ├── LiftableHandler.cs │ │ ├── LimitBreakHandler.cs │ │ ├── LoadUgcMapHandler.cs │ │ ├── MacroHandler.cs │ │ ├── MailHandler.cs │ │ ├── MapleopolyHandler.cs │ │ ├── MasteryHandler.cs │ │ ├── MatchPartyHandler.cs │ │ ├── MeretMarketHandler.cs │ │ ├── MesoMarketHandler.cs │ │ ├── MoneyPickupHandler.cs │ │ ├── MountConsumeStaminaHandler.cs │ │ ├── MoveFieldHandler.cs │ │ ├── MushkingRoyaleSystemHandler.cs │ │ ├── MyInfoHandler.cs │ │ ├── NewsNotificationHandler.cs │ │ ├── NpcTalkHandler.cs │ │ ├── PCCafeBonusHandler.cs │ │ ├── PartyHandler.cs │ │ ├── PetHandler.cs │ │ ├── PlayerHostHandler.cs │ │ ├── PremiumClubHandler.cs │ │ ├── PrestigeHandler.cs │ │ ├── QuestHandler.cs │ │ ├── RideHandler.cs │ │ ├── RideSyncHandler.cs │ │ ├── RockPaperScissorsHandler.cs │ │ ├── RouletteGameHandler.cs │ │ ├── ShopHandler.cs │ │ ├── SkillBookTreeHandler.cs │ │ ├── SkillHandler.cs │ │ ├── StatPointHandler.cs │ │ ├── StateHandler.cs │ │ ├── StateSkillHandler.cs │ │ ├── SuperChatHandler.cs │ │ ├── SystemShopHandler.cs │ │ ├── TakeBoatHandler.cs │ │ ├── TaxiHandler.cs │ │ ├── TimeSyncHandler.cs │ │ ├── TradeHandler.cs │ │ ├── TriggerHandler.cs │ │ ├── TrophyHandler.cs │ │ ├── TutorialHandler.cs │ │ ├── TutorialItemHandler.cs │ │ ├── UGCHandler.cs │ │ ├── UserChatHandler.cs │ │ ├── UserEnvHandler.cs │ │ ├── UserSyncHandler.cs │ │ ├── VibrateHandler.cs │ │ ├── WardrobeHandler.cs │ │ └── WorldMapHandler.cs │ ├── GamePacketHandler.cs │ ├── IPacketHandler.cs │ ├── Login │ │ ├── CharacterManagementHandler.cs │ │ ├── LoginHandler.cs │ │ ├── LoginUgcHandler.cs │ │ └── ServerEnterPacketHandler.cs │ └── LoginPacketHandler.cs ├── Packets │ ├── AttendancePacket.cs │ ├── BannerListPacket.cs │ ├── BeautyPacket.cs │ ├── BirthdayPacket.cs │ ├── BlackMarketPacket.cs │ ├── BreakablePacket.cs │ ├── BuddyEmotePacket.cs │ ├── BuddyPacket.cs │ ├── BuffPacket.cs │ ├── BuildModePacket.cs │ ├── CardReverseGamePacket.cs │ ├── CashPacket.cs │ ├── ChangeAttributesPacket.cs │ ├── ChangeAttributesScrollPacket.cs │ ├── ChangeBackgroundPacket.cs │ ├── CharacterCreatePacket.cs │ ├── CharacterInfoPacket.cs │ ├── CharacterListPacket.cs │ ├── CharacterNameChangePacket.cs │ ├── ChatPacket.cs │ ├── ChatStickerPacket.cs │ ├── CinematicPacket.cs │ ├── ClubPacket.cs │ ├── CouponUsePacket.cs │ ├── CubePacket.cs │ ├── DungeonHelperPacket.cs │ ├── DungeonListPacket.cs │ ├── DungeonPacket.cs │ ├── DungeonWaitPacket.cs │ ├── DynamicChannelPacket.cs │ ├── EmotePacket.cs │ ├── EnchantScrollPacket.cs │ ├── EnterUgcMapPacket.cs │ ├── EquipmentPacket.cs │ ├── ExperiencePacket.cs │ ├── FallDamagePacket.cs │ ├── FieldEnterPacket.cs │ ├── FieldItemPacket.cs │ ├── FieldNpcPacket.cs │ ├── FieldObjectPacket.cs │ ├── FieldPetPacket.cs │ ├── FieldPlayerPacket.cs │ ├── FieldPortalPacket.cs │ ├── FieldPropertyPacket.cs │ ├── FieldWarPacket.cs │ ├── FireworksPacket.cs │ ├── FishingPacket.cs │ ├── FollowNpcPacket.cs │ ├── FunctionCubePacket.cs │ ├── FurnishingInventoryPacket.cs │ ├── GameEventPacket.cs │ ├── GameEventUserValuePacket.cs │ ├── GemPacket.cs │ ├── GlobalPortalPacket.cs │ ├── GroupChatPacket.cs │ ├── GuideObjectPacket.cs │ ├── GuildPacket.cs │ ├── HandshakePacket.cs │ ├── HeartbeatPacket.cs │ ├── Helpers │ │ ├── ItemPacketHelper.cs │ │ ├── MountPacketHelper.cs │ │ └── SyncStateHelper.cs │ ├── HomeActionPacket.cs │ ├── HomeBank.cs │ ├── HomeCommandPacket.cs │ ├── InsigniaPacket.cs │ ├── InstrumentPacket.cs │ ├── InteractObjectPacket.cs │ ├── InviteToHomePacket.cs │ ├── ItemBreakPacket.cs │ ├── ItemEnchantPacket.cs │ ├── ItemEnchantTransferPacket.cs │ ├── ItemExchangePacket.cs │ ├── ItemExtraDataPacket.cs │ ├── ItemExtractionPacket.cs │ ├── ItemInventoryPacket.cs │ ├── ItemLinkPacket.cs │ ├── ItemLockPacket.cs │ ├── ItemRepackagePacket.cs │ ├── ItemSocketScrollPacket.cs │ ├── ItemSocketSystemPacket.cs │ ├── ItemUsePacket.cs │ ├── JobPacket.cs │ ├── KeyTablePacket.cs │ ├── LapenshardPacket.cs │ ├── LevelUpPacket.cs │ ├── LiftablePacket.cs │ ├── LimitBreakPacket.cs │ ├── LoadUgcMapPacket.cs │ ├── LocalCameraPacket.cs │ ├── LoginResultPacket.cs │ ├── MacroPacket.cs │ ├── MailPacket.cs │ ├── MapleopolyPacket.cs │ ├── MassiveEventPacket.cs │ ├── MasteryPacket.cs │ ├── MatchPartyPacket.cs │ ├── MeretMarketPacket.cs │ ├── MeretsPacket.cs │ ├── MesoMarketPacket.cs │ ├── MesosPacket.cs │ ├── MigrationPacket.cs │ ├── MountPacket.cs │ ├── MoveResultPacket.cs │ ├── MushkingRoyaleSystemPacket.cs │ ├── MyInfoPacket.cs │ ├── NewsNotificationPacket.cs │ ├── NoticePacket.cs │ ├── NpcTalkPacket.cs │ ├── NpsInfoPacket.cs │ ├── OneTimeEffectPacket.cs │ ├── PCCafeBonusPacket.cs │ ├── PartyPacket.cs │ ├── PetPacket.cs │ ├── PetSkinPacket.cs │ ├── PlayerHostPacket.cs │ ├── PremiumClubPacket.cs │ ├── PrestigePacket.cs │ ├── PvpPacket.cs │ ├── QuestPacket.cs │ ├── QuizEventPacket.cs │ ├── RegionSkillPacket.cs │ ├── RequestPacket.cs │ ├── ResultsPacket.cs │ ├── RevivalConfirmPacket.cs │ ├── RockPaperScissorsPacket.cs │ ├── RouletteGamePacket.cs │ ├── SendCubesPacket.cs │ ├── ServerEnterPacket.cs │ ├── ServerListPacket.cs │ ├── SetCameraPacket.cs │ ├── ShopPacket.cs │ ├── SkillBookTreePacket.cs │ ├── SkillCancelPacket.cs │ ├── SkillCooldownPacket.cs │ ├── SkillDamagePacket.cs │ ├── SkillPointPacket.cs │ ├── SkillSyncPacket.cs │ ├── SkillUsePacket.cs │ ├── SkinColorPacket.cs │ ├── StatPacket.cs │ ├── StatPointPacket.cs │ ├── StorageInventoryPacket.cs │ ├── StoryBookPacket.cs │ ├── SuperChatPacket.cs │ ├── SyncNumberPacket.cs │ ├── SyncStatePacket.cs │ ├── SyncValuePacket.cs │ ├── SystemShopPacket.cs │ ├── SystemSoundPacket.cs │ ├── TaxiPacket.cs │ ├── TimeScalePacket.cs │ ├── TimeSyncPacket.cs │ ├── TradePacket.cs │ ├── TriggerPacket.cs │ ├── TrophyPacket.cs │ ├── UGCPacket.cs │ ├── UserBattlePacket.cs │ ├── UserEnvPacket.cs │ ├── UserMoveByPortalPacket.cs │ ├── VibratePacket.cs │ ├── WalletPacket.cs │ ├── WardrobePacket.cs │ ├── WarehouseInventoryPacket.cs │ ├── WebOpenPacket.cs │ └── WorldMapPacket.cs ├── Servers │ ├── Game │ │ ├── GameContainerConfig.cs │ │ ├── GameServer.cs │ │ └── GameSession.cs │ └── Login │ │ ├── LoginContainerConfig.cs │ │ ├── LoginServer.cs │ │ └── LoginSession.cs ├── Tools │ ├── ConditionHelper.cs │ ├── ErrorParser.cs │ ├── FieldManagerFactory.cs │ ├── GuidGenerator.cs │ ├── ListExtension.cs │ ├── MetadataHelper.cs │ ├── PacketStructureResolver.cs │ ├── ScriptLoader.cs │ ├── SockHint.cs │ └── TaskScheduler.cs ├── Triggers │ ├── ArcadeTriggers.cs │ ├── CameraTriggers.cs │ ├── DungeonTriggers.cs │ ├── FieldObjectTriggers.cs │ ├── FieldPropertyTriggers.cs │ ├── MiniGameTriggers.cs │ ├── NpcTriggers.cs │ ├── PlayerTriggers.cs │ ├── TriggerConditions.cs │ ├── TriggerContext.cs │ ├── TriggerScript.cs │ ├── UITriggers.cs │ └── WeddingTriggers.cs └── Types │ ├── AIState.cs │ ├── Account.cs │ ├── AdditionalEffect.cs │ ├── AdditionalEffects.cs │ ├── AnimationHandler.cs │ ├── AuthData.cs │ ├── BankInventory.cs │ ├── BaseStats.cs │ ├── BlackMarketListing.cs │ ├── BreakableObject.cs │ ├── Buddy.cs │ ├── ChatSticker.cs │ ├── Club.cs │ ├── ClubMember.cs │ ├── ConditionSkillTarget.cs │ ├── Cube.cs │ ├── Currency.cs │ ├── DamageHandler.cs │ ├── DebugPrintSettings.cs │ ├── DismantleInventory.cs │ ├── DungeonSession.cs │ ├── FieldNavigator.cs │ ├── FieldState.cs │ ├── FieldTaskScheduler │ ├── TickingTaskScheduler.cs │ ├── TriggerTask.cs │ └── TriggerTaskParameters.cs │ ├── FieldWar.cs │ ├── Fishing.cs │ ├── GameEventUserValue.cs │ ├── GameOptions.cs │ ├── GatheringCount.cs │ ├── Gemstone.cs │ ├── GlobalEvent.cs │ ├── GroupChat.cs │ ├── GuideObject.cs │ ├── Guild │ ├── Guild.cs │ ├── GuildApplication.cs │ ├── GuildBuff.cs │ ├── GuildMember.cs │ ├── GuildRank.cs │ └── GuildServices.cs │ ├── HairInventory.cs │ ├── HealingSpot.cs │ ├── Home │ ├── Home.cs │ ├── HomeLayout.cs │ └── HomeSurvey.cs │ ├── HongBao.cs │ ├── Hotbar.cs │ ├── IFieldActor.cs │ ├── IFieldObject.cs │ ├── IInventory.cs │ ├── INpc.cs │ ├── Instrument.cs │ ├── InteractObject.cs │ ├── Inventory.cs │ ├── Item.cs │ ├── ItemStats │ ├── ConstantStats.cs │ ├── ItemEnchant.cs │ ├── ItemStats.cs │ ├── RandomStats.cs │ └── StaticStats.cs │ ├── KeyBind.cs │ ├── Levels.cs │ ├── LiftableObject.cs │ ├── LockInventory.cs │ ├── Macro.cs │ ├── Mail.cs │ ├── MapTimer.cs │ ├── MapleopolyTile.cs │ ├── MasteryExp.cs │ ├── MeretMarket │ ├── MeretMarketItem.cs │ └── UgcMarketSale.cs │ ├── MesoMarketListing.cs │ ├── MobAI.cs │ ├── MobSpawn.cs │ ├── Mount.cs │ ├── MushkingRoyale │ ├── Medal.cs │ └── MushkingRoyaleStats.cs │ ├── MushkingRoyaleQueue.cs │ ├── MushkingRoyaleSession.cs │ ├── MusicScore.cs │ ├── NpcTalk.cs │ ├── Party.cs │ ├── PetInfo.cs │ ├── Player.cs │ ├── PlayerTrigger.cs │ ├── Portal.cs │ ├── Prestige.cs │ ├── PrestigeMission.cs │ ├── ProximityTracker.cs │ ├── QuestStatus.cs │ ├── QuickSlot.cs │ ├── RegionSkillHandler.cs │ ├── SetBonus.cs │ ├── Shop │ ├── BuyBackItem.cs │ ├── PlayerShopInfo.cs │ ├── PlayerShopInventory.cs │ ├── Shop.cs │ └── ShopItem.cs │ ├── SkillCast.cs │ ├── SkillCastTracker.cs │ ├── SkillTab.cs │ ├── SkillTriggerHandler.cs │ ├── Stat.cs │ ├── StatDistribution.cs │ ├── Stats.cs │ ├── Status.cs │ ├── StatusHandler.cs │ ├── SyncState.cs │ ├── TimeInfo.cs │ ├── TradeInventory.cs │ ├── TriggerObject.cs │ ├── Trophy.cs │ ├── UGC.cs │ ├── UGCBanner.cs │ ├── Wallet.cs │ ├── Wardrobe.cs │ └── Widget.cs ├── MapleWebServer ├── Endpoints │ ├── BannerEndpoint.cs │ ├── GuildEndpoint.cs │ ├── ItemEndpoint.cs │ ├── ItemIconEndpoint.cs │ ├── ProfileEndpoint.cs │ └── UploadEndpoint.cs ├── MapleWebServer.csproj ├── Program.cs └── Properties │ └── launchSettings.json ├── MobAI ├── AI_DefaultNew.xml └── mob-ai.xsd └── README.md /.env.example: -------------------------------------------------------------------------------- 1 | # Database Info 2 | DB_IP=localhost 3 | DB_PORT=3306 4 | DB_NAME=Maple2DB 5 | DB_USER=root 6 | DB_PASSWORD=root 7 | 8 | # Server Info 9 | IP=127.0.0.1 10 | GAME_PORT=21001 11 | LOGIN_PORT=20001 12 | NAME=Paperwood 13 | 14 | # WebServer Info 15 | WEB_PORT=3000 -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | 12 | 13 | **To Reproduce** 14 | 19 | 20 | **Expected behavior** 21 | 22 | 23 | **Screenshots** 24 | 25 | 26 | **Stack trace of the error** 27 | 28 | 29 | **Latest commit id** 30 | 31 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-missing.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature missing 3 | about: Suggest a feature that is missing from the emulator 4 | title: '' 5 | labels: todo 6 | assignees: '' 7 | 8 | --- 9 | 10 | **What is missing? If it involves multiple things, please describe them all** 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bin/ 2 | obj/ 3 | .vs/ 4 | .vscode/ 5 | .idea/ 6 | .omnisharp/ 7 | *.cache 8 | GameDataParser/Resources 9 | GameDataParser/Properties 10 | MapleServer2/Properties 11 | Maple2Storage/Resources 12 | Ms2Database/Migrations 13 | MapleWebServer/Data 14 | workspace.code-workspace 15 | .env 16 | MapleServer2/PacketStructures 17 | MapleServer2.sln.DotSettings.user 18 | Logs/ 19 | -------------------------------------------------------------------------------- /.luaFormatConfig: -------------------------------------------------------------------------------- 1 | #vscode-lua-format extension 2 | 3 | keep_simple_function_one_line: false 4 | keep_simple_control_block_one_line: false 5 | column_limit: 100 6 | double_quote_to_single_quote: true 7 | extra_sep_at_table_end: true 8 | spaces_inside_table_braces: true 9 | indent_width: 4 10 | chop_down_kv_table: true 11 | -------------------------------------------------------------------------------- /GameDataParser/Files/MetadataExporter/Exporter.cs: -------------------------------------------------------------------------------- 1 | namespace GameDataParser.Files.MetadataExporter; 2 | 3 | public abstract class Exporter : MetadataExporter 4 | { 5 | protected readonly MetadataResources Resources; 6 | 7 | protected Exporter(MetadataResources resources, string slug) : base(slug) 8 | { 9 | Resources = resources; 10 | } 11 | 12 | protected override bool Serialize() 13 | { 14 | Metadata entities = Parse(); 15 | return Write(entities); 16 | } 17 | 18 | protected abstract Metadata Parse(); 19 | } 20 | -------------------------------------------------------------------------------- /GameDataParser/Files/Resources.cs: -------------------------------------------------------------------------------- 1 | using Maple2.File.IO; 2 | using Maple2Storage.Types; 3 | 4 | namespace GameDataParser.Files; 5 | 6 | public class MetadataResources 7 | { 8 | public readonly M2dReader XmlReader; 9 | public readonly M2dReader ExportedReader; 10 | public readonly M2dReader TokReader; 11 | 12 | public MetadataResources() 13 | { 14 | string xmlPath = $"{Paths.RESOURCES_INPUT_DIR}/Xml.m2d"; 15 | string exportedPath = $"{Paths.RESOURCES_INPUT_DIR}/Exported.m2d"; 16 | string precomputedTerrainPath = $"{Paths.RESOURCES_INPUT_DIR}/PrecomputedTerrain.m2d"; 17 | 18 | XmlReader = new(xmlPath); 19 | ExportedReader = new(exportedPath); 20 | TokReader = new(precomputedTerrainPath); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /GameDataParser/GameDataParser.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net6.0 6 | 10 7 | enable 8 | enable 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-ad-banner-metadata-hash: -------------------------------------------------------------------------------- 1 | f397a77611fde1b6d59d07460be85cdb -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-additional-effect-metadata-hash: -------------------------------------------------------------------------------- 1 | 4e89147f056efac76151ef8d44fff98a -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-animation-metadata-hash: -------------------------------------------------------------------------------- 1 | bb321e0faa20069ab0fbe42769ca1e27 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-black-market-table-metadata-hash: -------------------------------------------------------------------------------- 1 | 5bb504fbeb5a7fed7bcedb90911d298c -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-character-create-metadata-hash: -------------------------------------------------------------------------------- 1 | 3b65561b1654d3556701f454e0cbbdef -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-chat-sticker-metadata-hash: -------------------------------------------------------------------------------- 1 | 4c210c95cf04d01f283130640fa031cc -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-color-palette-metadata-hash: -------------------------------------------------------------------------------- 1 | 6ab9bbb7de9c424e12ec8c4ef4d12108 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-constants-metadata-hash: -------------------------------------------------------------------------------- 1 | 0c0bd5efff4ac9bd1cab5df26f117c7f -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-default-items-metadata-hash: -------------------------------------------------------------------------------- 1 | 4fbb9f9fc42e80b386b760184815f4a7 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-dungeon-metadata-hash: -------------------------------------------------------------------------------- 1 | 94e06fa3e6572acb3a65fc1bd8a6f98a -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-enchant-limit-metadata-hash: -------------------------------------------------------------------------------- 1 | fbb824062907d9f49d911c4d87f5da9f -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-enchant-scroll-metadata-hash: -------------------------------------------------------------------------------- 1 | 9478a72055aca9686031ff9dfbc1be3b -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-exp-table-metadata-hash: -------------------------------------------------------------------------------- 1 | be67a739ff6054ed80159ad1f69bfdd7 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-field-war-metadata-hash: -------------------------------------------------------------------------------- 1 | 78f072aa905c8fcf4be66dcb653334ef -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-fish-metadata-hash: -------------------------------------------------------------------------------- 1 | 457aa2a5fb59f8fbbecf90e3ac7d7349 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-fishing-rod-metadata-hash: -------------------------------------------------------------------------------- 1 | a37b0383cb475fd254f2d6fe5e43dbdb -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-fishing-spot-metadata-hash: -------------------------------------------------------------------------------- 1 | 388142c751706f907638950841b973e0 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-function-cube-metadata-hash: -------------------------------------------------------------------------------- 1 | ac87bd62934b740bbb4b2d671a21c5a0 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-furnishing-shop-metadata-hash: -------------------------------------------------------------------------------- 1 | ffba4d68027111c57235df5d3a25900a -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-gacha-metadata-hash: -------------------------------------------------------------------------------- 1 | da3f06351725d1419623178dba023533 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-guild-buff-metadata-hash: -------------------------------------------------------------------------------- 1 | bf73ceaa1bc692d49d25b7e3e94344d9 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-guild-contribution-metadata-hash: -------------------------------------------------------------------------------- 1 | 8453d451ccd86b377971eecac233bb67 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-guild-house-metadata-hash: -------------------------------------------------------------------------------- 1 | b718d5a9306c9174b0869db266f18438 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-guild-property-metadata-hash: -------------------------------------------------------------------------------- 1 | 76dc753a9b35cb83ae8300c3b55c62e2 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-guild-service-metadata-hash: -------------------------------------------------------------------------------- 1 | 41888cbfca33b549007a013bdca91de1 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-home-template-metadata-hash: -------------------------------------------------------------------------------- 1 | 53902207fdfb4f914a17dd9255c78d27 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-insignia-metadata-hash: -------------------------------------------------------------------------------- 1 | 50de12f60f062da3e3a7986b0541897c -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-instrument-category-info-metadata-hash: -------------------------------------------------------------------------------- 1 | eb04945e2fea0acfade2b9e6c9161c9c -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-instrument-info-metadata-hash: -------------------------------------------------------------------------------- 1 | 56c43ba382b71846518a370ccd17b5f6 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-interact-object-metadata-hash: -------------------------------------------------------------------------------- 1 | 06999853f4ad3ca2aa3385d8b17e7e13 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-drop-metadata-hash: -------------------------------------------------------------------------------- 1 | 55a24e41b1e242de3c1cc96587c7df42 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-enchant-transfer-metadata-hash: -------------------------------------------------------------------------------- 1 | 53c0098c440927ba213ba3a874b520a0 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-exchange-scroll-metadata-hash: -------------------------------------------------------------------------------- 1 | aab9e246b0eff1b77a33529190793ab6 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-extraction-metadata-hash: -------------------------------------------------------------------------------- 1 | e765ce563581eea61c29df500a118be4 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-gemstone-upgrade-metadata-hash: -------------------------------------------------------------------------------- 1 | ee79280a696b039a2476db754f6511ab -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-metadata-hash: -------------------------------------------------------------------------------- 1 | 76337c6339d32dfd87aefb1ab4b4a4d7 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-option-constant-metadata-hash: -------------------------------------------------------------------------------- 1 | c1eab36b262d6e66869309ffbf6b708f -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-option-pick-metadata-hash: -------------------------------------------------------------------------------- 1 | e6ad9d14f866f0bf84450ef31a21fa51 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-option-random-metadata-hash: -------------------------------------------------------------------------------- 1 | 15d11aef5f1e3182ecec45ba6ecf8875 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-option-range-metadata-hash: -------------------------------------------------------------------------------- 1 | c6fba80fd0bcc578816a348ad11b81a3 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-option-static-metadata-hash: -------------------------------------------------------------------------------- 1 | 036125ac94c05c62747224ae0318d036 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-repackage-metadata-hash: -------------------------------------------------------------------------------- 1 | a0008054f1dcb3034fec9349b271195c -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-socket-metadata-hash: -------------------------------------------------------------------------------- 1 | d0387314cb981f6b0214539a33141765 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-item-socket-scroll-metadata-hash: -------------------------------------------------------------------------------- 1 | 9105c04b07764ab14bf983be5e770616 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-job-metadata-hash: -------------------------------------------------------------------------------- 1 | 1f244b098e6e1359d43fdd6b10ea38bb -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-magic-path-metadata-hash: -------------------------------------------------------------------------------- 1 | 908fe53bcbf3f2a3e84db20e5e835f44 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-map-metadata-hash: -------------------------------------------------------------------------------- 1 | 2bc82b664f6b4fb3528fd0bd006c4a97 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-mastery-factor-metadata-hash: -------------------------------------------------------------------------------- 1 | ad31b9200b6c6b9dc0e4722086e4613f -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-mastery-metadata-hash: -------------------------------------------------------------------------------- 1 | 8aed29df01388f63ac94a362dfb75bb6 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-mastery-ugc-housing-metadata-hash: -------------------------------------------------------------------------------- 1 | 1c8388ff2b78f82e9d74af367286ae08 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-meret-market-category-metadata-hash: -------------------------------------------------------------------------------- 1 | ff00f66718f6050ba229b5f280d02546 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-mount-metadata-hash: -------------------------------------------------------------------------------- 1 | 8d113456cb41408a50c92fda0ba359fa -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-npc-metadata-hash: -------------------------------------------------------------------------------- 1 | 8c4d69c64bb963811dfb1f850f5e3c91 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-premium-club-daily-benefit-metadata-hash: -------------------------------------------------------------------------------- 1 | 350077b8ee2b340da4c9f59eeeacee02 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-premium-club-effect-metadata-hash: -------------------------------------------------------------------------------- 1 | ae22ff8007b9c6a490d22c3f67381882 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-premium-club-package-metadata-hash: -------------------------------------------------------------------------------- 1 | 779cc580f54de1d89f5b2c86bdb21ef7 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-prestige-level-mission-metadata-hash: -------------------------------------------------------------------------------- 1 | 6381170c09d2585f05e5f050cb863332 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-prestige-reward-metadata-hash: -------------------------------------------------------------------------------- 1 | 1f521b1a574ebe0fc3597909a7407f8f -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-quest-metadata-hash: -------------------------------------------------------------------------------- 1 | 836d54c450e416dd2166d94832deadab -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-recipe-metadata-hash: -------------------------------------------------------------------------------- 1 | e8c426b4f61292d8faead577d70fe160 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-reward-content-metadata-hash: -------------------------------------------------------------------------------- 1 | ca7b4f30a279144a430b08c7f7e4e759 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-script-metadata-hash: -------------------------------------------------------------------------------- 1 | 7390cc80f641828d6a31f0475f150da9 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-set-item-info-metadata-hash: -------------------------------------------------------------------------------- 1 | 2d8750814f820192ac9f4b068f7ae2ff -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-set-item-option-metadata-hash: -------------------------------------------------------------------------------- 1 | b10985e02415c3f1515db118ed7791b5 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-skill-metadata-hash: -------------------------------------------------------------------------------- 1 | 2a21703652431a810cb1ae7f5f142976 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-survival-gold-pass-reward-metadata-hash: -------------------------------------------------------------------------------- 1 | f7c8ab48bcf39d690b879ac9623168c0 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-survival-level-metadata-hash: -------------------------------------------------------------------------------- 1 | 019fc1b0dc08ef3e60861d4cdd6f0f8e -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-survival-period-metadata-hash: -------------------------------------------------------------------------------- 1 | e1614f9f53c32f5fd35a35292315a135 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-survival-silver-pass-reward-metadata-hash: -------------------------------------------------------------------------------- 1 | c5cba0c26d8e06aa93b3997d996b8f28 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-title-metadata-hash: -------------------------------------------------------------------------------- 1 | 8e28070f96d989c9ae66e3e52ba0b193 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-trophy-metadata-hash: -------------------------------------------------------------------------------- 1 | 9754c45255f4e3a7be441981bbcc728e -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-ugc-design-metadata-hash: -------------------------------------------------------------------------------- 1 | 066b4afade7ee667fae2e99a0989c343 -------------------------------------------------------------------------------- /GameDataParser/Hash/ms2-ugc-map-metadata-hash: -------------------------------------------------------------------------------- 1 | 545ddf49a65bf4dc0aa78827f5b84e29 -------------------------------------------------------------------------------- /GameDataParser/Parsers/Helpers/ParserHelper.cs: -------------------------------------------------------------------------------- 1 | using System.Xml; 2 | 3 | namespace GameDataParser.Parsers.Helpers; 4 | 5 | public static class ParserHelper 6 | { 7 | public static bool CheckForNull(XmlNode? node, params string[] attributes) 8 | { 9 | if (node?.Attributes is null) 10 | { 11 | return true; 12 | } 13 | 14 | foreach (string attribute in attributes) 15 | { 16 | if (node.Attributes[attribute] is null) 17 | { 18 | return true; 19 | } 20 | } 21 | 22 | return false; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/BeautyShopType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum BeautyShopType 4 | { 5 | Hair = 1, 6 | Makeup = 2, 7 | Face = 3, 8 | Skin = 4, 9 | Dye = 5 10 | } 11 | public enum BeautyCategory : byte 12 | { 13 | Standard = 1, 14 | Special = 2, 15 | Dye = 3, 16 | Save = 4 17 | } 18 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/CurrencyType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum CurrencyType : byte 4 | { 5 | Meso, 6 | ValorToken = 3, 7 | Treva = 4, 8 | Rue = 5, 9 | HaviFruit = 6, 10 | Meret = 7, 11 | GameMeret = 8, 12 | EventMeret = 9, 13 | // ReverseCoin = 9, also 9? 14 | MentorPoints = 10, 15 | MenteePoints = 11, 16 | MesoToken = 13, 17 | BankMesos 18 | } 19 | 20 | public enum GameEventCurrencyType : byte 21 | { 22 | None = 0, 23 | Meso = 1, 24 | Meret = 2 25 | } 26 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/EnchantScrollType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum EnchantScrollType : short 4 | { 5 | EnchantLevel = 1, 6 | StatReroller = 2, 7 | RandomEnchant = 3, 8 | Rune = 4 9 | } 10 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/GemSlot.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | 3 | namespace Maple2Storage.Enums; 4 | 5 | public enum GemSlot : byte 6 | { 7 | [Description("None")] 8 | NONE = 0, 9 | [Description("Transparency Badge")] 10 | TRANS = 1, 11 | [Description("Damage Font")] 12 | DAMAGE = 2, 13 | [Description("Chat Bubble")] 14 | CHAT = 3, 15 | [Description("Name Tag")] 16 | NAME = 4, 17 | [Description("Tombstone Style")] 18 | TOMBSTONE = 5, 19 | [Description("Swim Tube")] 20 | SWIM = 6, 21 | [Description("Buddy Badge")] 22 | BUDDY = 7, 23 | [Description("Fishing Accessories")] 24 | FISHING = 8, 25 | [Description("Auto-Gathering Badge")] 26 | GATHER = 9, 27 | [Description("Effects Badge")] 28 | EFFECT = 10, 29 | [Description("Pet Skin")] 30 | PET = 11, 31 | [Description("Meta")] 32 | META = 12 33 | } 34 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/Gender.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum Gender : byte 4 | { 5 | Male = 0, 6 | Female = 1, 7 | Neutral = 2 8 | } 9 | 10 | [Flags] 11 | public enum GenderFlag : byte 12 | { 13 | Male = 1, 14 | Female = 2 15 | } 16 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/InteractObjectType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum InteractObjectType : byte 4 | { 5 | None = 0, 6 | Common = 1, 7 | Binoculars = 2, 8 | Ui = 3, 9 | RankBoard = 5, 10 | Gathering = 6, 11 | GuildPoster = 7, 12 | AdBalloon = 8, 13 | MushkingTower = 9 14 | } 15 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/InventoryTab.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum InventoryTab : byte 4 | { 5 | Gear = 0, 6 | Outfit = 1, 7 | Mount = 2, 8 | Catalyst = 3, 9 | FishingMusic = 4, 10 | Quest = 5, 11 | Gemstone = 6, 12 | Misc = 7, 13 | // 8 Removed 14 | LifeSkill = 9, 15 | Pets = 10, 16 | Consumable = 11, 17 | Currency = 12, 18 | Badge = 13, 19 | // Survival = 14, 20 | Lapenshard = 15, 21 | Fragment = 16 22 | } 23 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/ItemExpirationType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum ItemExpirationType : byte 4 | { 5 | None = 0, 6 | Weeks = 1, 7 | Months = 2 8 | } 9 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/ItemHousingCategory.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum ItemHousingCategory : short 4 | { 5 | None = 0, 6 | Bed = 1, 7 | Table = 2, 8 | SofasChairs = 3, 9 | Storage = 4, 10 | WallDecoration = 5, 11 | WallTiles = 6, 12 | Bathroom = 7, 13 | Lighting = 8, 14 | Electronics = 9, 15 | Fences = 10, 16 | NaturalTerrain = 11, 17 | Garden = 12, 18 | SpecialBlocks = 13, 19 | Stairs = 14, 20 | Doors = 15, 21 | CommonTerrain = 16, 22 | Vegetation = 17, 23 | InteriorDecor = 18, 24 | ThemedDecor = 19, 25 | Structures = 20, 26 | Traps = 21, 27 | Maid = 91, 28 | Souvenirs = 92, 29 | UgcBlock = 93, 30 | Event = 94, 31 | UgcBed = 95, 32 | UgcTable = 96, 33 | UgcStairs = 97, 34 | Ranching = 204, 35 | Farming = 205, 36 | Misc = 10000 37 | } 38 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/ItemOptionRangeType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum ItemOptionRangeType 4 | { 5 | itemoptionvariation_acc, 6 | itemoptionvariation_armor, 7 | itemoptionvariation_pet, 8 | itemoptionvariation_weapon 9 | } 10 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/ItemSkinType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum ItemSkinType 4 | { 5 | None = 0, 6 | Special = 1, // sold for meret and is part of a set. More expensive 7 | Normal = 2, // sold for meret, less expensive 8 | Event = 3, 9 | InGameObtainable = 4, 10 | Default = 99 // used on ugc templates and tutorial gear 11 | } 12 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/ItemTransferFlag.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | [Flags] 4 | public enum ItemTransferFlag : byte 5 | { 6 | Untradeable = 0, 7 | Unknown1 = 1, 8 | Splitable = 2, 9 | Tradeable = 4, 10 | Binds = 8, 11 | LimitedTradeCount = 16, 12 | Unknown3 = 32 13 | } 14 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/ItemType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum ItemType 4 | { 5 | None, 6 | Currency, 7 | Furnishing, 8 | Pet, 9 | Lapenshard, 10 | Medal, 11 | Earring = 12, 12 | Hat = 13, 13 | Clothes = 14, 14 | Pants = 15, 15 | Gloves = 16, 16 | Shoes = 17, 17 | Cape = 18, 18 | Necklace = 19, 19 | Ring = 20, 20 | Belt = 21, 21 | Overall = 22, 22 | Bludgeon = 30, 23 | Dagger = 31, 24 | Longsword = 32, 25 | Scepter = 33, 26 | ThrowingStar = 34, 27 | Spellbook = 40, 28 | Shield = 41, 29 | Greatsword = 50, 30 | Bow = 51, 31 | Staff = 52, 32 | Cannon = 53, 33 | Blade = 54, 34 | Knuckle = 55, 35 | Orb = 56 36 | } 37 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/MedalSlot.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum MedalSlot : byte 4 | { 5 | Tail = 0, 6 | GroundMount = 1, 7 | Glider = 2 8 | } 9 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/NpcAction.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum NpcAction : byte 4 | { 5 | None = 0, 6 | Idle = 1, 7 | Walk = 2, 8 | Bore, 9 | Run, 10 | Jump = 6, 11 | Dead = 12, 12 | Hit = 13, 13 | Skill = 16, 14 | Spawn = 17, 15 | Stun = 18, 16 | Talk = 22, 17 | Regen = 23, 18 | Puppet = 35, 19 | SummonPortal = 56 20 | } 21 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/NpcState.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum NpcState : byte 4 | { 5 | Normal, 6 | Combat, 7 | Dead, 8 | Spawn, 9 | EnterAttackRange, 10 | EnterProjectileRange 11 | } 12 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/NpcType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum NpcType 4 | { 5 | Enemy = 0, 6 | Ally = 1, 7 | Friendly = 2 8 | } 9 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/PatchType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum PatchType : byte 4 | { 5 | Delete = 0, 6 | Patch = 1, 7 | Ignore = 2 8 | } 9 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/PortalTypes.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum PortalTypes : byte 4 | { 5 | Field = 0x00, 6 | DungeonReturnToLobby = 0x01, 7 | DungeonEnter = 0x09, 8 | Home = 0x0B, 9 | LeaveDungeon = 0x0D 10 | } 11 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/QuestState.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum QuestState 4 | { 5 | None = 0, 6 | Started = 1, 7 | Completed = 2, 8 | } 9 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/QuestType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum QuestType : byte 4 | { 5 | Epic = 0, 6 | World = 1, 7 | Event = 2, 8 | Navigator = 3, 9 | Exploration = 4, 10 | EventStamp = 5, 11 | Guild = 6, 12 | Mentoring = 7, 13 | Field = 8, 14 | Faction = 9, 15 | Marriage = 10 16 | } 17 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/RewardType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum RewardType : byte 4 | { 5 | None = 0x0, 6 | itemcoloring = 0x1, 7 | shop_ride = 0x2, 8 | title = 0x3, 9 | beauty_hair = 0x4, 10 | statPoint = 0x5, 11 | skillPoint = 0x6, 12 | beauty_makeup = 0x7, 13 | shop_build = 0x8, 14 | item = 0x9, 15 | shop_weapon = 0xa, 16 | dynamicaction = 0xb, 17 | etc = 0xc, 18 | beauty_skin = 0xd 19 | } 20 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/ShopCurrencyType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum ShopCurrencyType : byte 4 | { 5 | Meso = 0, 6 | Item = 1, 7 | ValorToken = 2, 8 | Treva = 3, 9 | Meret = 4, 10 | Rue = 5, 11 | HaviFruit = 6, 12 | GuildCoin = 7, 13 | ReverseCoin = 8, 14 | EventMeret = 9, 15 | GameMeret = 10, 16 | MentorPoints = 11, 17 | MenteePoints = 12, 18 | EventToken = 13 19 | } 20 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/ShopItemLabel.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum ShopItemLabel : byte 4 | { 5 | None = 0, 6 | New = 1, 7 | Event = 2, 8 | HalfPrice = 3, 9 | Special = 4 10 | } 11 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/ShopType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum ShopType : byte 4 | { 5 | Default = 0, 6 | Unk = 1, 7 | Star = 2, 8 | StyleCrate = 3, 9 | Capsule = 4 10 | } 11 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/TransferType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | public enum TransferType : byte 4 | { 5 | Tradeable = 0, 6 | Untradeable = 1, 7 | BindOnLoot = 2, 8 | BindOnEquip = 3, 9 | BindOnUse = 4, 10 | BindOnTrade = 5, 11 | TradeableOnBlackMarket = 6, // ?? 12 | BindOnSummonEnchantOrReroll = 7 13 | } 14 | -------------------------------------------------------------------------------- /Maple2Storage/Enums/UGCType.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Enums; 2 | 3 | // All valid UGC types 4 | public enum UGCType : byte 5 | { 6 | None = 0x00, 7 | Item = 0x01, 8 | Furniture = 0x02, 9 | Banner = 0x03, 10 | Unk = 0x04, 11 | ProfileAvatar = 0x05, 12 | GuildEmblem = 0x06, 13 | Mount = 0x07, 14 | GuildBanner = 0x08, 15 | Unk5 = 0x09, 16 | Unk6 = 0x0A, 17 | ItemIcon = 0xC9, 18 | Unk8 = 0xCA, 19 | Unk9 = 0xD1 20 | } 21 | -------------------------------------------------------------------------------- /Maple2Storage/Extensions/StringExtensions.cs: -------------------------------------------------------------------------------- 1 | using Pastel; 2 | 3 | namespace Maple2Storage.Extensions; 4 | 5 | public static class StringExtensions 6 | { 7 | public static string ColorGreen(this string input) 8 | { 9 | return input.Pastel("#aced66"); 10 | } 11 | 12 | public static string ColorRed(this string input) 13 | { 14 | return input.Pastel("#E05561"); 15 | } 16 | 17 | public static string ColorYellow(this string input) 18 | { 19 | return input.Pastel("#FFE212"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Maple2Storage/Maple2Storage.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Maple2Storage 5 | Maple2Storage 6 | net6.0 7 | 10 8 | enable 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Functions/ItemEnchantScroll/getSuccessRate.lua: -------------------------------------------------------------------------------- 1 | function getSuccessRate(scrollId) 2 | return 1 3 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Functions/ItemSocketScroll/getSocketCount.lua: -------------------------------------------------------------------------------- 1 | function getSocketCount(scrollId) 2 | local socketCount = 1 3 | local twoSocketScrolls = { 10000002, 10000012, 10000014, 10000023, 10000025, 10000027, 10000029, 10000032, 10000034, 10000036 } 4 | if tableHasValue(twoSocketScrolls, scrollId) then 5 | socketCount = 2 6 | elseif scrollId == 10000003 then 7 | socketCount = 3 8 | end 9 | return socketCount 10 | end 11 | 12 | function tableHasValue(tab, val) 13 | for index, value in ipairs(tab) do 14 | if value == val then 15 | return true 16 | end 17 | end 18 | 19 | return false 20 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Functions/ItemSocketScroll/getSuccessRate.lua: -------------------------------------------------------------------------------- 1 | function getSuccessRate(scrollId) 2 | return 1 3 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Functions/calcAirTaxiCost.lua: -------------------------------------------------------------------------------- 1 | function calcAirTaxiCost(playerLevel) 2 | local baseFee = 30000; 3 | return baseFee + math.max(playerLevel - 10, 0) * 500 4 | end 5 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Functions/calcBlackMarketCostRate.lua: -------------------------------------------------------------------------------- 1 | function calcBlackMarketCostRate() 2 | return 0.1 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Functions/calcGetGemStonePutOffPrice.lua: -------------------------------------------------------------------------------- 1 | function calcGetGemStonePutOffPrice(gemStoneLevel, itemTab) 2 | local ingredientTag = 'CrystalPiece' 3 | local lumiStoneCost = 0 4 | local gemStoneCost = 0 5 | if itemTab > 0 then 6 | return ingredientTag, lumiStoneCost 7 | end 8 | gemStoneCost = 8 + gemStoneLevel * 2 9 | return ingredientTag, gemStoneCost 10 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Functions/calcItemSocketUnlockIngredient.lua: -------------------------------------------------------------------------------- 1 | -- Calculates cost and ingredient type to unlock gem socket 2 | calcItemSocketUnlockIngredient = function(rarity, socketSlot, itemTab) 3 | local ingredientCost = 0 4 | if itemTab == 0 then 5 | ingredientCost = (200 + (math.max(((math.min(50, socketSlot)) - 50), 0) * 20)) * math.max((rarity - 3), 1) 6 | return 'CrystalPiece', ingredientCost 7 | elseif itemTab > 0 then 8 | return 'SkinCrystal', 690 9 | end 10 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Functions/calcKillCountBonusExpRate.lua: -------------------------------------------------------------------------------- 1 | function calcKillCountBonusExpRate(killCount) 2 | if killCount > 100 then 3 | return 0.15 4 | elseif killCount > 50 then 5 | return 0.1 6 | elseif killCount > 40 then 7 | return 0.07 8 | elseif killCount > 30 then 9 | return 0.04 10 | elseif killCount > 20 then 11 | return 0.01 12 | end 13 | return 0 14 | end 15 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Functions/calcMeretMarketRegisterFee.lua: -------------------------------------------------------------------------------- 1 | function calcMeretMarketRegisterFee(activeListingCount) 2 | if activeListingCount == 0 then 3 | return 190 4 | elseif activeListingCount == 1 then 5 | return 290 6 | else 7 | return 390 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Functions/calcTaxiCost.lua: -------------------------------------------------------------------------------- 1 | function calcTaxiCost(maps, level) 2 | local cost = 0 3 | 4 | if level <= 24 then 5 | cost = 0.35307 * level ^ 2 + -1.4401 * level + 34.075 6 | else 7 | cost = 0.23451 * (level - 24) ^ 2 + 24.221 * (level - 24) + 265.66 8 | end 9 | 10 | return math.floor((cost) * maps / 2 + 0.5) 11 | end 12 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000001.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > .5 and 10 or 20) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000002.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > .5 and 10 or 20) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000003.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000021) then 3 | return 60 4 | end 5 | return 50 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000005.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000061) then 3 | return 80 4 | end 5 | return 90 6 | end 7 | 8 | function postTalkActions() 9 | return 99 10 | end 11 | 12 | function actionMoveMap() 13 | return 2000062, 13 -- Lith Harbor, portal 13 14 | end 15 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000007.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().MapId == 2000146 then 3 | return 30 4 | end 5 | return 40 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000020.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > .5 and 30 or 40) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000021.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001000) then 3 | return 40 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000024.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000020) then 3 | return 40 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000025.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000020) then 3 | return 60 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000033.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted({ 3 | 50001573, 50001580, 50001581, 50001582, 50001583, 50001584, 50001603, 50001604, 50001665, 50001669 4 | }) and ScriptManager.GetPlayer().MapId == 02000023 then 5 | return 40 6 | end 7 | return 50 8 | end 9 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000037.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().GetItemCount(30000435) > 0 then 3 | return 40 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000040.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local jobId = ScriptManager.GetPlayer().JobId 3 | return jobId + 10 4 | end 5 | 6 | function meetsJobScriptRequirement() 7 | return ScriptManager.GetPlayer().JobId == 1 and ScriptManager.GetPlayer().Level >= 10 8 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000041.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local jobId = ScriptManager.GetPlayer().JobId 3 | if jobId == 10 then 4 | return 30 5 | elseif jobId == 20 then 6 | return 20 7 | end 8 | return jobId + 10 9 | end 10 | 11 | function meetsJobScriptRequirement() 12 | return ScriptManager.GetPlayer().JobId == 1 and ScriptManager.GetPlayer().Level >= 10 13 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000042.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local jobId = ScriptManager.GetPlayer().JobId 3 | if jobId == 10 then 4 | return 30 5 | elseif jobId == 20 then 6 | return 40 7 | elseif jobId == 30 then 8 | return 20 9 | else 10 | return ScriptManager.GetPlayer().JobId + 10 11 | end 12 | return -1 13 | end 14 | 15 | function meetsJobScriptRequirement() 16 | return ScriptManager.GetPlayer().JobId == 1 and ScriptManager.GetPlayer().Level >= 10 17 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000043.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local jobId = ScriptManager.GetPlayer().JobId 3 | if jobId == 40 then 4 | return 20 5 | elseif jobId < 50 then 6 | return jobId + 20 7 | end 8 | return jobId + 10 9 | end 10 | 11 | function meetsJobScriptRequirement() 12 | return ScriptManager.GetPlayer().JobId == 1 and ScriptManager.GetPlayer().Level >= 10 13 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000045.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local jobId = ScriptManager.GetPlayer().JobId 3 | if jobId == 50 then 4 | return 20 5 | elseif jobId < 50 then 6 | return jobId + 20 7 | end 8 | return jobId + 10 9 | end 10 | 11 | function meetsJobScriptRequirement() 12 | return ScriptManager.GetPlayer().JobId == 1 and ScriptManager.GetPlayer().Level >= 10 13 | end 14 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000046.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local jobId = ScriptManager.GetPlayer().JobId 3 | if jobId == 60 then 4 | return 20 5 | elseif jobId < 60 then 6 | return jobId + 20 7 | end 8 | return jobId + 10 9 | end 10 | 11 | function meetsJobScriptRequirement() 12 | return ScriptManager.GetPlayer().JobId == 1 and ScriptManager.GetPlayer().Level >= 10 13 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000050.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local jobId = ScriptManager.GetPlayer().JobId 3 | if jobId == 70 then 4 | return 20 5 | elseif jobId < 70 then 6 | return jobId + 20 7 | end 8 | return jobId + 10 9 | end 10 | 11 | function meetsJobScriptRequirement() 12 | return ScriptManager.GetPlayer().JobId == 1 and ScriptManager.GetPlayer().Level >= 10 13 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000051.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local jobId = ScriptManager.GetPlayer().JobId 3 | if jobId == 80 then 4 | return 20 5 | elseif jobId < 80 then 6 | return jobId + 20 7 | end 8 | return jobId + 10 9 | end 10 | 11 | function meetsJobScriptRequirement() 12 | return ScriptManager.GetPlayer().JobId == 1 and ScriptManager.GetPlayer().Level >= 10 13 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000053.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > .5 and 30 or 40) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000054.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > .5 and 30 or 40) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000058.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local x = math.random() 3 | if x >= 0.66 then 4 | return 50 5 | elseif x > 0.33 and x < 0.66 then 6 | return 40 7 | end 8 | return 30 9 | end 10 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000064.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local x = math.random() 3 | if x >= 0.66 then 4 | return 50 5 | elseif x > 0.33 and x < 0.66 then 6 | return 40 7 | end 8 | return 30 9 | end 10 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000071.lua: -------------------------------------------------------------------------------- 1 | -- Doctor Dixon 2 | function meetsJobScriptRequirement() 3 | return true; -- does not have any requirement 4 | end 5 | 6 | function postTalkActions(functionId) 7 | if functionId == 1 then 8 | return 3,4 9 | end 10 | end 11 | 12 | function actionWindow() 13 | return "BeautyShopDialog", "face" 14 | end 15 | 16 | function actionPortal() 17 | return 99 18 | end 19 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000072.lua: -------------------------------------------------------------------------------- 1 | -- Doctor Zenko 2 | function meetsJobScriptRequirement() 3 | return true; -- does not have any requirement 4 | end 5 | 6 | function postTalkActions(functionId) 7 | if functionId == 1 then 8 | return 3,4 9 | end 10 | end 11 | 12 | function actionWindow() 13 | return "BeautyShopDialog", "skin" 14 | end 15 | 16 | function actionPortal() 17 | return 99 18 | end 19 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000074.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000022) then 3 | return 40 4 | end 5 | return (math.random() > 0.7 and 20 or 10) 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000075.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | --[[In GMS2, the original behavior of this NPC was that it randomly picked between scripts 10 and 20, and seen in the commented code below. 3 | math.randomseed(os.time()) 4 | return (math.random() > 0.5 and 10 or 20) 5 | However, script 10 directly references the old pre-restart and, therefore, harms the game's lore, worldbuilding and UX. 6 | Due to these issues, I have personally decided to change the NPC's behavior, even if it means contradicting the original game's. 7 | If you'd rather use the original NPC's script, please uncomment the code above and comment the code below.]] 8 | return 20 9 | end 10 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000096.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return 40 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000098.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > .5 and 30 or 40) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000106.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000020) then 3 | return 50 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000110.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > .5 and 30 or 50) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000119.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000022) then 3 | return 70 4 | end 5 | return (math.random() > 0.7 and 40 or 120) 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000139.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 40 or 50) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000143.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 40 or 50) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000144.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 20 or 50) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000145.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 20 or 30) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000146.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local x = math.random() 3 | if x >= 0.66 then 4 | return 50 5 | elseif x > 0.33 and x < 0.66 then 6 | return 40 7 | end 8 | return 30 9 | end 10 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000157.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000061) then 3 | return 30 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000158.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000061) then 3 | return 40 4 | end 5 | return (math.random() > 0.5 and 20 or 30) 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000159.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | --on vanilla the npc randomizes between the two scripts. broken behavior? 3 | if ScriptManager.GetPlayer().HasQuestStarted(40001050) then 4 | return 30 5 | end 6 | return 20 7 | end 8 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000160.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000022) then 3 | return 70 4 | elseif ScriptManager.GetPlayer().HasQuestStarted(80000614) then 5 | return 80 6 | end 7 | return 60 8 | end 9 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000164.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 30 or 40) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000169.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001025) then 3 | return 50 4 | end 5 | return 70 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000170.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(60100020) then 3 | return 40 4 | end 5 | return 20 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000171.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001023) then 3 | return 20 4 | elseif ScriptManager.GetPlayer().HasQuestStarted(60100040) then 5 | return 50 6 | end 7 | return 30 8 | end 9 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000173.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001662) then 3 | return 40 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000179.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestCompleted(10001005) then 3 | return 70 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000186.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 50 or 60) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000188.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 20 or 30) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000190.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 40 or 30) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000191.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 20 or 30) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000200.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 40 or 30) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000201.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 40 or 30) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000203.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 20 or 30) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000208.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001171) then 3 | return 30 4 | end 5 | return 20 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000212.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001171) then 3 | return 40 4 | end 5 | return 20 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000220.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 20 or 30) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000233.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001221) then 3 | return 20 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000234.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001221) then 3 | return 20 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000244.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 40 or 50) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000251.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 20 or 30) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000253.lua: -------------------------------------------------------------------------------- 1 | -- Mino 2 | function meetsJobScriptRequirement() 3 | return true; -- does not have any requirement 4 | end 5 | 6 | function postTalkActions(functionId) 7 | if functionId == 1 then 8 | return 3,4 9 | end 10 | end 11 | 12 | function actionWindow() 13 | return "BeautyShopDialog", "hair,styleSave" 14 | end 15 | 16 | function actionPortal() 17 | return 99 18 | end 19 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000254.lua: -------------------------------------------------------------------------------- 1 | -- Jane 2 | function handleGoto(nextScript) 3 | local itemCount = ScriptManager.GetPlayer().GetItemCount(39000014); 4 | if nextScript == 61 and itemCount >= 1 then 5 | return 62 6 | else 7 | return 61 8 | end 9 | end 10 | 11 | function preTalkActions(functionId) 12 | if functionId == 1 then 13 | return 5 14 | end 15 | end 16 | 17 | function actionItemReward() 18 | return 39000014, 1, 1 19 | end 20 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000255.lua: -------------------------------------------------------------------------------- 1 | -- Rosetta 2 | function meetsJobScriptRequirement() 3 | return true; -- does not have any requirement 4 | end 5 | 6 | function postTalkActions(functionId) 7 | if functionId == 1 then 8 | return 3,4 9 | end 10 | end 11 | 12 | function actionWindow() 13 | return "BeautyShopDialog", "hair,style" 14 | end 15 | 16 | function actionPortal() 17 | return 99 18 | end 19 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000256.lua: -------------------------------------------------------------------------------- 1 | -- Ren 2 | function meetsJobScriptRequirement() 3 | return true; -- does not have any requirement 4 | end 5 | 6 | function postTalkActions(functionId) 7 | if functionId == 1 then 8 | return 3,4 9 | end 10 | end 11 | 12 | function actionWindow() 13 | return "BeautyShopDialog", "makeup" 14 | end 15 | 16 | function actionPortal() 17 | return 99 18 | end 19 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000257.lua: -------------------------------------------------------------------------------- 1 | -- Douglas 2 | function meetsJobScriptRequirement() 3 | return true; -- does not have any requirement 4 | end 5 | 6 | function postTalkActions(functionId) 7 | if functionId == 1 then 8 | return 3,4 9 | end 10 | end 11 | 12 | function actionWindow() 13 | return "BeautyShopDialog", "itemcolor" 14 | end 15 | 16 | function actionPortal() 17 | return 99 18 | end 19 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000259.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return 10 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000264.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 40 or 30) 3 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000266.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return 20 3 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000283.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local x = math.random() 3 | if x >= 0.66 then 4 | return 50 5 | elseif x > 0.33 and x < 0.66 then 6 | return 60 7 | end 8 | return 30 9 | end 10 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000323.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local x = math.random() 3 | if x >= 0.75 then 4 | return 40 5 | elseif x >= 0.5 and x < 0.75 then 6 | return 50 7 | elseif x > 0.25 and x < 0.5 then 8 | return 60 9 | end 10 | return 70 11 | end 12 | 13 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000327.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | --Natalie's key recognition dialog has been erased in NA locale since PNL 3 | return 70 4 | end 5 | 6 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000331.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 20 or 30) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000340.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 40 or 30) 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000348.lua: -------------------------------------------------------------------------------- 1 | function handleGoto(nextScript) 2 | if nextScript == 61 then 3 | jobId = ScriptManager.GetPlayer().JobId 4 | 5 | if jobId <= 80 and jobId > 1 then 6 | return 60 + jobId / 10 7 | elseif jobId >= 90 then 8 | return jobId - 20 9 | elseif jobId == 1 then 10 | return 69 11 | end 12 | end 13 | 14 | return nextScript 15 | end 16 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000349.lua: -------------------------------------------------------------------------------- 1 | function handleGoto(nextScript) 2 | if nextScript == 61 then 3 | jobId = ScriptManager.GetPlayer().JobId 4 | 5 | if jobId <= 80 and jobId > 1 then 6 | return 60 + jobId / 10 7 | elseif jobId >= 90 then 8 | return jobId - 20 9 | elseif jobId == 1 then 10 | return 69 11 | end 12 | end 13 | 14 | return nextScript 15 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000351.lua: -------------------------------------------------------------------------------- 1 | -- Mirror 2 | function meetsJobScriptRequirement() 3 | return true; -- does not have any requirement 4 | end 5 | 6 | function preTalkActions(functionId) 7 | if functionId == 1 then 8 | return 3,4 9 | end 10 | end 11 | 12 | function actionWindow() 13 | return "BeautyShopDialog", "mirror" 14 | end 15 | 16 | function actionPortal() 17 | return 99 18 | end 19 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000354.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local x = math.random() 3 | if x >= 0.66 then 4 | return 50 5 | elseif x > 0.33 and x < 0.66 then 6 | return 40 7 | end 8 | return 30 9 | end 10 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000359.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | local x = ScriptManager.GetPlayer().GetItemCount(30000098); 3 | if ScriptManager.GetPlayer().HasQuestStarted(20001050) and x > 0 then 4 | return 30 5 | end 6 | return 20 7 | end 8 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000373.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000021) then 3 | return 30 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000374.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 60 or 30) 3 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000390.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 20 or 30) 3 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000396.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001150) then 3 | return 30 4 | end 5 | return 20 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000400.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001742) then 3 | return 20 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000401.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001322) then 3 | return 20 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000402.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001750) then 3 | return 20 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000404.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 60 or 40) 3 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000406.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(80000613) then 3 | return 30 4 | end 5 | return 20 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000408.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(90000180) then 3 | return 20 4 | end 5 | return 10 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000409.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(90000190) then 3 | return 20 4 | end 5 | return 10 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000420.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | return (math.random() > 0.5 and 90 or 100) 3 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000422.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(10001804) then 3 | return 20 4 | end 5 | return 10 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000429.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(20001061) then 3 | return (math.random() > 0.5 and 41 or 40) 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000430.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(20001061) then 3 | return (math.random() > 0.5 and 41 or 40) 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000431.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(20001061) then 3 | return (math.random() > 0.5 and 41 or 40) 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000432.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(20001061) then 3 | return (math.random() > 0.5 and 41 or 40) 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000450.lua: -------------------------------------------------------------------------------- 1 | function handleGoto(nextScript) 2 | if nextScript == 61 then 3 | jobId = ScriptManager.GetPlayer().JobId 4 | 5 | if jobId <= 80 and jobId > 1 then 6 | return 60 + jobId / 10 7 | elseif jobId >= 90 then 8 | return jobId - 20 9 | elseif jobId == 1 then 10 | return 69 11 | end 12 | end 13 | 14 | return nextScript 15 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000451.lua: -------------------------------------------------------------------------------- 1 | function handleGoto(nextScript) 2 | if nextScript == 61 then 3 | jobId = ScriptManager.GetPlayer().JobId 4 | 5 | if jobId <= 80 and jobId > 1 then 6 | return 60 + jobId / 10 7 | elseif jobId >= 90 then 8 | return jobId - 20 9 | elseif jobId == 1 then 10 | return 69 11 | end 12 | end 13 | 14 | return nextScript 15 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000452.lua: -------------------------------------------------------------------------------- 1 | function handleGoto(nextScript) 2 | if nextScript == 61 then 3 | jobId = ScriptManager.GetPlayer().JobId 4 | 5 | if jobId <= 80 and jobId > 1 then 6 | return 60 + jobId / 10 7 | elseif jobId >= 90 then 8 | return jobId - 20 9 | elseif jobId == 1 then 10 | return 69 11 | end 12 | end 13 | 14 | return nextScript 15 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000585.lua: -------------------------------------------------------------------------------- 1 | function meetsJobScriptRequirement() 2 | return ScriptManager.GetPlayer().HasSufficientMesos(1000); 3 | end 4 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000601.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000022) then 3 | return 40 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11000994.lua: -------------------------------------------------------------------------------- 1 | -- Lotachi 2 | function meetsJobScriptRequirement() 3 | return ScriptManager.GetPlayer().HasQuestStarted(10001840) 4 | end 5 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11001257.lua: -------------------------------------------------------------------------------- 1 | function meetsJobScriptRequirement() 2 | if ScriptManager.GetPlayer().HasQuestStarted(90000419) then 3 | return true; 4 | end 5 | return false 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11001513.lua: -------------------------------------------------------------------------------- 1 | -- Paulie 2 | function meetsJobScriptRequirement() 3 | return true; -- does not have any requirement 4 | end 5 | 6 | function postTalkActions(functionId) 7 | if functionId == 1 then 8 | return 3,4 9 | end 10 | end 11 | 12 | function actionWindow() 13 | return "BeautyShopDialog", "hair,random" 14 | end 15 | 16 | function actionPortal() 17 | return 99 18 | end 19 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11001514.lua: -------------------------------------------------------------------------------- 1 | -- Lolly 2 | function meetsJobScriptRequirement() 3 | return true; -- does not have any requirement 4 | end 5 | 6 | function postTalkActions(functionId) 7 | if functionId == 1 then 8 | return 3,4 9 | end 10 | end 11 | 12 | function actionWindow() 13 | return "BeautyShopDialog", "hair,style" 14 | end 15 | 16 | function actionPortal() 17 | return 99 18 | end 19 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11001677.lua: -------------------------------------------------------------------------------- 1 | function handleGoto(nextScript) 2 | if nextScript == 61 then 3 | jobId = ScriptManager.GetPlayer().JobId 4 | 5 | if jobId <= 80 and jobId > 1 then 6 | return 60 + jobId / 10 7 | elseif jobId >= 90 then 8 | return jobId - 20 9 | elseif jobId == 1 then 10 | return 69 11 | end 12 | end 13 | 14 | return nextScript 15 | end -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11004319.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000680) then 3 | return 30 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11004320.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000680) then 3 | return 30 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11004321.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000680) then 3 | return 30 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11004322.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000680) then 3 | return 30 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11004323.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000690) then 3 | return 10 4 | end 5 | return 40 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11004324.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000690) then 3 | return 10 4 | end 5 | return 30 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11004329.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000720) then 3 | return 30 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11004330.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000720) then 3 | return 30 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11004331.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000700) then 3 | return 30 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Scripts/Npcs/11004332.lua: -------------------------------------------------------------------------------- 1 | function getFirstScriptId() 2 | if ScriptManager.GetPlayer().HasQuestStarted(91000700) then 3 | return 30 4 | end 5 | return -1 6 | end 7 | -------------------------------------------------------------------------------- /Maple2Storage/Tools/DotEnv.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Tools; 2 | 3 | public static class DotEnv 4 | { 5 | public static void Load(string filePath) 6 | { 7 | foreach (string line in File.ReadAllLines(filePath)) 8 | { 9 | string[] parts = line.Split('=', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); 10 | 11 | if (parts.Length != 2) 12 | { 13 | continue; 14 | } 15 | 16 | Environment.SetEnvironmentVariable(parts[0], parts[1]); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Block.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Types; 2 | 3 | public static class Block 4 | { 5 | public const int BLOCK_SIZE = 150; 6 | 7 | public static CoordF ClosestBlock(CoordF coord) 8 | { 9 | return CoordF.From( 10 | MathF.Round(coord.X / BLOCK_SIZE) * BLOCK_SIZE, 11 | MathF.Round(coord.Y / BLOCK_SIZE) * BLOCK_SIZE, 12 | MathF.Floor(coord.Z / BLOCK_SIZE) * BLOCK_SIZE 13 | ); 14 | } 15 | 16 | public static CoordS ClosestBlock(CoordS coord) 17 | { 18 | return CoordS.From( 19 | (short) (MathF.Round((float) coord.X / BLOCK_SIZE) * BLOCK_SIZE), 20 | (short) (MathF.Round((float) coord.Y / BLOCK_SIZE) * BLOCK_SIZE), 21 | (short) (MathF.Floor((float) coord.Z / BLOCK_SIZE) * BLOCK_SIZE) 22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Direction.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Types; 2 | 3 | public static class Direction 4 | { 5 | public const int SOUTH_EAST = 0; 6 | public const int NORTH_EAST = 90; 7 | public const int NORTH_WEST = 180; 8 | public const int SOUTH_WEST = 270; 9 | 10 | public static int GetClosestDirection(CoordF rotation) 11 | { 12 | int[] directions = new int[4] 13 | { 14 | SOUTH_EAST, NORTH_EAST, NORTH_WEST, SOUTH_WEST 15 | }; 16 | 17 | return directions.OrderBy(x => Math.Abs(x - rotation.Z)).First(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Maple2Storage/Types/HatData.cs: -------------------------------------------------------------------------------- 1 | namespace Maple2Storage.Types; 2 | 3 | public struct HatData 4 | { 5 | // Unsure if these are the correct coords for each 6 | public CoordF XPosition { get; private set; } 7 | public CoordF YPosition { get; private set; } 8 | public CoordF ZPosition { get; private set; } 9 | public CoordF Rotation { get; private set; } 10 | public float Offset { get; private set; } 11 | 12 | public HatData(float offset, CoordF xPosition, CoordF yPosition, CoordF zPosition, CoordF rotation) 13 | { 14 | XPosition = xPosition; 15 | YPosition = yPosition; 16 | ZPosition = zPosition; 17 | Rotation = rotation; 18 | Offset = offset; 19 | } 20 | 21 | public override string ToString() 22 | { 23 | return $"HatData({Offset:X2}, {XPosition:X2}, {YPosition:X2}, {ZPosition:X2}, {Rotation:X2})"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/AdBannerMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class AdBannerMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public int MapId; 12 | [XmlElement(Order = 3)] 13 | public List Prices; 14 | 15 | public AdBannerMetadata() { } 16 | } 17 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/AnimationMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class AnimationMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public string ActorId; 10 | [XmlElement(Order = 2)] 11 | public List Sequence = new(); 12 | } 13 | 14 | [XmlType] 15 | public class SequenceMetadata 16 | { 17 | [XmlElement(Order = 1)] 18 | public short SequenceId; 19 | [XmlElement(Order = 2)] 20 | public string SequenceName; 21 | [XmlElement(Order = 3)] 22 | public List Keys = new(); 23 | } 24 | 25 | [XmlType] 26 | public class KeyMetadata 27 | { 28 | [XmlElement(Order = 1)] 29 | public string KeyName; 30 | [XmlElement(Order = 2)] 31 | public float KeyTime; 32 | } 33 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/BlackMarketTableMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class BlackMarketTableMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int CategoryId; 10 | [XmlElement(Order = 2)] 11 | public List ItemCategories = new(); 12 | } 13 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/CharacterCreateMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class CharacterCreateMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public List DisabledJobs; 10 | } 11 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/ChatStickerMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class ChatStickerMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int StickerId; 10 | [XmlElement(Order = 2)] 11 | public byte GroupId; 12 | [XmlElement(Order = 3)] 13 | public short CategoryId; 14 | } 15 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/ColorPaletteMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class ColorPaletteMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int PaletteId; 10 | [XmlElement(Order = 2)] 11 | public List DefaultColors = new(); 12 | 13 | public override string ToString() 14 | { 15 | return $"ColorPaletteMetadata(PaletteId:{PaletteId},DefaultColors:{DefaultColors})"; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/ConstantsMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class ConstantsMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public string Key; 10 | [XmlElement(Order = 2)] 11 | public string Value; 12 | 13 | public ConstantsMetadata() { } 14 | 15 | public ConstantsMetadata(string key, string value) 16 | { 17 | Key = key; 18 | Value = value; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/DefaultItemsMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | using Maple2Storage.Enums; 3 | 4 | namespace Maple2Storage.Types.Metadata; 5 | 6 | [XmlType] 7 | public class DefaultItemsMetadata 8 | { 9 | [XmlElement(Order = 1)] 10 | public int JobCode; 11 | [XmlElement(Order = 2)] 12 | public List DefaultItems = new(); 13 | } 14 | 15 | [XmlType] 16 | public class DefaultItem 17 | { 18 | [XmlElement(Order = 1)] 19 | public ItemSlot ItemSlot; 20 | [XmlElement(Order = 2)] 21 | public int ItemId; 22 | } 23 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/EnchantLimitMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | using Maple2Storage.Enums; 3 | 4 | namespace Maple2Storage.Types.Metadata; 5 | 6 | [XmlType] 7 | public class EnchantLimitMetadata 8 | { 9 | [XmlElement(Order = 1)] 10 | public ItemType ItemType; 11 | [XmlElement(Order = 2)] 12 | public int MinLevel; 13 | [XmlElement(Order = 3)] 14 | public int MaxLevel; 15 | [XmlElement(Order = 4)] 16 | public int MaxEnchantLevel; 17 | 18 | public EnchantLimitMetadata() { } 19 | } 20 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/EnchantScrollMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | using Maple2Storage.Enums; 3 | 4 | namespace Maple2Storage.Types.Metadata; 5 | 6 | [XmlType] 7 | public class EnchantScrollMetadata 8 | { 9 | [XmlElement(Order = 1)] 10 | public int Id; 11 | [XmlElement(Order = 2)] 12 | public EnchantScrollType ScrollType; 13 | [XmlElement(Order = 3)] 14 | public short MinLevel; 15 | [XmlElement(Order = 4)] 16 | public short MaxLevel; 17 | [XmlElement(Order = 5)] 18 | public List EnchantLevels; 19 | [XmlElement(Order = 6)] 20 | public List ItemTypes; 21 | [XmlElement(Order = 7)] 22 | public List Rarities; 23 | 24 | public EnchantScrollMetadata() { } 25 | } 26 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/ExpMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class ExpMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public short Level; 10 | [XmlElement(Order = 2)] 11 | public long Experience; 12 | } 13 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/FieldWarMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class FieldWarMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int FieldWarId; 10 | [XmlElement(Order = 2)] 11 | public int RewardId; 12 | [XmlElement(Order = 3)] 13 | public int MapId; 14 | [XmlElement(Order = 4)] 15 | public byte GroupId; 16 | } 17 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/FishMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class FishMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public string Habitat; 12 | [XmlElement(Order = 3)] 13 | public int CompanionId; 14 | [XmlElement(Order = 4)] 15 | public short Mastery; 16 | [XmlElement(Order = 5)] 17 | public byte Rarity; 18 | [XmlElement(Order = 6)] 19 | public short[] SmallSize = Array.Empty(); 20 | [XmlElement(Order = 7)] 21 | public short[] BigSize = Array.Empty(); 22 | [XmlElement(Order = 8)] 23 | public bool IgnoreMastery; 24 | [XmlElement(Order = 9)] 25 | public List HabitatMapId = new(); 26 | } 27 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/FishingRodMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class FishingRodMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int RodId; 10 | [XmlElement(Order = 2)] 11 | public int ItemId; 12 | [XmlElement(Order = 3)] 13 | public short MasteryLimit; 14 | [XmlElement(Order = 4)] 15 | public int ReduceTime; 16 | } 17 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/FishingSpotMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class FishingSpotMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public short MinMastery; 12 | [XmlElement(Order = 3)] 13 | public short MaxMastery; 14 | [XmlElement(Order = 4)] 15 | public List LiquidType = new(); 16 | } 17 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/FunctionCubeMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class FunctionCubeMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int CubeId; 10 | [XmlElement(Order = 2)] 11 | public int RecipeId; 12 | 13 | public FunctionCubeMetadata() { } 14 | 15 | public FunctionCubeMetadata(int cubeId, int recipeId) 16 | { 17 | CubeId = cubeId; 18 | RecipeId = recipeId; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/FurnishingShopMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class FurnishingShopMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int ItemId; 10 | [XmlElement(Order = 2)] 11 | public bool Buyable; 12 | [XmlElement(Order = 3)] 13 | public byte FurnishingTokenType; 14 | [XmlElement(Order = 4)] 15 | public int Price; 16 | 17 | public override string ToString() 18 | { 19 | return $"FurnishingShopMetadata(ItemId:{ItemId},Buyable:{Buyable},FurnishingTokenType:{FurnishingTokenType},Price:{Price})"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/GuildContributionMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class GuildContributionMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public string Type; 10 | [XmlElement(Order = 2)] 11 | public int Value; 12 | 13 | public override string ToString() 14 | { 15 | return $"GuildContribution(Type:{Type},Value:{Value})"; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/GuildHouseMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class GuildHouseMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int FieldId; 10 | [XmlElement(Order = 2)] 11 | public int Level; 12 | [XmlElement(Order = 3)] 13 | public int Theme; 14 | [XmlElement(Order = 4)] 15 | public int RequiredLevel; 16 | [XmlElement(Order = 5)] 17 | public int UpgradeCost; 18 | [XmlElement(Order = 6)] 19 | public int RethemeCost; 20 | 21 | public override string ToString() 22 | { 23 | return $"GuildBuff(FieldId:{FieldId},Level:{Level},Theme:{Theme},RequiredLevel:{RequiredLevel},UpgradeCost:{UpgradeCost},RethemeCost:{RethemeCost}"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/GuildServiceMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class GuildServiceMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public string Type; 12 | [XmlElement(Order = 3)] 13 | public int Level; 14 | [XmlElement(Order = 4)] 15 | public int UpgradeCost; 16 | [XmlElement(Order = 5)] 17 | public int LevelRequirement; 18 | [XmlElement(Order = 6)] 19 | public int HouseLevelRequirement; 20 | 21 | public override string ToString() 22 | { 23 | return $"GuildBuff(Id:{Id}, Type:{Type}, Level:{Level}, UpgradeCost:{UpgradeCost}, LevelRequirement:{LevelRequirement}," + 24 | $" HouseLevelRequirement:{HouseLevelRequirement}"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/InsigniaMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class InsigniaMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public short InsigniaId; 10 | [XmlElement(Order = 2)] 11 | public string ConditionType; 12 | [XmlElement(Order = 3)] 13 | public int TitleId; 14 | } 15 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/InstrumentCategoryInfoMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class InstrumentCategoryInfoMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public byte CategoryId; 10 | [XmlElement(Order = 2)] 11 | public byte GMId; 12 | [XmlElement(Order = 3)] 13 | public string Octave; 14 | [XmlElement(Order = 4)] 15 | public byte PercussionId; 16 | 17 | public override string ToString() 18 | { 19 | return $"InstrumentCategoryInfo(CategoryId:{CategoryId},GMId:{GMId},Octave:{Octave},PercussionId{PercussionId})"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/InstrumentInfoMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class InstrumentInfoMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public byte InstrumentId; 10 | [XmlElement(Order = 2)] 11 | public byte Category; 12 | [XmlElement(Order = 3)] 13 | public byte ScoreCount; 14 | 15 | public override string ToString() 16 | { 17 | return $"InstrumentInfo(InstrumentId:{InstrumentId},Category:{Category},ScoreCount:{ScoreCount})"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/ItemExtractionMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class ItemExtractionMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int SourceItemId; 10 | [XmlElement(Order = 2)] 11 | public byte TryCount; 12 | [XmlElement(Order = 3)] 13 | public byte ScrollCount; 14 | [XmlElement(Order = 4)] 15 | public int ResultItemId; 16 | 17 | public override string ToString() 18 | { 19 | return $"ItemExtractionMetadata(SourceItemId:{SourceItemId}, TryCount:{TryCount}, ScrollCount:{ScrollCount}, ResultItemId:{ResultItemId})"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/ItemGemstoneUpgradeMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class ItemGemstoneUpgradeMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int ItemId; 10 | [XmlElement(Order = 2)] 11 | public byte GemLevel; 12 | [XmlElement(Order = 3)] 13 | public int NextItemId; 14 | [XmlElement(Order = 4)] 15 | public List IngredientItems = new(); // by item tag 16 | [XmlElement(Order = 5)] 17 | public List IngredientAmounts = new(); 18 | 19 | public override string ToString() 20 | { 21 | return $"ItemGemstoneUpgradeMetadata(ItemId:{ItemId},GemLevel:{GemLevel},NextItemId{NextItemId})"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/ItemOptionRandomMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class ItemOptionRandomMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public List ItemOptions = new(); 12 | } 13 | 14 | [XmlType] 15 | public class ItemOptionRandom 16 | { 17 | [XmlElement(Order = 1)] 18 | public byte Rarity; 19 | [XmlElement(Order = 2)] 20 | public float MultiplyFactor; 21 | [XmlElement(Order = 3)] 22 | public byte[] Slots = Array.Empty(); 23 | [XmlElement(Order = 4)] 24 | public List Stats = new(); 25 | [XmlElement(Order = 5)] 26 | public List SpecialStats = new(); 27 | } 28 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/ItemOptionsConstantMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class ItemOptionsConstantMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public byte Rarity; 12 | [XmlElement(Order = 3)] 13 | public List Stats = new(); 14 | [XmlElement(Order = 4)] 15 | public List SpecialStats = new(); 16 | } 17 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/ItemRepackageMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class ItemRepackageMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public int MinLevel; 12 | [XmlElement(Order = 3)] 13 | public int MaxLevel; 14 | [XmlElement(Order = 4)] 15 | public List Slots = new(); 16 | [XmlElement(Order = 5)] 17 | public List Rarities = new(); 18 | [XmlElement(Order = 6)] 19 | public int PetType; 20 | } 21 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/ItemSocketMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class ItemSocketMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public List RarityData = new(); 12 | 13 | public ItemSocketMetadata() { } 14 | } 15 | 16 | [XmlType] 17 | public class ItemSocketRarityData 18 | { 19 | [XmlElement(Order = 1)] 20 | public int Rarity; 21 | [XmlElement(Order = 2)] 22 | public int MaxCount; 23 | [XmlElement(Order = 3)] 24 | public int FixedOpenCount; 25 | 26 | public ItemSocketRarityData() { } 27 | } 28 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/ItemSocketScrollMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | using Maple2Storage.Enums; 3 | 4 | namespace Maple2Storage.Types.Metadata; 5 | 6 | [XmlType] 7 | public class ItemSocketScrollMetadata 8 | { 9 | [XmlElement(Order = 1)] 10 | public int Id; 11 | [XmlElement(Order = 2)] 12 | public int MinLevel; 13 | [XmlElement(Order = 3)] 14 | public int MaxLevel; 15 | [XmlElement(Order = 4)] 16 | public List ItemTypes; 17 | [XmlElement(Order = 5)] 18 | public int Rarity; 19 | [XmlElement(Order = 6)] 20 | public bool MakeUntradeable; 21 | 22 | public ItemSocketScrollMetadata() { } 23 | } 24 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/MasteryFactorMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class MasteryFactorMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Differential; 10 | [XmlElement(Order = 2)] 11 | public int Factor; 12 | 13 | public override string ToString() 14 | { 15 | return $"MasteryFactorMetadata(Differential:{Differential},Factor:{Factor})"; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/MasteryUgcHousingMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class MasteryUgcHousingMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public byte Grade; 10 | [XmlElement(Order = 2)] 11 | public short MasteryRequired; 12 | [XmlElement(Order = 3)] 13 | public int ItemId; 14 | } 15 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/MeretMarketCategoryMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | using Maple2Storage.Enums; 3 | 4 | namespace Maple2Storage.Types.Metadata; 5 | 6 | [XmlType] 7 | public class MeretMarketCategoryMetadata 8 | { 9 | [XmlElement(Order = 1)] 10 | public MeretMarketSection Section; 11 | [XmlElement(Order = 2)] 12 | public List Tabs = new(); 13 | } 14 | 15 | [XmlType] 16 | public class MeretMarketTab 17 | { 18 | [XmlElement(Order = 1)] 19 | public int Id; 20 | [XmlElement(Order = 2)] 21 | public List ItemCategories = new(); 22 | } 23 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/MountMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public record MountMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id { get; init; } 10 | 11 | [XmlElement(Order = 2)] 12 | public int RunConsumeEp { get; init; } 13 | 14 | [XmlElement(Order = 3)] 15 | public XmlStats MountStats { get; init; } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/PremiumClubDailyBenefitMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class PremiumClubDailyBenefitMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int BenefitId; 10 | [XmlElement(Order = 2)] 11 | public int ItemId; 12 | [XmlElement(Order = 3)] 13 | public byte ItemRarity; 14 | [XmlElement(Order = 4)] 15 | public short ItemAmount; 16 | 17 | public override string ToString() 18 | { 19 | return $"ItemRequirement(BenefitId:{BenefitId},ItemId:{ItemId},ItemRarity:{ItemRarity},ItemAmount:{ItemAmount})"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/PremiumClubEffectMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class PremiumClubEffectMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int EffectId; 10 | [XmlElement(Order = 2)] 11 | public int EffectLevel; 12 | } 13 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/PrestigeLevelMissionMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class PrestigeLevelMissionMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public int MissionCount; 12 | [XmlElement(Order = 3)] 13 | public int RewardItemId; 14 | [XmlElement(Order = 4)] 15 | public int RewardItemRarity; 16 | [XmlElement(Order = 5)] 17 | public int RewardItemAmount; 18 | 19 | public PrestigeLevelMissionMetadata() { } 20 | } 21 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/PrestigeRewardMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class PrestigeRewardMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public readonly int Level; 10 | [XmlElement(Order = 2)] 11 | public readonly string Type; 12 | [XmlElement(Order = 3)] 13 | public readonly int Id; 14 | [XmlElement(Order = 4)] 15 | public readonly int Rarity; 16 | [XmlElement(Order = 5)] 17 | public readonly int Amount; 18 | 19 | public PrestigeRewardMetadata() { } 20 | 21 | public PrestigeRewardMetadata(int level, string type, int id, int rarity, int amount) 22 | { 23 | Level = level; 24 | Type = type; 25 | Id = id; 26 | Rarity = rarity; 27 | Amount = amount; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/SetItemInfoMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class SetItemInfoMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public int[] ItemIds; 12 | [XmlElement(Order = 3)] 13 | public int OptionId; 14 | } 15 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/SurvivalGoldPassRewardMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class SurvivalGoldPassRewardMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Level; 10 | [XmlElement(Order = 2)] 11 | public string Type1; 12 | [XmlElement(Order = 3)] 13 | public string Id1; 14 | [XmlElement(Order = 4)] 15 | public string Value1; 16 | [XmlElement(Order = 5)] 17 | public string Count1; 18 | [XmlElement(Order = 6)] 19 | public string Type2; 20 | [XmlElement(Order = 7)] 21 | public string Id2; 22 | [XmlElement(Order = 8)] 23 | public string Value2; 24 | [XmlElement(Order = 9)] 25 | public string Count2; 26 | } 27 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/SurvivalLevelMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class SurvivalLevelMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Level; 10 | [XmlElement(Order = 2)] 11 | public long RequiredExp; 12 | [XmlElement(Order = 3)] 13 | public byte Grade; 14 | } 15 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/SurvivalPeriodMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class SurvivalPeriodMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public int RewardId; 12 | [XmlElement(Order = 3)] 13 | public DateTime StartTime; 14 | [XmlElement(Order = 4)] 15 | public DateTime EndTime; 16 | [XmlElement(Order = 5)] 17 | public int PassPrice; 18 | } 19 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/SurvivalSilverPassRewardMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class SurvivalSilverPassRewardMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Level; 10 | [XmlElement(Order = 2)] 11 | public string Type1; 12 | [XmlElement(Order = 3)] 13 | public string Id1; 14 | [XmlElement(Order = 4)] 15 | public string Value1; 16 | [XmlElement(Order = 5)] 17 | public string Count1; 18 | } 19 | -------------------------------------------------------------------------------- /Maple2Storage/Types/Metadata/TitleMetadata.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | 3 | namespace Maple2Storage.Types.Metadata; 4 | 5 | [XmlType] 6 | public class TitleMetadata 7 | { 8 | [XmlElement(Order = 1)] 9 | public int Id; 10 | [XmlElement(Order = 2)] 11 | public string Name; 12 | [XmlElement(Order = 3)] 13 | public string Feature; 14 | 15 | public TitleMetadata() { } 16 | 17 | public TitleMetadata(int id, string name, string feature) 18 | { 19 | Id = id; 20 | Name = name; 21 | Feature = feature; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /MaplePacketLib2/Crypto/ICrypter.cs: -------------------------------------------------------------------------------- 1 | namespace MaplePacketLib2.Crypto; 2 | 3 | public interface ICrypter 4 | { 5 | void Encrypt(byte[] src); 6 | void Encrypt(byte[] src, int start, int end); 7 | void Decrypt(byte[] src); 8 | void Decrypt(byte[] src, int start, int end); 9 | } 10 | -------------------------------------------------------------------------------- /MaplePacketLib2/MaplePacketLib2.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | true 6 | enable 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /MaplePacketLib2/Tools/IPacketReader.cs: -------------------------------------------------------------------------------- 1 | namespace MaplePacketLib2.Tools; 2 | 3 | public interface IPacketReader : IDisposable 4 | { 5 | public int Available { get; } 6 | 7 | public T Read() where T : struct; 8 | public T Peek() where T : struct; 9 | public byte[] ReadBytes(int count); 10 | public bool ReadBool(); 11 | public byte ReadByte(); 12 | public short ReadShort(); 13 | public int ReadInt(); 14 | public float ReadFloat(); 15 | public long ReadLong(); 16 | public string ReadString(); 17 | public string ReadUnicodeString(); 18 | public void Skip(int count); 19 | } 20 | -------------------------------------------------------------------------------- /MaplePacketLib2/Tools/IPacketSerializable.cs: -------------------------------------------------------------------------------- 1 | namespace MaplePacketLib2.Tools; 2 | 3 | public interface IPacketSerializable 4 | { 5 | public void WriteTo(PacketWriter writer); 6 | } 7 | 8 | public interface IPacketDeserializable 9 | { 10 | public void ReadFrom(PacketReader reader); 11 | } 12 | -------------------------------------------------------------------------------- /MaplePacketLib2/Tools/IPacketWriter.cs: -------------------------------------------------------------------------------- 1 | namespace MaplePacketLib2.Tools; 2 | 3 | public interface IPacketWriter : IDisposable 4 | { 5 | public void Write(in T value) where T : struct; 6 | public void WriteBytes(byte[] value); 7 | public void WriteBytes(byte[] value, int offset, int length); 8 | public void WriteBool(bool value); 9 | public void WriteByte(byte value = 0); 10 | public void WriteShort(short value = 0); 11 | public void WriteInt(int value = 0); 12 | public void WriteFloat(float value = 0f); 13 | public void WriteLong(long value = 0); 14 | public void WriteString(string value = ""); 15 | public void WriteUnicodeString(string value = ""); 16 | } 17 | -------------------------------------------------------------------------------- /MaplePacketLib2/Tools/PoolPacketReader.cs: -------------------------------------------------------------------------------- 1 | using System.Buffers; 2 | using System.Diagnostics; 3 | 4 | namespace MaplePacketLib2.Tools; 5 | 6 | public class PoolPacketReader : PacketReader, IDisposable 7 | { 8 | private readonly ArrayPool Pool; 9 | 10 | public PoolPacketReader(ArrayPool pool, byte[] packet, int packetSize, int offset = 0) : base(packet, offset) 11 | { 12 | Length = packetSize; 13 | Pool = pool; 14 | } 15 | 16 | public void Dispose() 17 | { 18 | Pool.Return(Buffer); 19 | #if DEBUG 20 | // In DEBUG, SuppressFinalize to mark object as disposed. 21 | GC.SuppressFinalize(this); 22 | #endif 23 | } 24 | 25 | #if DEBUG 26 | // Provides warning if Disposed in not called. 27 | ~PoolPacketReader() 28 | { 29 | Debug.Fail($"PacketReader not disposed: {this}"); 30 | } 31 | #endif 32 | } 33 | -------------------------------------------------------------------------------- /MapleServer2.Tests/MapleServer2.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net6.0 5 | enable 6 | enable 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /MapleServer2/AI/AIHelper.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using MapleServer2.AI.Functions; 3 | using MapleServer2.AI.Scripts; 4 | using MapleServer2.Types; 5 | 6 | namespace MapleServer2.AI; 7 | 8 | public static class AIHelper 9 | { 10 | public static AIState GetAIState(string aiName, AIContext context) 11 | { 12 | Type? type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(t => t.Name == aiName); 13 | 14 | if (type is null) 15 | { 16 | return new AI_DefaultNew(context); 17 | } 18 | 19 | return Activator.CreateInstance(type, context) as AIState ?? throw new InvalidOperationException($"AIState is null. AiName: {aiName}"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/AI/AIScript.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.AI.Functions; 2 | using MapleServer2.Types; 3 | 4 | namespace MapleServer2.AI; 5 | 6 | public class AIScript 7 | { 8 | private readonly AIContext Context; 9 | private AIState? State; 10 | private AIState? NextState; 11 | 12 | public AIScript(AIContext context, AIState start) 13 | { 14 | Context = context; 15 | NextState = start; 16 | } 17 | 18 | public void Next() 19 | { 20 | if (NextState != null) 21 | { 22 | State?.OnExit(); 23 | State = NextState; 24 | State?.OnEnter(); 25 | NextState = null; 26 | } 27 | 28 | NextState = State?.Execute(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /MapleServer2/AI/Functions/AIContext.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Managers.Actors; 2 | using Serilog; 3 | 4 | namespace MapleServer2.AI.Functions; 5 | 6 | public partial class AIContext 7 | { 8 | private readonly Npc Npc; 9 | private readonly ILogger Logger; 10 | 11 | public AIContext(Npc npc) 12 | { 13 | Npc = npc; 14 | Logger = Log.Logger.ForContext(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/AI/Functions/AITrigger.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Types; 2 | 3 | namespace MapleServer2.AI.Functions; 4 | 5 | public partial class AIContext 6 | { 7 | public void SetUserValue(string key, int value) 8 | { 9 | IFieldActor? iFieldActor = Npc.Target; 10 | if (iFieldActor is null) 11 | { 12 | return; 13 | } 14 | 15 | PlayerTrigger? playerTrigger = iFieldActor!.Value.Triggers.FirstOrDefault(y => y.Key == key); 16 | if (playerTrigger is not null) 17 | { 18 | playerTrigger.Value = value; 19 | return; 20 | } 21 | 22 | iFieldActor.Value.Triggers.Add(new(key, value)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /MapleServer2/Commands/Core/CommandBase.cs: -------------------------------------------------------------------------------- 1 | using Serilog; 2 | 3 | namespace MapleServer2.Commands.Core; 4 | 5 | public abstract class CommandBase 6 | { 7 | protected static readonly ILogger Logger = Log.Logger.ForContext(); 8 | 9 | public List Aliases { get; protected set; } 10 | public string Description { get; set; } 11 | public List Parameters { get; protected set; } 12 | public string Usage { get; protected set; } 13 | 14 | public CommandBase() 15 | { 16 | Parameters = new(); 17 | } 18 | 19 | public abstract void Execute(CommandTrigger trigger); 20 | 21 | public override string ToString() 22 | { 23 | return GetType().Name; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /MapleServer2/Commands/Core/GameCommandTrigger.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Enums; 2 | using MapleServer2.Servers.Game; 3 | 4 | namespace MapleServer2.Commands.Core; 5 | 6 | public class GameCommandTrigger : CommandTrigger 7 | { 8 | public GameSession Session { get; } 9 | public ChatType ChatType { get; } 10 | 11 | public GameCommandTrigger(string[] args, GameSession session, ChatType chatType) : base(args) 12 | { 13 | Session = session; 14 | ChatType = chatType; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Commands/Core/IParameter.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Commands.Core; 2 | 3 | public interface IParameter 4 | { 5 | public string Name { get; set; } 6 | public string Description { get; set; } 7 | dynamic DefaultValue { get; set; } 8 | Type ValueType { get; } 9 | 10 | dynamic ConvertString(string value); 11 | 12 | void SetValue(string str); 13 | 14 | void SetValue(dynamic obj); 15 | 16 | void SetDefaultValue(); 17 | } 18 | public interface IParameter : IParameter 19 | { 20 | T Value { get; } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Commands/Core/InGameCommand.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Commands.Core; 2 | 3 | public abstract class InGameCommand : CommandBase 4 | { 5 | public override void Execute(CommandTrigger trigger) 6 | { 7 | if (trigger is not GameCommandTrigger commandTrigger) 8 | { 9 | Logger.Error("This command can only be executed in game."); 10 | return; 11 | } 12 | Execute(commandTrigger); 13 | } 14 | 15 | public abstract void Execute(GameCommandTrigger trigger); 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Constants/Constant.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Constants; 2 | 3 | public static class Constant 4 | { 5 | public const float UnitPerMs = 0.001f; // Velocity in which all NPCs move per ms. 150 units per second. 6 | public const int MountStaminaConsumption = 50; // Amount of stamina consumed each tick when sprinting with a ground mount. 7 | public const double PetAttackMultiplier = 0.396f; // Applied to pet attack in the damage formula when adding it to bonus attack 8 | public const string LocalHost = "127.0.0.1"; 9 | } 10 | -------------------------------------------------------------------------------- /MapleServer2/Data/Static/GlobalEventsMetadataStorage.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | using MapleServer2.Types; 3 | using Newtonsoft.Json; 4 | 5 | namespace MapleServer2.Data.Static; 6 | 7 | public static class GlobalEventsMetadataStorage 8 | { 9 | private static readonly Dictionary GlobalEvents = new(); 10 | 11 | public static void Init() 12 | { 13 | string json = File.ReadAllText($"{Paths.JSON_DIR}/GlobalEvents.json"); 14 | List? items = JsonConvert.DeserializeObject>(json); 15 | if (items is null) 16 | { 17 | return; 18 | } 19 | 20 | foreach (GlobalEvent item in items) 21 | { 22 | GlobalEvents[item.Id] = item; 23 | } 24 | } 25 | 26 | public static List GetAllAutoGlobalEvents() => GlobalEvents.Values.ToList(); 27 | } 28 | -------------------------------------------------------------------------------- /MapleServer2/Data/Static/ItemDropMetadataStorage.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | using Maple2Storage.Types.Metadata; 3 | using MapleServer2.Tools; 4 | using ProtoBuf; 5 | 6 | namespace MapleServer2.Data.Static; 7 | 8 | public static class ItemDropMetadataStorage 9 | { 10 | private static readonly Dictionary Drops = new(); 11 | 12 | public static void Init() 13 | { 14 | using FileStream stream = MetadataHelper.GetFileStream(MetadataName.ItemDrop); 15 | List items = Serializer.Deserialize>(stream); 16 | foreach (ItemDropMetadata item in items) 17 | { 18 | Drops[item.Id] = item; 19 | } 20 | } 21 | 22 | public static ItemDropMetadata? GetItemDropMetadata(int boxId) 23 | { 24 | return Drops.GetValueOrDefault(boxId); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /MapleServer2/Data/Static/MountMetadataStorage.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | using Maple2Storage.Types.Metadata; 3 | using MapleServer2.Tools; 4 | using ProtoBuf; 5 | 6 | namespace MapleServer2.Data.Static; 7 | 8 | public static class MountMetadataStorage 9 | { 10 | private static readonly Dictionary Mounts = new(); 11 | 12 | public static void Init() 13 | { 14 | using FileStream stream = MetadataHelper.GetFileStream(MetadataName.Mount); 15 | List mountList = Serializer.Deserialize>(stream); 16 | foreach (MountMetadata mount in mountList) 17 | { 18 | Mounts.Add(mount.Id, mount); 19 | } 20 | } 21 | 22 | public static MountMetadata? GetMountMetadata(int id) => Mounts.GetValueOrDefault(id); 23 | } 24 | -------------------------------------------------------------------------------- /MapleServer2/Data/Static/TitleMetadataStorage.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | using Maple2Storage.Types.Metadata; 3 | using MapleServer2.Tools; 4 | using ProtoBuf; 5 | 6 | namespace MapleServer2.Data.Static; 7 | 8 | public static class TitleMetadataStorage 9 | { 10 | private static readonly Dictionary Titles = new(); 11 | 12 | public static void Init() 13 | { 14 | using FileStream stream = MetadataHelper.GetFileStream(MetadataName.Title); 15 | List items = Serializer.Deserialize>(stream); 16 | foreach (TitleMetadata item in items) 17 | { 18 | Titles[item.Id] = item; 19 | } 20 | } 21 | 22 | public static List GetAll() => Titles.Values.ToList(); 23 | } 24 | -------------------------------------------------------------------------------- /MapleServer2/Data/Static/UgcDesignMetadataStorage.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | using Maple2Storage.Types.Metadata; 3 | using MapleServer2.Tools; 4 | using ProtoBuf; 5 | 6 | namespace MapleServer2.Data.Static; 7 | 8 | public static class UgcDesignMetadataStorage 9 | { 10 | private static readonly Dictionary UgcDesign = new(); 11 | 12 | public static void Init() 13 | { 14 | using FileStream stream = MetadataHelper.GetFileStream(MetadataName.UGCDesign); 15 | List items = Serializer.Deserialize>(stream); 16 | foreach (UgcDesignMetadata item in items) 17 | { 18 | UgcDesign[item.ItemId] = item; 19 | } 20 | } 21 | 22 | public static UgcDesignMetadata? GetItem(int itemId) => UgcDesign.TryGetValue(itemId, out UgcDesignMetadata? item) ? item : null; 23 | } 24 | -------------------------------------------------------------------------------- /MapleServer2/Database/Classes/DatabaseOXQuizQuestion.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Database.Types; 2 | using SqlKata.Execution; 3 | 4 | namespace MapleServer2.Database.Classes; 5 | 6 | public class DatabaseOXQuizQuestion : DatabaseTable 7 | { 8 | public DatabaseOXQuizQuestion() : base("ox_quiz_questions") { } 9 | 10 | public OXQuizQuestion GetRandomQuestion() 11 | { 12 | IEnumerable result = QueryFactory.Query(TableName).Get().ToList(); 13 | dynamic singleResult = result.ElementAt(Random.Shared.Next(result.Count())); 14 | return ReadQuestion(singleResult); 15 | } 16 | 17 | private OXQuizQuestion ReadQuestion(dynamic data) 18 | { 19 | return new(data.category, data.question_text, data.answer_text, data.answer); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Database/Classes/DatabaseRouletteGameItem.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Database.Types; 2 | using SqlKata.Execution; 3 | 4 | namespace MapleServer2.Database.Classes; 5 | 6 | public class DatabaseRouletteGameItem : DatabaseTable 7 | { 8 | public DatabaseRouletteGameItem() : base("roulette_game_items") { } 9 | 10 | public List FindAllByRouletteId(long rouletteId) 11 | { 12 | List items = new(); 13 | IEnumerable results = QueryFactory.Query(TableName).Where("roulette_id", rouletteId).Get(); 14 | foreach (dynamic data in results) 15 | { 16 | items.Add(ReadRouletteItem(data)); 17 | } 18 | return items; 19 | } 20 | 21 | private static RouletteGameItem ReadRouletteItem(dynamic data) 22 | { 23 | return new RouletteGameItem(data); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /MapleServer2/Database/Classes/DatabaseServer.cs: -------------------------------------------------------------------------------- 1 | using SqlKata.Execution; 2 | 3 | namespace MapleServer2.Database.Classes; 4 | 5 | public class DatabaseServer : DatabaseTable 6 | { 7 | public DatabaseServer() : base("server") { } 8 | 9 | public DateTimeOffset GetLastDailyReset() 10 | { 11 | dynamic results = QueryFactory.Query(TableName).Select("last_daily_reset").FirstOrDefault(); 12 | 13 | return results is null ? DateTimeOffset.UtcNow : (DateTimeOffset) results.last_daily_reset; 14 | } 15 | 16 | public void SetLastDailyReset(DateTimeOffset date) 17 | { 18 | QueryFactory.Query(TableName).Update(new 19 | { 20 | last_daily_reset = date.UtcDateTime 21 | }); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /MapleServer2/Database/Types/CardReverseGame.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Database.Types; 2 | 3 | public class CardReverseGame 4 | { 5 | public int Id { get; set; } 6 | public int ItemId { get; set; } 7 | public byte ItemRarity { get; set; } 8 | public int ItemAmount { get; set; } 9 | 10 | // Temporarily hardcoding the item and cost 11 | public const int TOKEN_ITEM_ID = 30000782; // 2nd Anniversary Commemorative Coin 12 | public const int TOKEN_COST = 2; 13 | } 14 | -------------------------------------------------------------------------------- /MapleServer2/Database/Types/OXQuizQuestion.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Database.Types; 2 | 3 | public class OXQuizQuestion 4 | { 5 | public readonly string Category; 6 | public readonly string QuestionText; 7 | public readonly string AnswerText; 8 | public readonly bool Answer; 9 | 10 | public OXQuizQuestion() { } 11 | 12 | public OXQuizQuestion(string category, string questionText, string answerText, bool answer) 13 | { 14 | Category = category; 15 | QuestionText = questionText; 16 | AnswerText = answerText; 17 | Answer = answer; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MapleServer2/Database/Types/RouletteGameItem.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Database.Types; 2 | 3 | public class RouletteGameItem 4 | { 5 | public int Uid; 6 | public int RouletteId; 7 | public int ItemId; 8 | public byte ItemRarity; 9 | public int ItemAmount; 10 | 11 | public RouletteGameItem(dynamic data) 12 | { 13 | Uid = data.uid; 14 | RouletteId = data.roulette_id; 15 | ItemId = data.item_id; 16 | ItemRarity = (byte) data.item_rarity; 17 | ItemAmount = data.item_amount; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MapleServer2/Enums/BuildModeType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum BuildModeType : byte 4 | { 5 | Stop = 0, 6 | House = 1, 7 | Liftables = 2 8 | } 9 | -------------------------------------------------------------------------------- /MapleServer2/Enums/ChatLinkType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum ChatLinkType 4 | { 5 | Enchant = 1, 6 | MaxStat = 2, 7 | OpenBox = 3, 8 | CardGame = 4, 9 | EmpowermentMaxStat = 3, 10 | Identify = 4, 11 | } 12 | -------------------------------------------------------------------------------- /MapleServer2/Enums/ChatType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum ChatType 4 | { 5 | All = 0, 6 | WhisperFrom = 3, 7 | WhisperTo = 4, 8 | WhisperFail = 5, 9 | WhisperReject = 6, 10 | Party = 7, 11 | Guild = 8, 12 | Notice = 9, 13 | World = 11, 14 | Channel = 12, 15 | NoticeAlert = 13, 16 | NoticeAlert2 = 14, 17 | ItemEnchant = 15, 18 | Super = 16, 19 | GuildAlert = 18, 20 | Unknown = 19, // Guild chat color without [Guild] prefix 21 | Club = 20, 22 | ChatBubble = 23, 23 | } 24 | -------------------------------------------------------------------------------- /MapleServer2/Enums/EnchantType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum EnchantType : short 4 | { 5 | Ophelia = 1, 6 | Peachy = 2 7 | } 8 | -------------------------------------------------------------------------------- /MapleServer2/Enums/EventBannerType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum EventBannerType : byte 4 | { 5 | Lose = 0x0, 6 | Gameover = 0x1, 7 | Winner = 0x2, 8 | Bonus = 0x3, 9 | Draw = 0x4, 10 | Success = 0x5, 11 | None = 0x6, 12 | Fail = 0x7 13 | } 14 | -------------------------------------------------------------------------------- /MapleServer2/Enums/FieldObjectUpdate.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | [Flags] 4 | public enum FieldObjectUpdate : byte 5 | { 6 | None = 0, 7 | Type1 = 1, 8 | Move = 2, 9 | Level = 4, 10 | Type4 = 8, 11 | Type5 = 16, 12 | Type6 = 32, 13 | Animate = 64 14 | } 15 | -------------------------------------------------------------------------------- /MapleServer2/Enums/GameEventUserValueType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum GameEventUserValueType 4 | { 5 | // Attendance Event 6 | AttendanceActive = 100, //?? maybe. String is "True" 7 | AttendanceCompletedTimestamp = 101, 8 | AttendanceRewardsClaimed = 102, 9 | AttendanceEarlyParticipationRemaining = 103, 10 | AttendanceAccumulatedTime = 106, 11 | 12 | // Blue Marble / Mapleopoly 13 | MapleopolyTotalTileCount = 800, 14 | MapleopolyFreeRollAmount = 801, 15 | MapleopolyTotalTrips = 802, // unsure 16 | 17 | // Rock Paper Scissors Event 18 | RPSDailyMatches = 1800, 19 | RPSRewardsClaimed = 1801, 20 | } 21 | -------------------------------------------------------------------------------- /MapleServer2/Enums/HomePermission.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum HomePermission : byte 4 | { 5 | Jumping = 0, 6 | WallClimbing = 1, 7 | SkillUse = 2, 8 | MusicPerformances = 3, 9 | PotionUse = 4, 10 | GroundMounts = 5, 11 | AirMounts = 6, 12 | Unknown = 7, 13 | Unknown2 = 8 14 | } 15 | -------------------------------------------------------------------------------- /MapleServer2/Enums/InteractObjectState.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum InteractObjectState : byte 4 | { 5 | Disable = 0, 6 | Default = 1, 7 | Activated = 2 8 | } 9 | -------------------------------------------------------------------------------- /MapleServer2/Enums/ItemRarity.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum RarityType 4 | { 5 | Common = 1, 6 | Rare = 2, 7 | Exceptional = 3, 8 | Epic = 4, 9 | Legendary = 5, 10 | Ascendant = 6 11 | } 12 | -------------------------------------------------------------------------------- /MapleServer2/Enums/ItemStatType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum ItemStatType 4 | { 5 | None, 6 | Constant, 7 | Static, 8 | Random 9 | } 10 | -------------------------------------------------------------------------------- /MapleServer2/Enums/MailType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum MailType : byte 4 | { 5 | Player = 1, 6 | System = 101, 7 | BlackMarketSale = 102, 8 | BlackMarketListingCancel = 104, 9 | MesoMarket = 106 10 | } 11 | -------------------------------------------------------------------------------- /MapleServer2/Enums/MasteryType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum MasteryType : byte 4 | { 5 | Fishing = 0x01, 6 | Performance = 0x02, 7 | Mining = 0x03, 8 | Foraging = 0x04, 9 | Ranching = 0x05, 10 | Farming = 0x06, 11 | Smithing = 0x07, 12 | Handicraft = 0x08, 13 | Alchemy = 0x09, 14 | Cooking = 0x0A, 15 | PetTaming = 0x0B 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Enums/MobMovement.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum MobMovement : byte 4 | { 5 | Hold, 6 | Patrol, 7 | LookAt, 8 | Follow, 9 | Strafe, 10 | Run, 11 | Dodge 12 | } 13 | -------------------------------------------------------------------------------- /MapleServer2/Enums/NoticeType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | [Flags] 4 | public enum NoticeType : short 5 | { 6 | Chat = 1, 7 | FastText = 4, 8 | Mint = 16, 9 | Popup = 64, 10 | KickPopup = 128, 11 | RedBanner = 1024 12 | } 13 | -------------------------------------------------------------------------------- /MapleServer2/Enums/OtherStatsIndex.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum OtherStatsIndex : byte 4 | { 5 | Trophy = 0x01, 6 | Quest = 0x02, 7 | Exploration = 0x03, 8 | Prestige = 0x04, 9 | Unknown = 0x05 10 | } 11 | -------------------------------------------------------------------------------- /MapleServer2/Enums/PrestigePerk.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | //Prestige perk unlock levels 4 | public enum PrestigePerk : int 5 | { 6 | ReviveDiscount = 5, 7 | SwiftSwimming = 10, 8 | SpeedyGroundMountSprinting = 15, 9 | DungeonScrounger = 20, 10 | AdvancedBartering = 25, 11 | UnboxingExpertise = 30, 12 | BargainAttributeReRolling = 35, 13 | MesoLooter = 40, 14 | RotorsAirDiscount = 45, 15 | FleetFootedMount = 50, 16 | SocketEfficiency = 60, 17 | AmphibiousRiding = 70, 18 | PetRetrainingEfficiency = 80, 19 | GemstoneFusionEfficiency = 90, 20 | SafeRiding = 100 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Enums/RideType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum RideType : byte 4 | { 5 | Default = 0, 6 | UseItem = 1, 7 | AdditionalEffect = 2, 8 | HideAndSeek = 3 9 | } 10 | -------------------------------------------------------------------------------- /MapleServer2/Enums/RockPaperScissors.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum RpsChoice 4 | { 5 | Rock = 0, 6 | Paper = 1, 7 | Scissors = 2 8 | } 9 | 10 | public enum RpsResult : byte 11 | { 12 | Draw = 0, 13 | Win = 1, 14 | Lose = 2 15 | } 16 | -------------------------------------------------------------------------------- /MapleServer2/Enums/SessionType.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum SessionType : byte 4 | { 5 | Login = 0, 6 | Game = 2 7 | } 8 | -------------------------------------------------------------------------------- /MapleServer2/Enums/ShopRestockInterval.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum ShopRestockInterval : byte 4 | { 5 | Minute = 0, 6 | Day = 1, 7 | Week = 2, 8 | Month = 3 // this is just a guess 9 | } 10 | -------------------------------------------------------------------------------- /MapleServer2/Enums/SkillEnums.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum HitType : byte 4 | { 5 | Normal = 0, 6 | Critical = 1, 7 | Miss = 2, 8 | Block = 3 9 | } 10 | 11 | public enum DamageType : byte 12 | { 13 | None = 0x00, 14 | Physical = 0x01, 15 | Magic = 0x02, 16 | // Seems to be used for skills shared between physical & magic classes to pick their preferred attack type 17 | // Appears in lapenshards like Gigantica Beam & Master's Malice 18 | Primary = 0x03 19 | } 20 | 21 | public enum Element : byte 22 | { 23 | None = 0x00, 24 | Fire = 0x01, 25 | Ice = 0x02, 26 | Electric = 0x03, 27 | Holy = 0x04, 28 | Dark = 0x05, 29 | Poison = 0x06 30 | } 31 | -------------------------------------------------------------------------------- /MapleServer2/Enums/SyncStateFlag.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | [Flags] 4 | public enum SyncStateFlag : byte 5 | { 6 | None = 0, 7 | Flag1 = 1, 8 | Flag2 = 2, 9 | Flag3 = 4, 10 | InteractableObject = 8, 11 | Flag5 = 16, 12 | Flag6 = 32 13 | } 14 | -------------------------------------------------------------------------------- /MapleServer2/Enums/UgcMarket.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum UgcMarketListingStatus : byte 4 | { 5 | Unknown = 0, 6 | Hold = 1, 7 | Active = 2, 8 | Expired = 3 9 | } 10 | 11 | public enum UgcMarketItemHomeCategory : byte 12 | { 13 | None = 0, 14 | Promoted = 1, 15 | New = 2 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Enums/UgcPortals.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Enums; 2 | 3 | public enum UgcPortalMethod : byte 4 | { 5 | Interact = 0, 6 | Walk = 1 7 | } 8 | public enum UgcPortalDestination : byte 9 | { 10 | PortalInHome = 0, 11 | SelectedMap = 1, 12 | FriendHome = 2 13 | } 14 | -------------------------------------------------------------------------------- /MapleServer2/Managers/Actors/FieldObject.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | using MapleServer2.Types; 3 | 4 | namespace MapleServer2.Managers.Actors; 5 | 6 | public class FieldObject : IFieldObject 7 | { 8 | public int ObjectId { get; set; } 9 | public T Value { get; } 10 | 11 | public virtual CoordF Coord { get; set; } 12 | public CoordF Rotation { get; set; } 13 | public short LookDirection 14 | { 15 | get => (short) (Rotation.Z * 10); 16 | set => Rotation = CoordF.From(Rotation.X, Rotation.Y, value / 10); 17 | } 18 | 19 | public FieldObject(int objectId, T value) 20 | { 21 | ObjectId = objectId; 22 | Value = value; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /MapleServer2/Managers/HongBaoManager.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Types; 2 | 3 | namespace MapleServer2.Managers; 4 | 5 | public class HongBaoManager 6 | { 7 | private readonly Dictionary HongBaoList; 8 | 9 | public HongBaoManager() 10 | { 11 | HongBaoList = new(); 12 | } 13 | 14 | public void AddHongBao(HongBao hongBao) 15 | { 16 | HongBaoList.Add(hongBao.Id, hongBao); 17 | } 18 | 19 | public void RemoveHongBao(HongBao hongBao) 20 | { 21 | HongBaoList.Remove(hongBao.Id); 22 | } 23 | 24 | public HongBao GetHongBaoById(int id) 25 | { 26 | return HongBaoList.TryGetValue(id, out HongBao foundHongBao) ? foundHongBao : null; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/Common/HeartbeatHandler.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Servers.Login; 4 | 5 | namespace MapleServer2.PacketHandlers.Common; 6 | 7 | public abstract class HeartbeatHandler : CommonPacketHandler 8 | { 9 | public override RecvOp OpCode => RecvOp.ResponseHeartbeat; 10 | 11 | public override void Handle(LoginSession session, PacketReader packet) 12 | { 13 | session.ServerTick = packet.ReadInt(); 14 | session.ClientTick = packet.ReadInt(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/Common/SystemInfoHandler.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Network; 4 | 5 | namespace MapleServer2.PacketHandlers.Common; 6 | 7 | public class SystemInfoHandler : CommonPacketHandler 8 | { 9 | public override RecvOp OpCode => RecvOp.SystemInfo; 10 | 11 | protected override void HandleCommon(Session session, PacketReader packet) 12 | { 13 | string info = packet.ReadUnicodeString(); 14 | Logger.Debug("System Info: {info}", info); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/Game/ChannelHandler.cs: -------------------------------------------------------------------------------- 1 |  2 | using MaplePacketLib2.Tools; 3 | using MapleServer2.Constants; 4 | using MapleServer2.Servers.Game; 5 | using MapleServer2.Types; 6 | 7 | namespace MapleServer2.PacketHandlers.Game; 8 | 9 | public class ChannelHandler : GamePacketHandler 10 | { 11 | public override RecvOp OpCode => RecvOp.Channel; 12 | 13 | public override void Handle(GameSession session, PacketReader packet) 14 | { 15 | short channelId = packet.ReadShort(); 16 | 17 | Player player = session.Player; 18 | player.InstanceId = channelId; 19 | player.ChannelId = channelId; 20 | 21 | player.WarpGameToGame(player.MapId, channelId); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/Game/CharacterInfoHandler.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Packets; 4 | using MapleServer2.Servers.Game; 5 | 6 | namespace MapleServer2.PacketHandlers.Game; 7 | 8 | public class CharacterInfoHandler : GamePacketHandler 9 | { 10 | public override RecvOp OpCode => RecvOp.CharInfo; 11 | 12 | public override void Handle(GameSession session, PacketReader packet) 13 | { 14 | long characterId = packet.ReadLong(); 15 | 16 | session.Send(CharacterInfoPacket.WriteCharacterInfo(characterId, GameServer.PlayerManager.GetPlayerById(characterId))); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/Game/ClientTickSyncHandler.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Servers.Game; 4 | 5 | namespace MapleServer2.PacketHandlers.Game; 6 | 7 | public class ClientTickSyncHandler : GamePacketHandler 8 | { 9 | public override RecvOp OpCode => RecvOp.ResponseClientTickSync; 10 | 11 | public override void Handle(GameSession session, PacketReader packet) 12 | { 13 | session.ClientTick = packet.ReadInt(); 14 | session.ServerTick = packet.ReadInt(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/Game/EnterEventFieldHandler.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Database; 4 | using MapleServer2.Database.Types; 5 | using MapleServer2.Servers.Game; 6 | 7 | namespace MapleServer2.PacketHandlers.Game; 8 | 9 | public class EnterEventFieldHandler : GamePacketHandler 10 | { 11 | public override RecvOp OpCode => RecvOp.EnterEventField; 12 | 13 | public override void Handle(GameSession session, PacketReader packet) 14 | { 15 | EventFieldPopup fieldPopupEvent = DatabaseManager.Events.FindFieldPopupEvent(); 16 | if (fieldPopupEvent == null) 17 | { 18 | return; 19 | } 20 | 21 | session.Player.Warp(fieldPopupEvent.MapId); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/Game/FileHashHandler.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Servers.Game; 4 | 5 | namespace MapleServer2.PacketHandlers.Game; 6 | 7 | public class FileHashHandler : GamePacketHandler 8 | { 9 | public override RecvOp OpCode => RecvOp.FileHash; 10 | 11 | public override void Handle(GameSession session, PacketReader packet) 12 | { 13 | packet.ReadInt(); 14 | string filename = packet.ReadString(); 15 | string md5 = packet.ReadString(); 16 | 17 | Logger.Debug("Hash for {filename}: {md5}", filename, md5); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/Game/Helpers/ItemSocketScrollHelper.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Tools; 2 | using MoonSharp.Interpreter; 3 | 4 | namespace MapleServer2.PacketHandlers.Game.Helpers; 5 | 6 | public static class ItemSocketScrollHelper 7 | { 8 | public static float GetSuccessRate(int scrollId) 9 | { 10 | Script? script = ScriptLoader.GetScript("Functions/ItemSocketScroll/getSuccessRate"); 11 | return (float) (script?.RunFunction("getSuccessRate", scrollId)?.Number ?? 0); 12 | } 13 | 14 | public static byte GetSocketCount(int scrollId) 15 | { 16 | Script? script = ScriptLoader.GetScript("Functions/ItemSocketScroll/getSocketCount"); 17 | return (byte) (script?.RunFunction("getSocketCount", scrollId)?.Number ?? 0); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/Game/Helpers/QuestHelper.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types.Metadata; 2 | using MapleServer2.Data.Static; 3 | using MapleServer2.Types; 4 | 5 | namespace MapleServer2.PacketHandlers.Game.Helpers; 6 | 7 | public static class QuestHelper 8 | { 9 | public static void GetNewQuests(Player player) 10 | { 11 | List questList = QuestMetadataStorage.GetAvailableQuests(player.Levels.Level, player.JobCode); 12 | foreach (QuestMetadata quest in questList) 13 | { 14 | if (player.QuestData.ContainsKey(quest.Basic.Id)) 15 | { 16 | continue; 17 | } 18 | 19 | player.QuestData.Add(quest.Basic.Id, new(player.CharacterId, quest.Basic.Id)); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/Game/HomeDoctorHandler.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Servers.Game; 4 | using MapleServer2.Types; 5 | 6 | namespace MapleServer2.PacketHandlers.Game; 7 | 8 | public class HomeDoctorHandler : GamePacketHandler 9 | { 10 | public override RecvOp OpCode => RecvOp.RequestHomeDoctor; 11 | 12 | public override void Handle(GameSession session, PacketReader packet) 13 | { 14 | session.Player.HouseDoctorAccessTime = TimeInfo.Now(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/Game/TimeSyncHandler.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Packets; 4 | using MapleServer2.Servers.Game; 5 | 6 | namespace MapleServer2.PacketHandlers.Game; 7 | 8 | public class TimeSyncHandler : GamePacketHandler 9 | { 10 | public override RecvOp OpCode => RecvOp.RequestTimeSync; 11 | 12 | public override void Handle(GameSession session, PacketReader packet) 13 | { 14 | int key = packet.ReadInt(); 15 | 16 | session.Send(TimeSyncPacket.SetSessionServerTick(key)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/GamePacketHandler.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Servers.Game; 4 | using Serilog; 5 | 6 | namespace MapleServer2.PacketHandlers; 7 | 8 | public abstract class GamePacketHandler : IPacketHandler 9 | { 10 | public abstract RecvOp OpCode { get; } 11 | 12 | protected static readonly ILogger Logger = Log.Logger.ForContext(); 13 | 14 | public abstract void Handle(GameSession session, PacketReader packet); 15 | 16 | public override string ToString() 17 | { 18 | return $"[{OpCode}] Game.{GetType().Name}"; 19 | } 20 | 21 | protected void LogUnknownMode(Enum mode) 22 | { 23 | Logger.Warning("New Unknown {0}: 0x{1}", mode.GetType().Name, mode.ToString("X")); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/IPacketHandler.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Network; 4 | 5 | namespace MapleServer2.PacketHandlers; 6 | 7 | // All implementing classes should be thread safe and stateless. 8 | // All state should be stored in Session 9 | public interface IPacketHandler where T : Session 10 | { 11 | public RecvOp OpCode { get; } 12 | 13 | public void Handle(T session, PacketReader packet); 14 | } 15 | -------------------------------------------------------------------------------- /MapleServer2/PacketHandlers/LoginPacketHandler.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Servers.Login; 4 | using Serilog; 5 | 6 | namespace MapleServer2.PacketHandlers; 7 | 8 | public abstract class LoginPacketHandler : IPacketHandler 9 | { 10 | public abstract RecvOp OpCode { get; } 11 | 12 | protected readonly ILogger Logger = Log.Logger.ForContext(); 13 | 14 | public abstract void Handle(LoginSession session, PacketReader packet); 15 | 16 | public override string ToString() 17 | { 18 | return $"[{OpCode}] Login.{GetType().Name}"; 19 | } 20 | 21 | protected void LogUnknownMode(Enum mode) 22 | { 23 | Logger.Warning("New Unknown {0}: 0x{1}", mode.GetType().Name, mode.ToString("X")); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /MapleServer2/Packets/AttendancePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class AttendancePacket 7 | { 8 | private enum Mode : byte 9 | { 10 | Notice = 0x9 11 | } 12 | 13 | public static PacketWriter Notice(byte noticeId) 14 | { 15 | PacketWriter pWriter = PacketWriter.Of(SendOp.Attendance); 16 | pWriter.Write(Mode.Notice); 17 | pWriter.WriteByte(noticeId); 18 | return pWriter; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /MapleServer2/Packets/BirthdayPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public class BirthdayPacket 7 | { 8 | private enum Mode : byte 9 | { 10 | SetBirthday = 0x1 11 | } 12 | 13 | public static PacketWriter SetBirthday(int playerObjectId, long birthdate) 14 | { 15 | PacketWriter pWriter = PacketWriter.Of(SendOp.Birthday); 16 | pWriter.Write(Mode.SetBirthday); 17 | pWriter.WriteInt(playerObjectId); 18 | pWriter.WriteLong(birthdate); 19 | return pWriter; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Packets/CashPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class CashPacket 7 | { 8 | private enum Mode : byte 9 | { 10 | Mode09 = 0x09 11 | } 12 | 13 | public static PacketWriter Unknown09() 14 | { 15 | PacketWriter pWriter = PacketWriter.Of(SendOp.Cash); 16 | pWriter.Write(Mode.Mode09); 17 | pWriter.WriteByte(); 18 | 19 | return pWriter; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Packets/ChangeAttributesPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Packets.Helpers; 4 | using MapleServer2.Types; 5 | 6 | namespace MapleServer2.Packets; 7 | 8 | public static class ChangeAttributesPacket 9 | { 10 | public static PacketWriter PreviewNewItem(Item item) 11 | { 12 | PacketWriter pWriter = PacketWriter.Of(SendOp.ChangeAttributes); 13 | pWriter.WriteByte(0x01); 14 | pWriter.WriteLong(item.Uid); 15 | pWriter.WriteItem(item); 16 | 17 | return pWriter; 18 | } 19 | 20 | public static PacketWriter AddNewItem(Item item) 21 | { 22 | PacketWriter pWriter = PacketWriter.Of(SendOp.ChangeAttributes); 23 | pWriter.WriteByte(0x02); 24 | pWriter.WriteLong(item.Uid); 25 | pWriter.WriteItem(item); 26 | 27 | return pWriter; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /MapleServer2/Packets/ChangeBackgroundPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class ChangeBackgroundPacket 7 | { 8 | public static PacketWriter ChangeBackground(string dds) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.ChangeBackground); 11 | 12 | pWriter.WriteString(dds); 13 | return pWriter; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MapleServer2/Packets/CharacterNameChangePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class CharacterNameChangePacket 7 | { 8 | public static PacketWriter NameResult(bool nameBeingUsed, string characterName, long itemUid) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.CheckCharNameResult); 11 | pWriter.WriteBool(nameBeingUsed); 12 | pWriter.WriteLong(itemUid); 13 | pWriter.WriteUnicodeString(characterName); 14 | return pWriter; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Packets/DungeonListPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class DungeonListPacket 7 | { 8 | public static PacketWriter DungeonList() 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.DungeonList); 11 | pWriter.WriteByte(); 12 | pWriter.WriteInt(1); // dungeon count 13 | for (int i = 0; i < 1; i++) 14 | { 15 | pWriter.WriteInt(25001001); // dungeon id 16 | pWriter.WriteBool(true); // Eligibility: false = rookie, true = veteran, if id isn't sent = "insufficient level" 17 | } 18 | 19 | return pWriter; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Packets/DungeonWaitPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class DungeonWaitPacket 7 | { 8 | public static PacketWriter Show(int dungeonId, int playerCountDisplay) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.DungeonWait); 11 | pWriter.WriteInt(dungeonId); 12 | pWriter.WriteInt(playerCountDisplay); 13 | return pWriter; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MapleServer2/Packets/DynamicChannelPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class DynamicChannelPacket 7 | { 8 | public static PacketWriter DynamicChannel(short channelCount) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.DynamicChannel); 11 | pWriter.WriteByte(); 12 | pWriter.WriteShort(10); 13 | pWriter.WriteShort(channelCount); 14 | pWriter.WriteShort(9); 15 | pWriter.WriteShort(9); 16 | pWriter.WriteShort(9); 17 | pWriter.WriteShort(10); 18 | pWriter.WriteShort(10); 19 | pWriter.WriteShort(10); 20 | 21 | return pWriter; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /MapleServer2/Packets/ExperiencePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class ExperiencePacket 7 | { 8 | public static PacketWriter ExpUp(long expGained, long expTotal, long restExp) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.ExpUp); 11 | 12 | pWriter.WriteByte(); 13 | pWriter.WriteLong(expGained); 14 | pWriter.WriteShort(); // means something 15 | pWriter.WriteLong(expTotal); 16 | pWriter.WriteLong(restExp); 17 | pWriter.WriteInt(); // counter? increments after every exp_up 18 | pWriter.WriteByte(); 19 | 20 | return pWriter; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /MapleServer2/Packets/FallDamagePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class FallDamagePacket 7 | { 8 | public static PacketWriter FallDamage(int objectId, int hpLost) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.StateFallDmg); 11 | pWriter.WriteInt(objectId); 12 | pWriter.WriteInt(hpLost); 13 | 14 | return pWriter; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Packets/FieldEnterPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Types; 4 | 5 | namespace MapleServer2.Packets; 6 | 7 | public static class FieldEnterPacket 8 | { 9 | public static PacketWriter RequestEnter(IFieldActor fieldPlayer) 10 | { 11 | PacketWriter pWriter = PacketWriter.Of(SendOp.RequestFieldEnter); 12 | pWriter.WriteByte(); 13 | pWriter.WriteInt(fieldPlayer.Value.MapId); 14 | pWriter.WriteByte(); 15 | pWriter.WriteByte(); 16 | pWriter.WriteInt(); 17 | pWriter.WriteInt(); 18 | pWriter.Write(fieldPlayer.Coord); 19 | pWriter.Write(fieldPlayer.Rotation); 20 | pWriter.WriteInt(); // Whatever is here seems to be repeated by client in FIELD_ENTER response. 21 | 22 | return pWriter; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /MapleServer2/Packets/FieldWarPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class FieldWarPacket 7 | { 8 | private enum Mode : byte 9 | { 10 | LegionPopup = 0x0 11 | } 12 | 13 | public static PacketWriter LegionPopup(int fieldWarId, long epochTime) 14 | { 15 | PacketWriter pWriter = PacketWriter.Of(SendOp.FieldWar); 16 | pWriter.Write(Mode.LegionPopup); 17 | pWriter.WriteInt(fieldWarId); 18 | pWriter.WriteLong(epochTime); 19 | return pWriter; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Packets/FollowNpcPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class FollowNpcPacket 7 | { 8 | public static PacketWriter FollowNpc(int objectId) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.FollowNPC); 11 | pWriter.WriteInt(objectId); 12 | 13 | return pWriter; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MapleServer2/Packets/HandshakePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Enums; 4 | 5 | namespace MapleServer2.Packets; 6 | 7 | public static class HandshakePacket 8 | { 9 | public static PacketWriter Handshake(uint version, uint riv, uint siv, uint blockIv, PatchType patchType, int handshakeSize) 10 | { 11 | PacketWriter handshake = PacketWriter.Of(SendOp.RequestVersion, handshakeSize); 12 | handshake.Write(version); 13 | handshake.Write(riv); 14 | handshake.Write(siv); 15 | handshake.Write(blockIv); 16 | handshake.Write(patchType); 17 | 18 | return handshake; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /MapleServer2/Packets/HeartbeatPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class HeartbeatPacket 7 | { 8 | public static PacketWriter Request() 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.RequestHeartBeat); 11 | pWriter.WriteInt(Environment.TickCount); 12 | return pWriter; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MapleServer2/Packets/HomeBank.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class HomeBank 7 | { 8 | public static PacketWriter OpenBank(long date = 0) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.HomeBank); 11 | pWriter.WriteLong(date); // cooldown timer 12 | 13 | return pWriter; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MapleServer2/Packets/InsigniaPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class InsigniaPacket 7 | { 8 | public static PacketWriter UpdateInsignia(int playerObjectId, short insigniaId, bool show) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.NameTagSymbol); 11 | pWriter.WriteInt(playerObjectId); 12 | pWriter.WriteShort(insigniaId); 13 | pWriter.WriteBool(show); 14 | return pWriter; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Packets/InviteToHomePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Types; 4 | 5 | namespace MapleServer2.Packets; 6 | 7 | public static class InviteToHomePacket 8 | { 9 | public static PacketWriter InviteToHome(Player sourcePlayer) 10 | { 11 | PacketWriter pWriter = PacketWriter.Of(SendOp.InviteToHome); 12 | pWriter.WriteByte(2); 13 | pWriter.WriteLong(sourcePlayer.AccountId); 14 | pWriter.WriteUnicodeString(sourcePlayer.Name); 15 | 16 | return pWriter; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /MapleServer2/Packets/ItemEnchantTransferPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class ItemEnchantTransferPacket 7 | { 8 | public static PacketWriter Transfer() 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.ItemEnchantTransform); 11 | return pWriter; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /MapleServer2/Packets/ItemExchangePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class ItemExchangePacket 7 | { 8 | private enum Mode : byte 9 | { 10 | Notice = 0x2 11 | } 12 | 13 | public static PacketWriter Notice(short noticeId) 14 | { 15 | PacketWriter pWriter = PacketWriter.Of(SendOp.ItemExchange); 16 | pWriter.Write(Mode.Notice); 17 | pWriter.WriteShort(noticeId); 18 | return pWriter; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /MapleServer2/Packets/ItemExtraDataPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Types; 4 | 5 | namespace MapleServer2.Packets; 6 | 7 | public static class ItemExtraDataPacket 8 | { 9 | public static PacketWriter Update(IFieldObject player, Item item) 10 | { 11 | PacketWriter pWriter = PacketWriter.Of(SendOp.ItemExtraData); 12 | pWriter.WriteInt(player.ObjectId); 13 | pWriter.WriteLong(item.Uid); 14 | return pWriter; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Packets/ItemLinkPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Packets.Helpers; 4 | using MapleServer2.Types; 5 | 6 | namespace MapleServer2.Packets; 7 | 8 | public static class ItemLinkPacket 9 | { 10 | public static PacketWriter SendLinkItem(List items) 11 | { 12 | PacketWriter pWriter = PacketWriter.Of(SendOp.UserChatItemLink); 13 | pWriter.WriteInt(items.Count); 14 | foreach (Item item in items) 15 | { 16 | pWriter.WriteLong(item.Uid); 17 | pWriter.WriteInt(item.Id); 18 | pWriter.WriteInt(item.Rarity); 19 | pWriter.WriteItem(item); 20 | } 21 | return pWriter; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /MapleServer2/Packets/ItemUsePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.PacketHandlers.Game; 4 | 5 | namespace MapleServer2.Packets; 6 | 7 | public static class ItemUsePacket 8 | { 9 | public static PacketWriter Use(int id, int amount, OpenBoxResult openBoxResult) 10 | { 11 | PacketWriter pWriter = PacketWriter.Of(SendOp.ItemUse); 12 | 13 | pWriter.WriteInt(id); 14 | pWriter.WriteInt(amount); 15 | pWriter.Write(openBoxResult); 16 | 17 | return pWriter; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MapleServer2/Packets/LevelUpPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class LevelUpPacket 7 | { 8 | public static PacketWriter LevelUp(int playerObjectId, short level) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.LevelUp); 11 | 12 | pWriter.WriteInt(playerObjectId); 13 | pWriter.WriteShort(level); 14 | 15 | return pWriter; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /MapleServer2/Packets/LocalCameraPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class LocalCameraPacket 7 | { 8 | public static PacketWriter Camera(int localCameraId, byte state, int objectId = 0) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.LocalCamera); 11 | pWriter.WriteInt(localCameraId); 12 | pWriter.WriteByte(state); // 00 = reset, 01 = hide player, 02 = show player 13 | pWriter.WriteInt(objectId); 14 | return pWriter; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Packets/MeretsPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Types; 4 | 5 | namespace MapleServer2.Packets; 6 | 7 | internal class MeretsPacket 8 | { 9 | public static PacketWriter UpdateMerets(Account account, long amountGain = 0) 10 | { 11 | PacketWriter pWriter = PacketWriter.Of(SendOp.Meret); 12 | 13 | pWriter.WriteLong(); // Total amount of merets 14 | pWriter.WriteLong(account.Meret.Amount); 15 | pWriter.WriteLong(account.GameMeret.Amount); 16 | pWriter.WriteLong(account.EventMeret.Amount); 17 | pWriter.WriteLong(amountGain); // Message: 'You won {amount} merets' 18 | 19 | return pWriter; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Packets/MesosPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | internal class MesosPacket 7 | { 8 | public static PacketWriter UpdateMesos(long mesoAmount) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.Meso); 11 | 12 | pWriter.WriteLong(mesoAmount); // Total amount of mesos 13 | pWriter.WriteInt(); // unknown int 14 | 15 | return pWriter; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /MapleServer2/Packets/MoveResultPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class MoveResultPacket 7 | { 8 | public static PacketWriter SendStatus(byte status) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.MoveResult); 11 | pWriter.WriteByte(status); // 0 = success, others = different error messages 12 | 13 | return pWriter; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MapleServer2/Packets/MyInfoPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Types; 4 | 5 | namespace MapleServer2.Packets; 6 | 7 | public static class MyInfoPacket 8 | { 9 | public static PacketWriter SetMotto(IFieldObject pObject, string motto) 10 | { 11 | PacketWriter pWriter = PacketWriter.Of(SendOp.MyInfo); 12 | pWriter.WriteInt(pObject.ObjectId); 13 | pWriter.WriteUnicodeString(motto); 14 | pWriter.WriteInt(); //Unk 15 | pWriter.WriteShort(); //Unk 16 | 17 | return pWriter; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MapleServer2/Packets/NpsInfoPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class NpsInfoPacket 7 | { 8 | public static PacketWriter SendUsername(string username) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.NpsInfo); 11 | pWriter.WriteLong(); 12 | pWriter.WriteUnicodeString(username); 13 | 14 | return pWriter; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Packets/OneTimeEffectPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class OneTimeEffectPacket 7 | { 8 | public static PacketWriter View(int id, bool enable, string path = "") 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.OneTimeEffect); 11 | pWriter.WriteInt(id); 12 | pWriter.WriteBool(enable); 13 | if (enable) 14 | { 15 | pWriter.WriteUnicodeString(path); 16 | } 17 | return pWriter; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MapleServer2/Packets/PetSkinPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Types; 4 | 5 | namespace MapleServer2.Packets; 6 | 7 | public static class PetSkinPacket 8 | { 9 | private enum Mode : byte 10 | { 11 | Skin = 0x0 12 | } 13 | 14 | public static PacketWriter Extract(long petUid, Item badge) 15 | { 16 | PacketWriter pWriter = PacketWriter.Of(SendOp.PetSkin); 17 | pWriter.Write(Mode.Skin); 18 | pWriter.WriteLong(petUid); 19 | pWriter.WriteLong(badge.Uid); 20 | pWriter.WriteInt(badge.PetSkinBadgeId); 21 | return pWriter; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /MapleServer2/Packets/RevivalConfirmPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class RevivalConfirmPacket 7 | { 8 | public static PacketWriter Send(int objectId, long unk) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.RevivalConfirm); 11 | 12 | pWriter.WriteInt(objectId); 13 | pWriter.WriteLong(unk); 14 | 15 | return pWriter; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /MapleServer2/Packets/SetCameraPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class SetCameraPacket 7 | { 8 | public static PacketWriter Set(float interpolationTime) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.SetCamera); 11 | pWriter.WriteFloat(interpolationTime); 12 | return pWriter; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MapleServer2/Packets/SkillCancelPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class SkillCancelPacket 7 | { 8 | public static PacketWriter SkillCancel(long skillSn, int playerObjectId) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.SkillCancel); 11 | pWriter.WriteLong(skillSn); 12 | pWriter.WriteInt(playerObjectId); 13 | 14 | return pWriter; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Packets/SkinColorPacket.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | using MaplePacketLib2.Tools; 3 | using MapleServer2.Constants; 4 | using MapleServer2.Types; 5 | 6 | namespace MapleServer2.Packets; 7 | 8 | public static class SkinColorPacket 9 | { 10 | public static PacketWriter Update(IFieldObject player, SkinColor skinColor) 11 | { 12 | PacketWriter pWriter = PacketWriter.Of(SendOp.UserSkinColor); 13 | pWriter.WriteInt(player.ObjectId); 14 | pWriter.Write(skinColor); 15 | return pWriter; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /MapleServer2/Packets/StoryBookPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class StoryBookPacket 7 | { 8 | public static PacketWriter Open(int storyBookId) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.StoryBook); 11 | pWriter.WriteInt(storyBookId); 12 | return pWriter; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MapleServer2/Packets/SyncNumberPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class SyncNumberPacket 7 | { 8 | public static PacketWriter Send() 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.SyncNumber); 11 | pWriter.WriteByte(); 12 | return pWriter; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MapleServer2/Packets/SyncValuePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class SyncValuePacket 7 | { 8 | public static PacketWriter SetSyncValue(int value) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.SyncValue); 11 | pWriter.WriteInt(value); 12 | 13 | return pWriter; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MapleServer2/Packets/SystemShopPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class SystemShopPacket 7 | { 8 | private enum Mode : byte 9 | { 10 | Open = 0x0A 11 | } 12 | 13 | public static PacketWriter Open() 14 | { 15 | PacketWriter pWriter = PacketWriter.Of(SendOp.SystemShop); 16 | pWriter.Write(Mode.Open); 17 | pWriter.WriteByte(0x1); 18 | return pWriter; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /MapleServer2/Packets/SystemSoundPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class SystemSoundPacket 7 | { 8 | public static PacketWriter Play(string sound) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.PlaySystemSound); 11 | pWriter.WriteUnicodeString(sound); 12 | return pWriter; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MapleServer2/Packets/TaxiPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class TaxiPacket 7 | { 8 | public static PacketWriter DiscoverTaxi(int mapId) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.Taxi); 11 | pWriter.WriteInt(1); 12 | pWriter.WriteInt(mapId); 13 | pWriter.WriteByte(1); 14 | 15 | return pWriter; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /MapleServer2/Packets/TimeScalePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class TimeScalePacket 7 | { 8 | public static PacketWriter SetTimeScale(bool enable, float startScale, float endScale, float duration, byte interpolator) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.TimeScale); 11 | pWriter.WriteBool(enable); 12 | pWriter.WriteFloat(startScale); 13 | pWriter.WriteFloat(endScale); 14 | pWriter.WriteFloat(duration); 15 | pWriter.WriteByte(interpolator); 16 | return pWriter; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /MapleServer2/Packets/UserBattlePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Types; 4 | 5 | namespace MapleServer2.Packets; 6 | 7 | public static class UserBattlePacket 8 | { 9 | public static PacketWriter UserBattle(IFieldObject player, bool flag) 10 | { 11 | PacketWriter pWriter = PacketWriter.Of(SendOp.UserBattle); 12 | pWriter.WriteInt(player.ObjectId); 13 | pWriter.WriteBool(flag); 14 | return pWriter; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Packets/UserMoveByPortalPacket.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | using MaplePacketLib2.Tools; 3 | using MapleServer2.Constants; 4 | using MapleServer2.Types; 5 | 6 | namespace MapleServer2.Packets; 7 | 8 | public static class UserMoveByPortalPacket 9 | { 10 | public static PacketWriter Move(IFieldObject fieldPlayer, CoordF coords, CoordF rotation, bool isTrigger = false) 11 | { 12 | coords.Z += 25; // make sure coord is above ground 13 | 14 | PacketWriter pWriter = PacketWriter.Of(SendOp.UserMoveByPortal); 15 | pWriter.WriteInt(fieldPlayer.ObjectId); 16 | pWriter.Write(coords); 17 | pWriter.Write(rotation); 18 | pWriter.WriteBool(isTrigger); 19 | 20 | return pWriter; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /MapleServer2/Packets/WalletPacket.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Enums; 2 | using MaplePacketLib2.Tools; 3 | using MapleServer2.Constants; 4 | 5 | namespace MapleServer2.Packets; 6 | 7 | internal static class WalletPacket 8 | { 9 | public static PacketWriter UpdateWallet(CurrencyType type, long amount) 10 | { 11 | PacketWriter pWriter = PacketWriter.Of(SendOp.MesoToken); 12 | 13 | pWriter.WriteByte((byte) type); // type of currency 14 | pWriter.WriteLong(amount); // currency amount 15 | pWriter.WriteLong(-1); // always the same 16 | pWriter.WriteInt(52); // always the same 17 | pWriter.WriteLong(); // unk 18 | 19 | return pWriter; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Packets/WardrobePacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | using MapleServer2.Types; 4 | 5 | namespace MapleServer2.Packets; 6 | 7 | public static class WardrobePacket 8 | { 9 | private enum Mode : byte 10 | { 11 | Load = 0x5 12 | } 13 | 14 | public static PacketWriter Load(Wardrobe wardrobe) 15 | { 16 | PacketWriter pWriter = PacketWriter.Of(SendOp.Wardrobe); 17 | pWriter.Write(Mode.Load); 18 | pWriter.WriteClass(wardrobe); 19 | return pWriter; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Packets/WebOpenPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class WebOpenPacket 7 | { 8 | public static PacketWriter Open(string url) 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.WebOpen); 11 | pWriter.WriteByte(1); 12 | pWriter.WriteUnicodeString(url); 13 | return pWriter; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MapleServer2/Packets/WorldMapPacket.cs: -------------------------------------------------------------------------------- 1 | using MaplePacketLib2.Tools; 2 | using MapleServer2.Constants; 3 | 4 | namespace MapleServer2.Packets; 5 | 6 | public static class WorldMapPacket 7 | { 8 | public static PacketWriter Open() 9 | { 10 | PacketWriter pWriter = PacketWriter.Of(SendOp.WorldMap); 11 | 12 | // Expect 4 bytes 13 | // 0X 00 00 00 breaks map 14 | // 00 01 00 00 breaks map => wants 1 int 15 | // 00 00 0X 00 breaks map => wants 1 more byte 16 | // 00 00 00 0X breaks map => wants 1 more byte 17 | // seems like map data seems to be sent elsewhere, perhaps FIELD_ADD_USER 18 | 19 | pWriter.WriteByte(); 20 | pWriter.WriteByte(); 21 | pWriter.WriteByte(); 22 | pWriter.WriteByte(); 23 | 24 | return pWriter; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /MapleServer2/Servers/Login/LoginSession.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Enums; 2 | using MapleServer2.Network; 3 | using MapleServer2.Packets; 4 | 5 | namespace MapleServer2.Servers.Login; 6 | 7 | public class LoginSession : Session 8 | { 9 | protected override PatchType Type => PatchType.Delete; 10 | 11 | public long AccountId; 12 | public long CharacterId; 13 | public int ServerTick; 14 | public int ClientTick; 15 | 16 | protected override void EndSession(bool logoutNotice) { } 17 | 18 | public Task HeartbeatLoop() 19 | { 20 | return Task.Run(async () => 21 | { 22 | while (this != null) 23 | { 24 | Send(HeartbeatPacket.Request()); 25 | await Task.Delay(30000); // every 30 seconds 26 | } 27 | }); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /MapleServer2/Tools/GuidGenerator.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Tools; 2 | 3 | public static class GuidGenerator 4 | { 5 | // Generate a 64 bit Guid 6 | public static long Long() 7 | { 8 | return Math.Abs(BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0)); 9 | } 10 | 11 | // Generate a 32 bit Guid 12 | public static int Int() 13 | { 14 | return Math.Abs(Guid.NewGuid().GetHashCode()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Tools/ListExtension.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Tools; 2 | 3 | public static class ListExtension 4 | { 5 | public static IEnumerable> SplitList(this List locations, int nSize = 30) 6 | { 7 | for (int i = 0; i < locations.Count; i += nSize) 8 | { 9 | yield return locations.GetRange(i, Math.Min(nSize, locations.Count - i)); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /MapleServer2/Types/AIState.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.AI.Functions; 2 | 3 | namespace MapleServer2.Types; 4 | 5 | public abstract class AIState 6 | { 7 | protected readonly AIContext Context; 8 | 9 | protected AIState(AIContext context) => Context = context; 10 | 11 | public abstract void OnEnter(); 12 | 13 | public abstract AIState? Execute(); 14 | 15 | public abstract void OnExit(); 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Types/AuthData.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Database; 2 | using MapleServer2.Tools; 3 | 4 | namespace MapleServer2.Types; 5 | 6 | public class AuthData 7 | { 8 | public readonly int TokenA; 9 | public readonly int TokenB; 10 | 11 | public readonly long AccountId; 12 | public long OnlineCharacterId; 13 | 14 | public AuthData(long accountId) 15 | { 16 | AccountId = accountId; 17 | TokenA = GuidGenerator.Int(); 18 | TokenB = GuidGenerator.Int(); 19 | DatabaseManager.AuthData.Insert(this); 20 | } 21 | 22 | public AuthData(int tokenA, int tokenB, long accountId, long onlineCharacterId) 23 | { 24 | TokenA = tokenA; 25 | TokenB = tokenB; 26 | AccountId = accountId; 27 | OnlineCharacterId = onlineCharacterId; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /MapleServer2/Types/ChatSticker.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class ChatSticker 4 | { 5 | public readonly byte GroupId; 6 | public readonly long Expiration; 7 | 8 | public ChatSticker(byte groupId, long expiration) 9 | { 10 | GroupId = groupId; 11 | Expiration = expiration; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /MapleServer2/Types/ClubMember.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Database; 2 | 3 | namespace MapleServer2.Types; 4 | 5 | public class ClubMember 6 | { 7 | public Player Player; 8 | public long JoinTimestamp; 9 | public long ClubId; 10 | public ClubInviteResponse InviteResponse; 11 | 12 | public ClubMember() { } 13 | 14 | public ClubMember(Player player, long clubId) 15 | { 16 | Player = player; 17 | JoinTimestamp = TimeInfo.Now(); 18 | ClubId = clubId; 19 | InviteResponse = ClubInviteResponse.Pending; 20 | DatabaseManager.ClubMembers.Insert(this); 21 | } 22 | 23 | public ClubMember(Player player, long clubId, long joinTimestamp) 24 | { 25 | Player = player; 26 | JoinTimestamp = joinTimestamp; 27 | ClubId = clubId; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /MapleServer2/Types/ConditionSkillTarget.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Enums; 2 | 3 | namespace MapleServer2.Types; 4 | 5 | public struct ConditionSkillTarget 6 | { 7 | public IFieldActor? Owner; 8 | public IFieldActor? Target; 9 | public IFieldActor? Caster; 10 | public IFieldActor? Attacker = null; 11 | public EffectEventOrigin EventOrigin; 12 | 13 | public ConditionSkillTarget(IFieldActor? owner, IFieldActor? target, IFieldActor? caster, IFieldActor? attacker = null, EffectEventOrigin eventOrigin = EffectEventOrigin.Owner) 14 | { 15 | Owner = owner; 16 | Target = target; 17 | Caster = caster; 18 | Attacker = attacker; 19 | EventOrigin = eventOrigin; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Types/DebugPrintSettings.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class DebugPrintSettings 4 | { 5 | public int TargetsToPrint = 0; 6 | public bool PrintOwnEffects = false; 7 | public bool PrintCastedEffects = false; 8 | public bool PrintEffectsFromOthers = false; 9 | public bool PrintEffectEvents = false; 10 | public bool IncludeEffectTickEvent = false; 11 | public List EffectWatchList = new(); 12 | public List EffectIgnoreList = new(); 13 | } 14 | -------------------------------------------------------------------------------- /MapleServer2/Types/FieldTaskScheduler/TriggerTaskParameters.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public struct TriggerTaskParameters 4 | { 5 | public IFieldActor? Origin = null; // Task is cancelled when this object requests for its referenced tasks to be cleaned up 6 | public Object? Subject = null; // Task is cancelled when this object requests for its referenced tasks to be cleaned up 7 | public long Interval; 8 | public long Delay = 0; 9 | public long Duration = -1; 10 | public int Executions = 1; 11 | public bool FinishAfterDuration = false; 12 | 13 | public TriggerTaskParameters(int interval) 14 | { 15 | Interval = interval; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /MapleServer2/Types/GatheringCount.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class GatheringCount 4 | { 5 | public int RecipeId; 6 | public int CurrentCount; 7 | public int MaxCount; 8 | 9 | public GatheringCount(int recipeId, int currentCount, int maxCount) 10 | { 11 | RecipeId = recipeId; 12 | CurrentCount = currentCount; 13 | MaxCount = maxCount; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MapleServer2/Types/GuideObject.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class GuideObject 4 | { 5 | public long BoundCharacterId; 6 | public byte Type; 7 | public bool IsBall; 8 | 9 | public GuideObject(byte type, long characterId) 10 | { 11 | Type = type; 12 | BoundCharacterId = characterId; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MapleServer2/Types/Guild/GuildBuff.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class GuildBuff 4 | { 5 | public int Id { get; set; } 6 | public int Level { get; set; } 7 | public int StartTimestamp { get; set; } 8 | 9 | public GuildBuff(int id) 10 | { 11 | Id = id; 12 | Level = 1; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MapleServer2/Types/Guild/GuildRank.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class GuildRank 4 | { 5 | public string Name { get; set; } 6 | public int Rights { get; set; } 7 | 8 | public GuildRank(string name, int rights = 1) 9 | { 10 | Name = name; 11 | Rights = rights; 12 | } 13 | 14 | public bool HasRight(GuildRights guildRight) 15 | { 16 | GuildRights rights = (GuildRights) Rights; 17 | return rights.HasFlag(guildRight); 18 | } 19 | } 20 | [Flags] 21 | public enum GuildRights 22 | { 23 | Default = 1, 24 | CanInvite = 2, 25 | CanGuildNotice = 8, 26 | CanEditEmblem = 64, 27 | CanGuildMail = 128, 28 | CanStartMiniGame = 1024, 29 | CanGuildAlert = 2048 30 | } 31 | -------------------------------------------------------------------------------- /MapleServer2/Types/Guild/GuildServices.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class GuildService 4 | { 5 | public int Id { get; set; } 6 | public int Level { get; set; } 7 | 8 | public GuildService(int id, int level) 9 | { 10 | Id = id; 11 | Level = level; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /MapleServer2/Types/HairInventory.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class HairInventory 4 | { 5 | public List SavedHair = new(); 6 | public Item RandomHair; 7 | } 8 | -------------------------------------------------------------------------------- /MapleServer2/Types/HealingSpot.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | 3 | namespace MapleServer2.Types; 4 | 5 | public class HealingSpot 6 | { 7 | public CoordS Coord { get; } 8 | 9 | public HealingSpot(CoordS coord) 10 | { 11 | Coord = coord; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /MapleServer2/Types/IFieldObject.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | 3 | namespace MapleServer2.Types; 4 | 5 | public interface IFieldObject 6 | { 7 | public int ObjectId { get; } 8 | public CoordF Coord { get; set; } 9 | public CoordF Rotation { get; set; } 10 | public short LookDirection { get; set; } 11 | } 12 | 13 | public interface IFieldObject : IFieldObject 14 | { 15 | public T Value { get; } 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Types/INpc.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Enums; 2 | using Maple2Storage.Types.Metadata; 3 | using MapleServer2.Enums; 4 | 5 | namespace MapleServer2.Types; 6 | 7 | public interface INpc : IFieldActor 8 | { 9 | public NpcState State { get; set; } 10 | public NpcAction Action { get; set; } 11 | public MobMovement Movement { get; set; } 12 | } 13 | -------------------------------------------------------------------------------- /MapleServer2/Types/Instrument.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class Instrument 4 | { 5 | public int GmId; 6 | public int PercussionId; 7 | public bool IsCustomScore; 8 | public Item Score; 9 | public int InstrumentTick; 10 | public int PlayerObjectId; 11 | public bool Improvise; 12 | public bool Ensemble; 13 | 14 | public Instrument(int gmId, int percussionId, bool isCustomScore, int playerObjectId) 15 | { 16 | GmId = gmId; 17 | PercussionId = percussionId; 18 | IsCustomScore = isCustomScore; 19 | PlayerObjectId = playerObjectId; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MapleServer2/Types/LiftableObject.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types.Metadata; 2 | 3 | namespace MapleServer2.Types; 4 | 5 | public class LiftableObject 6 | { 7 | public readonly string EntityId; 8 | public readonly MapLiftableObject Metadata; 9 | public LiftableState State; 10 | public int ItemCount; 11 | 12 | public LiftableObject(string entityId, MapLiftableObject metadata) 13 | { 14 | EntityId = entityId; 15 | Metadata = metadata; 16 | State = LiftableState.Active; 17 | ItemCount = metadata.ItemStackCount; 18 | } 19 | } 20 | 21 | public enum LiftableState : byte 22 | { 23 | Active = 0, 24 | Removed = 1, 25 | Disabled = 2 26 | } 27 | -------------------------------------------------------------------------------- /MapleServer2/Types/Macro.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Database; 2 | 3 | namespace MapleServer2.Types; 4 | 5 | public class Macro 6 | { 7 | public long Id { get; set; } 8 | public long CharacterId { get; set; } 9 | public string Name; 10 | public long ShortcutKeyCode; 11 | public List SkillIds; 12 | 13 | public Macro(long characterId, string name, long keyCode, List skillIds) 14 | { 15 | CharacterId = characterId; 16 | Name = name; 17 | ShortcutKeyCode = keyCode; 18 | SkillIds = skillIds; 19 | Id = DatabaseManager.Macros.Insert(this); 20 | } 21 | 22 | public Macro(long id, long characterId, string name, long keyCode, List skillIds) 23 | { 24 | Id = id; 25 | CharacterId = characterId; 26 | Name = name; 27 | ShortcutKeyCode = keyCode; 28 | SkillIds = skillIds; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /MapleServer2/Types/MapTimer.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class MapTimer 4 | { 5 | public readonly string Id; 6 | public int StartTick; 7 | public int EndTick; 8 | 9 | public MapTimer(string id, int endTick) 10 | { 11 | Id = id; 12 | StartTick = Environment.TickCount; 13 | EndTick = endTick; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MapleServer2/Types/MapleopolyTile.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class MapleopolyTile 4 | { 5 | public const int TILE_AMOUNT = 28; 6 | public int TilePosition; 7 | public MapleopolyTileType Type; 8 | public int TileParameter; 9 | public int ItemId; 10 | public byte ItemRarity; 11 | public int ItemAmount; 12 | 13 | public MapleopolyTile() { } 14 | } 15 | public enum MapleopolyTileType : short 16 | { 17 | Item = 0x0, 18 | Lose = 0x1, 19 | Backtrack = 0x2, 20 | MoveForward = 0x3, 21 | GoToStart = 0x4, 22 | RollAgain = 0x5, 23 | Start = 0x6, 24 | Trap = 0x7, 25 | RoundTrip = 0x8, 26 | TreasureTrove = 0x9 27 | } 28 | -------------------------------------------------------------------------------- /MapleServer2/Types/MasteryExp.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Enums; 2 | 3 | namespace MapleServer2.Types; 4 | 5 | public class MasteryExp 6 | { 7 | public MasteryType Type { get; } 8 | public int Level; 9 | public long CurrentExp { get; set; } 10 | 11 | public MasteryExp(MasteryType type, int level = 0, long currentExp = 0) 12 | { 13 | Type = type; 14 | Level = level; 15 | CurrentExp = currentExp; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /MapleServer2/Types/Mount.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Enums; 2 | 3 | namespace MapleServer2.Types; 4 | 5 | public class Mount 6 | { 7 | public RideType Type; 8 | public int Id; 9 | public long Uid; 10 | public IFieldObject[] Players = new IFieldObject[3]; 11 | public UGC? Ugc; 12 | } 13 | -------------------------------------------------------------------------------- /MapleServer2/Types/MusicScore.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class MusicScore 4 | { 5 | public int Length { get; set; } 6 | public string Title { get; set; } 7 | public string Composer { get; set; } 8 | public long ComposerCharacterId { get; set; } 9 | public int Type { get; set; } 10 | public bool Locked { get; set; } // 01 = if player != composer 11 | public string Notes { get; set; } 12 | 13 | public MusicScore() 14 | { 15 | Composer = ""; 16 | Title = ""; 17 | Notes = ""; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MapleServer2/Types/PlayerTrigger.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class PlayerTrigger 4 | { 5 | public string Key; 6 | public int Value; 7 | public int TriggerId; 8 | 9 | public PlayerTrigger(string key) 10 | { 11 | Key = key; 12 | } 13 | 14 | public PlayerTrigger(string key, int value) 15 | { 16 | Key = key; 17 | Value = value; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MapleServer2/Types/PrestigeMission.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class PrestigeMission 4 | { 5 | public readonly int Id; 6 | public int LevelCount; 7 | public bool Claimed; 8 | 9 | public PrestigeMission(int id) 10 | { 11 | Id = id; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /MapleServer2/Types/Shop/BuyBackItem.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public class BuyBackItem 4 | { 5 | public readonly long AddedTimestamp; 6 | public readonly long Price; 7 | public readonly Item Item; 8 | 9 | public BuyBackItem(Item item, long price) 10 | { 11 | AddedTimestamp = TimeInfo.Now(); 12 | Price = price; 13 | Item = item; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MapleServer2/Types/StatusHandler.cs: -------------------------------------------------------------------------------- 1 | using MapleServer2.Packets; 2 | using MapleServer2.Servers.Game; 3 | 4 | namespace MapleServer2.Types; 5 | 6 | public static class StatusHandler 7 | { 8 | // Public caller to handle status on Player 9 | // TODO: Handle Add Stacks to status. 10 | public static void Handle(GameSession session, Status status) 11 | { 12 | session.FieldManager.BroadcastPacket(BuffPacket.AddBuff(status)); 13 | Remove(session, status); 14 | } 15 | 16 | private static Task Remove(GameSession session, Status status) 17 | { 18 | return Task.Run(async () => 19 | { 20 | await Task.Delay(status.Duration); 21 | session.FieldManager.BroadcastPacket(BuffPacket.RemoveBuff(status)); 22 | }); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /MapleServer2/Types/TimeInfo.cs: -------------------------------------------------------------------------------- 1 | namespace MapleServer2.Types; 2 | 3 | public static class TimeInfo 4 | { 5 | public const int SecondsInMonth = 2628000; 6 | public const int SecondsInWeek = 604800; 7 | public const int SecondsInDay = 86400; 8 | 9 | public static long Now() => DateTimeOffset.UtcNow.ToUnixTimeSeconds(); 10 | 11 | public static DateTime CurrentDate() => DateTimeOffset.UtcNow.UtcDateTime; 12 | 13 | public static long AddDays(int days) => DateTimeOffset.UtcNow.AddDays(days).ToUnixTimeSeconds(); 14 | 15 | public static long Tomorrow() => ((DateTimeOffset) DateTime.Now.AddDays(1).ToUniversalTime().Date).ToUnixTimeSeconds(); 16 | } 17 | -------------------------------------------------------------------------------- /MapleServer2/Types/Widget.cs: -------------------------------------------------------------------------------- 1 | using Maple2.Trigger.Enum; 2 | using MapleServer2.Database.Types; 3 | 4 | namespace MapleServer2.Types; 5 | 6 | public class Widget 7 | { 8 | public int Id; 9 | public WidgetType Type; 10 | public string State; 11 | public string Arg; // unclear what this is 12 | public OXQuizQuestion OXQuizQuestion; 13 | 14 | public Widget(WidgetType type) 15 | { 16 | Type = type; 17 | Arg = ""; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MapleWebServer/Endpoints/BannerEndpoint.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | 3 | namespace MapleWebServer.Endpoints; 4 | 5 | public static class BannerEndpoint 6 | { 7 | public static IResult Get(int bannerId, string fileHash) 8 | { 9 | string fullPath = $"{Paths.DATA_DIR}/banner/{bannerId}/{fileHash}.m2u"; 10 | if (!File.Exists(fullPath)) 11 | { 12 | return Results.BadRequest(); 13 | } 14 | 15 | FileStream guildEmblem = File.OpenRead(fullPath); 16 | return Results.File(guildEmblem, contentType: "application/octet-stream"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /MapleWebServer/Endpoints/ItemEndpoint.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | 3 | namespace MapleWebServer.Endpoints; 4 | 5 | public static class ItemEndpoint 6 | { 7 | public static IResult Get(int itemId, string uuid) 8 | { 9 | string fullPath = $"{Paths.DATA_DIR}/item/{itemId}/{uuid}.m2u"; 10 | if (!File.Exists(fullPath)) 11 | { 12 | return Results.BadRequest(); 13 | } 14 | 15 | FileStream profileImage = File.OpenRead(fullPath); 16 | return Results.File(profileImage, contentType: "application/octet-stream"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /MapleWebServer/Endpoints/ItemIconEndpoint.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | 3 | namespace MapleWebServer.Endpoints; 4 | 5 | public static class ItemIconEndpoint 6 | { 7 | public static IResult Get(int itemId, string uuid) 8 | { 9 | string fullPath = $"{Paths.DATA_DIR}/itemicon/{itemId}/{uuid}.png"; 10 | if (!File.Exists(fullPath)) 11 | { 12 | return Results.BadRequest(); 13 | } 14 | 15 | FileStream profileImage = File.OpenRead(fullPath); 16 | return Results.File(profileImage, contentType: "image/png"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /MapleWebServer/Endpoints/ProfileEndpoint.cs: -------------------------------------------------------------------------------- 1 | using Maple2Storage.Types; 2 | 3 | namespace MapleWebServer.Endpoints; 4 | 5 | public static class ProfileEndpoint 6 | { 7 | public static IResult Get(long characterId, string hash) 8 | { 9 | string fullPath = $"{Paths.DATA_DIR}/profiles/{characterId}/{hash}.png"; 10 | if (!File.Exists(fullPath)) 11 | { 12 | return Results.BadRequest(); 13 | } 14 | 15 | FileStream profileImage = File.OpenRead(fullPath); 16 | return Results.File(profileImage, contentType: "image/png"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /MapleWebServer/MapleWebServer.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | 10 6 | enable 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /MapleWebServer/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "MapleWebServer": { 4 | "commandName": "Project", 5 | "launchBrowser": true, 6 | "environmentVariables": { 7 | "ASPNETCORE_ENVIRONMENT": "Development" 8 | }, 9 | "applicationUrl": "https://localhost:51581;http://localhost:51582" 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /MobAI/AI_DefaultNew.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | --------------------------------------------------------------------------------