diff --git a/data/mcswitch_functions.csv b/data/mcswitch_functions.csv index dcb3e82f..5c0ddf15 100644 --- a/data/mcswitch_functions.csv +++ b/data/mcswitch_functions.csv @@ -580,7 +580,7 @@ Address,Quality,Size,Name 0x00000071000137cc,U,000100, 0x0000007100013830,U,000108, 0x000000710001389c,U,000120, -0x0000007100013914,U,000016, +0x0000007100013914,U,000016,_ZN6Entity10instanceofERKNSt3__110shared_ptrIS_EE11eINSTANCEOF 0x0000007100013924,U,000024, 0x000000710001393c,U,000024, 0x0000007100013954,U,000024, @@ -780,7 +780,7 @@ Address,Quality,Size,Name 0x000000710001c08c,U,000172,_ZN10AnvilBlockC_gen 0x000000710001c138,O,000008,_ZN5Block20registerDefaultStateEPK10BlockState 0x000000710001c140,U,000032,_ZN20BlockStateDefinition3anyEv -0x000000710001c160,U,000096, +0x000000710001c160,O,000096,_ZNK10BlockState8setValueIPK9DirectionEEPKS_P8PropertyT_ 0x000000710001c1c0,O,000096,_ZNK10BlockState8setValueIiEEPKS_P8PropertyT_ 0x000000710001c220,U,000008,_ZN10AnvilBlock12isCubeShapedEPK10BlockState 0x000000710001c228,U,000008,_ZN10AnvilBlock17getBlockFaceShapeEP11LevelSourcePK10BlockStateRK8BlockPosPK9Direction @@ -7112,7 +7112,7 @@ Address,Quality,Size,Name 0x00000071000fd9ac,U,000016, 0x00000071000fd9bc,U,000016, 0x00000071000fd9cc,U,000012, -0x00000071000fd9d8,U,000068, +0x00000071000fd9d8,U,000068,_ZN9Direction5Plane18getRandomDirectionER6Random 0x00000071000fda1c,U,000060, 0x00000071000fda58,U,000028,_ZN16DirectionalBlock15blockStaticCtorEv 0x00000071000fda74,U,000048,_ZN16DirectionalBlockC_gen @@ -11782,7 +11782,7 @@ Address,Quality,Size,Name 0x00000071001974cc,O,000012,_ZN12GenericStats17getParam_swimOneMEi 0x00000071001974d8,O,000012,_ZN12GenericStats17getParam_fallOneMEi 0x00000071001974e4,O,000012,_ZN12GenericStats18getParam_climbOneMEi -0x00000071001974f0,O,000012,_ZN12GenericStats21getParam_minecartOneMEi +0x00000071001974f0,U,000012,_ZN12GenericStats21getParam_minecartOneMEi 0x00000071001974fc,O,000012,_ZN12GenericStats17getParam_boatOneMEi 0x0000007100197508,O,000012,_ZN12GenericStats16getParam_pigOneMEi 0x0000007100197514,O,000012,_ZN12GenericStats19getParam_cowsMilkedEv @@ -11793,7 +11793,7 @@ Address,Quality,Size,Name 0x0000007100197550,O,000012,_ZN12GenericStats21getParam_itemsSmeltedEiii 0x000000710019755c,O,000012,_ZN12GenericStats18getParam_itemsUsedENSt3__110shared_ptrI6PlayerEE12not_null_ptrI12ItemInstanceE 0x0000007100197568,O,000012,_ZN12GenericStats20getParam_itemsBoughtEiii -0x0000007100197574,O,000012,_ZN12GenericStats16getParam_mobKillENSt3__110shared_ptrI6PlayerEENS1_I3MobEEP12DamageSource +0x0000007100197574,U,000012,_ZN12GenericStats16getParam_mobKillENSt3__110shared_ptrI6PlayerEENS1_I3MobEEP12DamageSource 0x0000007100197580,O,000012,_ZN12GenericStats20getParam_breedEntityE11eINSTANCEOF 0x000000710019758c,O,000012,_ZN12GenericStats20getParam_tamedEntityE11eINSTANCEOF 0x0000007100197598,O,000012,_ZN12GenericStats20getParam_curedEntityE11eINSTANCEOF @@ -11822,14 +11822,14 @@ Address,Quality,Size,Name 0x00000071001976f8,O,000016,_ZN12GenericStats23getParam_tisButAScratchEv 0x0000007100197708,O,000016,_ZN12GenericStats14getParam_cupidEv 0x0000007100197718,O,000016,_ZN12GenericStats34getParam_youWontLikeMeWhenImHungryEv -0x0000007100197728,O,000016,_ZN12GenericStats13getParam_mineEv +0x0000007100197728,U,000016,_ZN12GenericStats13getParam_mineEv 0x0000007100197738,O,000016,_ZN12GenericStats22getParam_openInventoryEi 0x0000007100197748,O,000016,_ZN12GenericStats30getParam_chestfulOfCobblestoneEi -0x0000007100197758,O,000016,_ZN12GenericStats22getParam_musicToMyEarsEi +0x0000007100197758,U,000016,_ZN12GenericStats22getParam_musicToMyEarsEi 0x0000007100197768,O,000016,_ZN12GenericStats19getParam_superSonicEi 0x0000007100197778,O,000016,_ZN12GenericStats18getParam_freeDiverEi 0x0000007100197788,O,000016,_ZN12GenericStats17getParam_beamMeUpEi -0x0000007100197798,O,000016,_ZN12GenericStats16getParam_mapRoomEi +0x0000007100197798,U,000016,_ZN12GenericStats16getParam_mapRoomEi 0x00000071001977a8,O,000016,_ZN12GenericStats22getParam_tenaciousBallEi 0x00000071001977b8,O,000016,_ZN12GenericStats24getParam_suckMySnowballsEi 0x00000071001977c8,O,000016,_ZN12GenericStats28getParam_greatViewFromUpHereEi @@ -11861,7 +11861,7 @@ Address,Quality,Size,Name 0x0000007100197cec,O,000028,_ZN12GenericStats18param_buildPickaxeEv 0x0000007100197d08,O,000028,_ZN12GenericStats18param_buildFurnaceEv 0x0000007100197d24,O,000028,_ZN12GenericStats14param_buildHoeEv -0x0000007100197d40,O,000028,_ZN12GenericStats15param_makeBreadEv +0x0000007100197d40,U,000028,_ZN12GenericStats15param_makeBreadEv 0x0000007100197d5c,O,000028,_ZN12GenericStats14param_bakeCakeEv 0x0000007100197d78,O,000028,_ZN12GenericStats24param_buildBetterPickaxeEv 0x0000007100197d94,O,000032,_ZN12GenericStats13param_onARailEi @@ -11902,7 +11902,7 @@ Address,Quality,Size,Name 0x000000710019815c,U,000032, 0x000000710019817c,O,000028,_ZN12GenericStats14param_deadshotEv 0x0000007100198198,U,000032, -0x00000071001981b8,O,000028,_ZN12GenericStats17param_mountainTopEv +0x00000071001981b8,U,000028,_ZN12GenericStats17param_mountainTopEv 0x00000071001981d4,O,000028,_ZN12GenericStats21param_willLikeNoOtherEv 0x00000071001981f0,U,000032, 0x0000007100198210,U,000032, @@ -34687,7 +34687,7 @@ Address,Quality,Size,Name 0x0000007100519090,U,000032, 0x00000071005190b0,U,000056, 0x00000071005190e8,U,000124, -0x0000007100519164,U,000024, +0x0000007100519164,U,000024,CGameNetworkManager__GetPrimarypad 0x000000710051917c,U,000024, 0x0000007100519194,U,000028, 0x00000071005191b0,U,000016, @@ -34711,7 +34711,7 @@ Address,Quality,Size,Name 0x0000007100519758,U,000128, 0x00000071005197d8,U,000088, 0x0000007100519830,U,000088, -0x0000007100519888,U,000032, +0x0000007100519888,U,000032,CGameNetworkManager::GetMaxPlayers 0x00000071005198a8,U,000044, 0x00000071005198d4,U,000084, 0x0000007100519928,U,000184, @@ -35654,7 +35654,7 @@ Address,Quality,Size,Name 0x000000710055b1e0,U,000008, 0x000000710055b1e8,U,000028, 0x000000710055b204,U,000028, -0x000000710055b220,U,000072,_ZN20UIControl_BitmapIconC1Ev +0x000000710055b220,O,000072,_ZN20UIControl_BitmapIconC1Ev 0x000000710055b268,U,000072, 0x000000710055b2b0,U,000072, 0x000000710055b2f8,U,000044, @@ -35811,20 +35811,20 @@ Address,Quality,Size,Name 0x000000710055f02c,U,000092,_ZN26UIControl_PlayerButtonList14PendingAddItemC_gen 0x000000710055f088,U,000088, 0x000000710055f0e0,U,000088, -0x000000710055f138,U,000276,_ZN27UIControl_PlayerSkinPreviewC1Ev -0x000000710055f24c,U,000276,_ZN27UIControl_PlayerSkinPreview4tickEv +0x000000710055f138,M,000276,_ZN27UIControl_PlayerSkinPreviewC1Ev +0x000000710055f24c,O,000276,_ZN27UIControl_PlayerSkinPreview4tickEv 0x000000710055f360,U,000028,_ZN27UIControl_PlayerSkinPreview14sub_710055F360Ev 0x000000710055f37c,U,000028,_ZN27UIControl_PlayerSkinPreview14sub_710055F37CEv 0x000000710055f398,U,000028,_ZN27UIControl_PlayerSkinPreview14sub_710055F398Ev 0x000000710055f3b4,U,000028,_ZN27UIControl_PlayerSkinPreview14sub_710055F3B4Ev -0x000000710055f3d0,U,000164,_ZN27UIControl_PlayerSkinPreview10SetTextureERKNSt3__112basic_stringIwNS0_11char_traitsIwEENS0_9allocatorIwEEEE13_TEXTURE_NAME +0x000000710055f3d0,O,000164,_ZN27UIControl_PlayerSkinPreview10SetTextureERKNSt3__112basic_stringIwNS0_11char_traitsIwEENS0_9allocatorIwEEEE13_TEXTURE_NAME 0x000000710055f474,U,000108, 0x000000710055f4e0,U,000024, 0x000000710055f4f8,U,000028, -0x000000710055f514,U,000508, -0x000000710055f710,U,001104, -0x000000710055fb60,U,000096, -0x000000710055fbc0,U,000096, +0x000000710055f514,O,000508,_ZN27UIControl_PlayerSkinPreview6renderEP7fuiRect +0x000000710055f710,M,001104,_ZN27UIControl_PlayerSkinPreview6renderEP14EntityRendererdddff +0x000000710055fb60,O,000096,_ZN27UIControl_PlayerSkinPreview11bindTextureERKNSt3__112basic_stringIwNS0_11char_traitsIwEENS0_9allocatorIwEEEEi +0x000000710055fbc0,O,000096,_ZN27UIControl_PlayerSkinPreview11bindTextureERKNSt3__112basic_stringIwNS0_11char_traitsIwEENS0_9allocatorIwEEEES8_ 0x000000710055fc20,U,000068,_ZN18UIControl_ProgressC_gen 0x000000710055fc64,U,000072, 0x000000710055fcac,U,000132, @@ -37166,8 +37166,8 @@ Address,Quality,Size,Name 0x000000710059a060,U,000036,_ZN28UIControl_LeftIconButtonListD0Ev 0x000000710059a084,U,000036,_ZN19UIControl_MultiListD0Ev 0x000000710059a0a8,U,000036,_ZN26UIControl_PlayerButtonListD0Ev -0x000000710059a0cc,U,000068,_ZN27UIControl_PlayerSkinPreviewD2Ev -0x000000710059a110,U,000036,_ZN27UIControl_PlayerSkinPreviewD0Ev +0x000000710059a0cc,O,000068,_ZN27UIControl_PlayerSkinPreviewD2Ev +0x000000710059a110,O,000036,_ZN27UIControl_PlayerSkinPreviewD0Ev 0x000000710059a134,U,000036,_ZN18UIControl_ProgressD0Ev 0x000000710059a158,U,000036,_ZN18UIControl_SaveListD0Ev 0x000000710059a17c,U,000036,_ZN30UIControl_ScoreboardButtonListD0Ev @@ -38224,7 +38224,7 @@ Address,Quality,Size,Name 0x00000071005c6b98,U,000312,_ZN13UIScene_Intro18handleAnimationEndEv 0x00000071005c6cd0,U,000016, 0x00000071005c6ce0,U,000012, -0x00000071005c6cec,O,000044,_ZN13UIScene_Intro15handleGainFocusEb +0x00000071005c6cec,M,000044,_ZN13UIScene_Intro15handleGainFocusEb 0x00000071005c6d18,O,000004,_ZN13UIScene_Intro12handleReloadEv 0x00000071005c6d1c,U,000092,SetClassicCrafting__21UIScene_InventoryMenuFb 0x00000071005c6d78,U,000840,updateEffectsDisplay__21UIScene_InventoryMenuFv @@ -40681,8 +40681,8 @@ Address,Quality,Size,Name 0x0000007100661c60,U,000652, 0x0000007100661eec,U,000008, 0x0000007100661ef4,U,000008, -0x0000007100661efc,U,000392,_ZN11ElytraModelC_gen -0x0000007100662084,U,000320,_ZN11ElytraModel6renderERNSt3__110shared_ptrI6EntityEEffffffb +0x0000007100661efc,O,000392,_ZN11ElytraModelC1ERK15ModelDefinition +0x0000007100662084,O,000320,_ZN11ElytraModel6renderERNSt3__110shared_ptrI6EntityEEffffffb 0x00000071006621c4,U,000936,_ZN11ElytraModel9setupAnimEffffffNSt3__110shared_ptrI6EntityEE16_SkinAdjustments 0x000000710066256c,U,000324, 0x00000071006626b0,U,000036,_ZN12XmlConstructD0Ev @@ -40926,7 +40926,7 @@ Address,Quality,Size,Name 0x000000710066b278,U,000012, 0x000000710066b284,U,000036,_ZN12DripParticleD0Ev 0x000000710066b2a8,U,000036,_ZN21ElderGuardianRendererD0Ev -0x000000710066b2cc,U,000036,_ZN11ElytraModelD0Ev +0x000000710066b2cc,O,000036,_ZN11ElytraModelD0Ev 0x000000710066b2f0,O,000036,_ZN8BedModelD0Ev 0x000000710066b314,O,000064,_ZN8BedModel7getNameEv 0x000000710066b354,U,000036,_ZN10ChestModelD0Ev @@ -44139,7 +44139,7 @@ Address,Quality,Size,Name 0x00000071007110a0,U,000452, 0x0000007100711264,U,002272,_ZN11PlayerModelC_gen 0x0000007100711b44,U,001628,_ZN11PlayerModel6renderERNSt3__110shared_ptrI6EntityEEffffffb -0x00000071007121a0,U,000024, +0x00000071007121a0,U,000024,._ZN11PlayerModel11renderCloakEf 0x00000071007121b8,U,000356,_ZN11PlayerModel9setupAnimEffffffNSt3__110shared_ptrI6EntityEE16_SkinAdjustments 0x000000710071231c,U,000204, 0x00000071007123e8,U,000772, @@ -46299,9 +46299,9 @@ Address,Quality,Size,Name 0x0000007100794c7c,U,000020,_ZN9C4JRenderC1Ev 0x0000007100794c90,U,000008, 0x0000007100794c98,U,000296, -0x0000007100794dc0,U,000016, +0x0000007100794dc0,U,000016,nvnCommandBufferIsRecording 0x0000007100794dd0,U,000480, -0x0000007100794fb0,U,000016, +0x0000007100794fb0,U,000016,nvnCommandBufferBindUniformBuffer 0x0000007100794fc0,U,000260, 0x00000071007950c4,U,000148, 0x0000007100795158,U,000012, @@ -47273,7 +47273,7 @@ Address,Quality,Size,Name 0x00000071007c1234,U,000332, 0x00000071007c1380,U,000012, 0x00000071007c138c,U,000176, -0x00000071007c143c,U,000024, +0x00000071007c143c,U,000024,getNetworkPlayer__31CPlatformNetworkManagerNintendoSFP16NQRNetworkPlayer 0x00000071007c1454,U,000008, 0x00000071007c145c,U,000652, 0x00000071007c16e8,U,000120, @@ -47293,34 +47293,34 @@ Address,Quality,Size,Name 0x00000071007c1e10,U,000008, 0x00000071007c1e18,U,000012, 0x00000071007c1e24,U,000004, -0x00000071007c1e28,U,000308, -0x00000071007c1f5c,U,000016, -0x00000071007c1f6c,U,000016, -0x00000071007c1f7c,U,000008, -0x00000071007c1f84,U,000184, -0x00000071007c203c,U,000228, -0x00000071007c2120,U,000016, -0x00000071007c2130,U,000008, -0x00000071007c2138,U,000016, -0x00000071007c2148,U,000012, -0x00000071007c2154,U,000016, -0x00000071007c2164,U,000200, +0x00000071007c1e28,U,000308,Initialise__31CPlatformNetworkManagerNintendoFP19CGameNetworkManageri +0x00000071007c1f5c,O,000016,_ZN31CPlatformNetworkManagerNintendo9TerminateEv +0x00000071007c1f6c,O,000016,_ZN31CPlatformNetworkManagerNintendo25GetJoiningReadyPercentageEv +0x00000071007c1f7c,O,000008,_ZN31CPlatformNetworkManagerNintendo15CorrectErrorIDSEi +0x00000071007c1f84,O,000184,_ZN31CPlatformNetworkManagerNintendo6DoWorkEv +0x00000071007c203c,U,000228,_ZN31CPlatformNetworkManagerNintendo10TickSearchEv +0x00000071007c2120,O,000016,_ZN31CPlatformNetworkManagerNintendo14GetPlayerCountEv +0x00000071007c2130,O,000008,_ZN31CPlatformNetworkManagerNintendo27ShouldMessageForFullSessionEv +0x00000071007c2138,O,000016,_ZN31CPlatformNetworkManagerNintendo20GetOnlinePlayerCountEv +0x00000071007c2148,O,000012,_ZN31CPlatformNetworkManagerNintendo18GetLocalPlayerMaskEi +0x00000071007c2154,O,000016,_ZN31CPlatformNetworkManagerNintendo25AddLocalPlayerByUserIndexEi +0x00000071007c2164,M,000200,_ZN31CPlatformNetworkManagerNintendo28RemoveLocalPlayerByUserIndexEi 0x00000071007c222c,U,000136, -0x00000071007c22b4,U,000008, -0x00000071007c22bc,U,000016, -0x00000071007c22cc,U,000004, -0x00000071007c22d0,U,000016, -0x00000071007c22e0,U,000016, -0x00000071007c22f0,U,000008, -0x00000071007c22f8,U,000360, +0x00000071007c22b4,O,000008,_ZN31CPlatformNetworkManagerNintendo23IsInStatsEnabledSessionEv +0x00000071007c22bc,O,000016,_ZN31CPlatformNetworkManagerNintendo20IsMatchmakingEnabledEv +0x00000071007c22cc,O,000004,_ZN31CPlatformNetworkManagerNintendo20IsHandlingBootInviteEv +0x00000071007c22d0,O,000016,_ZN31CPlatformNetworkManagerNintendo15SessionHasSpaceEj +0x00000071007c22e0,O,000016,_ZN31CPlatformNetworkManagerNintendo13SendInviteGUIEi +0x00000071007c22f0,O,000008,_ZN31CPlatformNetworkManagerNintendo14IsAddingPlayerEv +0x00000071007c22f8,O,000360,_ZN31CPlatformNetworkManagerNintendo9LeaveGameEb 0x00000071007c2460,U,000040, 0x00000071007c2488,U,000040, -0x00000071007c24b0,U,000200, +0x00000071007c24b0,O,000200,_ZN31CPlatformNetworkManagerNintendo8HostGameEibbh11EMiniGameIdjPj 0x00000071007c2578,U,000172, 0x00000071007c2624,U,000544, 0x00000071007c2844,U,000036, -0x00000071007c2868,U,000144, -0x00000071007c28f8,U,000176, +0x00000071007c2868,O,000144,_ZN31CPlatformNetworkManagerNintendo8JoinGameEP17FriendSessionInfoiib +0x00000071007c28f8,M,000176,_ZN31CPlatformNetworkManagerNintendo15FindAndJoinGameEii11EMiniGameIdjPjS1_ 0x00000071007c29a8,U,000068, 0x00000071007c29ec,U,000012, 0x00000071007c29f8,U,000016, @@ -47346,21 +47346,21 @@ Address,Quality,Size,Name 0x00000071007c32c4,U,000044, 0x00000071007c32f0,U,000048, 0x00000071007c3320,U,000048, -0x00000071007c3350,U,000032, -0x00000071007c3370,U,000032, -0x00000071007c3390,U,000080, -0x00000071007c33e0,U,000036, -0x00000071007c3404,U,000032, -0x00000071007c3424,U,000068, -0x00000071007c3468,U,000024, +0x00000071007c3350,O,000032,_ZN31CPlatformNetworkManagerNintendo25GetLocalPlayerByUserIndexEi +0x00000071007c3370,O,000032,_ZN31CPlatformNetworkManagerNintendo16GetPlayerByIndexEi +0x00000071007c3390,O,000080,_ZN31CPlatformNetworkManagerNintendo15GetPlayerByXuidE9PlayerUID +0x00000071007c33e0,O,000036,_ZN31CPlatformNetworkManagerNintendo18GetPlayerBySmallIdEh +0x00000071007c3404,O,000032,_ZN31CPlatformNetworkManagerNintendo13GetHostPlayerEv +0x00000071007c3424,O,000068,_ZN31CPlatformNetworkManagerNintendo6IsHostEv +0x00000071007c3468,O,000024,_ZN31CPlatformNetworkManagerNintendo22JoinGameFromInviteInfoEiiPKN2nn7friends14FriendPresenceE 0x00000071007c3480,U,000008, 0x00000071007c3488,U,000008, 0x00000071007c3490,U,000016, 0x00000071007c34a0,U,000004, -0x00000071007c34a4,U,000016, -0x00000071007c34b4,U,000040, -0x00000071007c34dc,U,000016, -0x00000071007c34ec,U,000008, +0x00000071007c34a4,O,000016,_ZN31CPlatformNetworkManagerNintendo11IsInSessionEv +0x00000071007c34b4,O,000040,_ZN31CPlatformNetworkManagerNintendo12IsInGameplayEv +0x00000071007c34dc,O,000016,_ZN31CPlatformNetworkManagerNintendo19IsReadyToPlayOrIdleEv +0x00000071007c34ec,O,000008,_ZN31CPlatformNetworkManagerNintendo25AddLocalPlayerByPlayerUIDE9PlayerUID 0x00000071007c34f4,U,000008, 0x00000071007c34fc,U,000004, 0x00000071007c3500,U,000004, @@ -47990,7 +47990,7 @@ Address,Quality,Size,Name 0x00000071007d70cc,U,000028, 0x00000071007d70e8,U,000132, 0x00000071007d716c,U,000420, -0x00000071007d7310,U,000188, +0x00000071007d7310,U,000188,SetState__22NQRNetworkManager_WiiUFQ2_17NQRNetworkManager31eNQRNetworkManagerInternalState 0x00000071007d73cc,U,000204, 0x00000071007d7498,U,000052, 0x00000071007d74cc,U,000148, @@ -48010,7 +48010,7 @@ Address,Quality,Size,Name 0x00000071007d87ec,U,000016, 0x00000071007d87fc,U,000308, 0x00000071007d8930,U,000016, -0x00000071007d8940,U,000016, +0x00000071007d8940,U,000016,Pia_SignalJoinSession__22NQRNetworkManager_WiiUFv 0x00000071007d8950,U,000092, 0x00000071007d89ac,U,000008, 0x00000071007d89b4,U,000048, @@ -48030,14 +48030,14 @@ Address,Quality,Size,Name 0x00000071007d8e50,U,000404, 0x00000071007d8fe4,U,000544, 0x00000071007d9204,U,000148, -0x00000071007d9298,U,000216, +0x00000071007d9298,U,000216,Initialise__22NQRNetworkManager_WiiUFv 0x00000071007d9370,U,000012, 0x00000071007d937c,U,000224, -0x00000071007d945c,U,000156, +0x00000071007d945c,U,000156,Terminate__22NQRNetworkManager_WiiUFv 0x00000071007d94f8,U,000064, 0x00000071007d9538,U,000736, 0x00000071007d9818,U,000004, -0x00000071007d981c,U,000016, +0x00000071007d981c,U,000016,Tick__22NQRNetworkManager_WiiUFv 0x00000071007d982c,U,000236, 0x00000071007d9918,U,001040, 0x00000071007d9d28,U,000400, @@ -48052,22 +48052,22 @@ Address,Quality,Size,Name 0x00000071007dab64,U,000052, 0x00000071007dab98,U,000208, 0x00000071007dac68,U,000356, -0x00000071007dadcc,U,000912, -0x00000071007db15c,U,000016, -0x00000071007db16c,U,000016, -0x00000071007db17c,U,000360, +0x00000071007dadcc,U,000912,CreateAndJoinRoom__22NQRNetworkManager_WiiUFiT1PvT1PiT1bUc +0x00000071007db15c,U,000016,UpdateExternalRoomData__22NQRNetworkManager_WiiUFv +0x00000071007db16c,U,000016,FriendRoomManagerIsBusy__22NQRNetworkManager_WiiUFv +0x00000071007db17c,U,000360,FriendRoomManagerSearch__22NQRNetworkManager_WiiUFv 0x00000071007db2e4,U,000024, -0x00000071007db2fc,U,000876, +0x00000071007db2fc,U,000876,FriendRoomManagerSearch2__22NQRNetworkManager_WiiUFv 0x00000071007db668,U,000736, 0x00000071007db948,U,000160, -0x00000071007db9e8,U,000084, -0x00000071007dba3c,U,000168, -0x00000071007dbae4,U,000224, -0x00000071007dbbc4,U,000008, -0x00000071007dbbcc,U,000008, -0x00000071007dbbd4,U,000056, -0x00000071007dbc0c,U,000008, -0x00000071007dbc14,U,000008, +0x00000071007db9e8,U,000084,FriendRoomManagerGetCount__22NQRNetworkManager_WiiUFv +0x00000071007dba3c,U,000168,FriendRoomManagerGetRoomInfo__22NQRNetworkManager_WiiUFiPQ2_17NQRNetworkManager19SessionSearchResult +0x00000071007dbae4,U,000224,GetFriendRoomSearchResults__22NQRNetworkManager_WiiUFPi +0x00000071007dbbc4,U,000008,GetState__22NQRNetworkManager_WiiUFv +0x00000071007dbbcc,U,000008,IsHost__22NQRNetworkManager_WiiUFv +0x00000071007dbbd4,U,000056,IsReadyToPlayOrIdle__22NQRNetworkManager_WiiUFv +0x00000071007dbc0c,U,000008,IsInSession__22NQRNetworkManager_WiiUFv +0x00000071007dbc14,U,000008,IsMatchmakingEnabled__22NQRNetworkManager_WiiUFv 0x00000071007dbc1c,U,000008, 0x00000071007dbc24,U,000124, 0x00000071007dbca0,U,000028, @@ -48080,11 +48080,11 @@ Address,Quality,Size,Name 0x00000071007dbfe0,U,000332, 0x00000071007dc12c,U,000252, 0x00000071007dc228,U,000128, -0x00000071007dc2a8,U,000084, +0x00000071007dc2a8,U,000084,JoinRoom__22NQRNetworkManager_WiiUFPQ2_17NQRNetworkManager19SessionSearchResulti 0x00000071007dc2fc,U,000072, -0x00000071007dc344,U,000008, -0x00000071007dc34c,U,000236, -0x00000071007dc438,U,000588, +0x00000071007dc344,U,000008,JoinRoom__22NQRNetworkManager_WiiUFiPCQ3_2nn2fp14FriendPresence +0x00000071007dc34c,U,000236,JoinRoom__22NQRNetworkManager_WiiUFUiiPCQ2_17NQRNetworkManager16PresenceSyncInfo +0x00000071007dc438,U,000588,FindAndJoinRoom__22NQRNetworkManager_WiiUFiUiP21CMatchMakeSearchParamUc 0x00000071007dc684,U,000016, 0x00000071007dc694,U,000044, 0x00000071007dc6c0,U,000360, @@ -48119,7 +48119,7 @@ Address,Quality,Size,Name 0x00000071007de1e4,U,000152, 0x00000071007de27c,U,000188, 0x00000071007de338,U,000008, -0x00000071007de340,U,000036, +0x00000071007de340,U,000036,GetExtDataForRoom__22NQRNetworkManager_WiiUFUiPvPFbPv_vT2 0x00000071007de364,U,000088, 0x00000071007de3bc,U,000028, 0x00000071007de3d8,U,000128, @@ -48142,7 +48142,7 @@ Address,Quality,Size,Name 0x00000071007de888,U,000048, 0x00000071007de8b8,U,000140,_ZN20NQRNetworkManager_NXD2Ev 0x00000071007de944,U,000036,_ZN20NQRNetworkManager_NXD0Ev -0x00000071007de968,U,000008, +0x00000071007de968,U,000008,FriendPresenceUpdatedRoomList__22NQRNetworkManager_WiiUFv 0x00000071007de970,U,000004, 0x00000071007de974,U,000084, 0x00000071007de9c8,U,000036, @@ -48315,44 +48315,44 @@ Address,Quality,Size,Name 0x00000071007e2144,O,000036,_ZN17cCommerceNintendoD0Ev 0x00000071007e2168,O,000008,_ZN17cCommerceNintendo15PurchaseBedrockEv 0x00000071007e2170,U,000052, -0x00000071007e21a4,U,000056, -0x00000071007e21dc,U,000024, -0x00000071007e21f4,U,000016, -0x00000071007e2204,U,000012, -0x00000071007e2210,U,000008, -0x00000071007e2218,U,000008, -0x00000071007e2220,U,000008, -0x00000071007e2228,U,000008, -0x00000071007e2230,U,000008, -0x00000071007e2238,U,000044, -0x00000071007e2264,U,000008, -0x00000071007e226c,U,000008, -0x00000071007e2274,U,000008, -0x00000071007e227c,U,000008, -0x00000071007e2284,U,000008, -0x00000071007e228c,U,000008, -0x00000071007e2294,U,000008, -0x00000071007e229c,U,000008, -0x00000071007e22a4,U,000008, -0x00000071007e22ac,U,000008, -0x00000071007e22b4,U,000176, -0x00000071007e2364,U,000008, -0x00000071007e236c,U,000068, -0x00000071007e23b0,U,000036, -0x00000071007e23d4,U,000056, -0x00000071007e240c,U,000008, -0x00000071007e2414,U,000036,_ZN21NetworkPlayerNintendoD0Ev -0x00000071007e2438,U,000008, -0x00000071007e2440,U,000004, -0x00000071007e2444,U,000008, -0x00000071007e244c,U,000008, -0x00000071007e2454,U,000008, -0x00000071007e245c,U,000008, +0x00000071007e21a4,O,000056,_ZN21NetworkPlayerNintendoC1EP16NQRNetworkPlayer +0x00000071007e21dc,M,000024,_ZN21NetworkPlayerNintendo10GetSmallIdEv +0x00000071007e21f4,O,000016,_ZN21NetworkPlayerNintendo8SendDataEP14INetworkPlayerPKvibb +0x00000071007e2204,O,000012,_ZN21NetworkPlayerNintendo12IsSameSystemEP14INetworkPlayer +0x00000071007e2210,O,000008,_ZN21NetworkPlayerNintendo22GetOutstandingAckCountEv +0x00000071007e2218,O,000008,_ZN21NetworkPlayerNintendo21GetSendQueueSizeBytesEP14INetworkPlayerb +0x00000071007e2220,O,000008,_ZN21NetworkPlayerNintendo24GetSendQueueSizeMessagesEP14INetworkPlayerb +0x00000071007e2228,O,000008,_ZN21NetworkPlayerNintendo13GetCurrentRttEv +0x00000071007e2230,O,000008,_ZN21NetworkPlayerNintendo6IsHostEv +0x00000071007e2238,M,000044,_ZN21NetworkPlayerNintendo7IsGuestEv +0x00000071007e2264,O,000008,_ZN21NetworkPlayerNintendo7IsLocalEv +0x00000071007e226c,O,000008,_ZN21NetworkPlayerNintendo15GetSessionIndexEv +0x00000071007e2274,O,000008,_ZN21NetworkPlayerNintendo9IsTalkingEv +0x00000071007e227c,O,000008,_ZN21NetworkPlayerNintendo18IsMutedByLocalUserEi +0x00000071007e2284,O,000008,_ZN21NetworkPlayerNintendo8HasVoiceEv +0x00000071007e228c,O,000008,_ZN21NetworkPlayerNintendo9HasCameraEv +0x00000071007e2294,O,000008,_ZN21NetworkPlayerNintendo12GetUserIndexEv +0x00000071007e229c,O,000008,_ZN21NetworkPlayerNintendo9SetSocketEP6Socket +0x00000071007e22a4,O,000008,_ZN21NetworkPlayerNintendo9GetSocketEv +0x00000071007e22ac,O,000008,_ZN21NetworkPlayerNintendo13GetOnlineNameEv +0x00000071007e22b4,M,000176,_ZN21NetworkPlayerNintendo14GetDisplayNameEv +0x00000071007e2364,O,000008,_ZN21NetworkPlayerNintendo6GetUIDEv +0x00000071007e236c,O,000068,_ZN21NetworkPlayerNintendo6SetUIDE9PlayerUID +0x00000071007e23b0,O,000036,_ZN21NetworkPlayerNintendo15SentChunkPacketEv +0x00000071007e23d4,O,000056,_ZN21NetworkPlayerNintendo30GetTimeSinceLastChunkPacket_msEv +0x00000071007e240c,O,000008,_ZN21NetworkPlayerNintendo6isFakeEv +0x00000071007e2414,O,000036,_ZN21NetworkPlayerNintendoD0Ev +0x00000071007e2438,O,000008,_ZN21NetworkPlayerNintendo34GetSinglePlayerOutstandingAckCountEv +0x00000071007e2440,O,000004,_ZN21NetworkPlayerNintendo24DecrementAcksOutstandingEv +0x00000071007e2444,O,000008,_ZN21NetworkPlayerNintendo13GetQNetPlayerEv +0x00000071007e244c,U,000008,_ZN16NQRNetworkPlayer10GetSmallIdEv +0x00000071007e2454,U,000008,_ZN21NetworkPlayerNintendo10GetMiiNameEv +0x00000071007e245c,U,000008,_ZN16NQRNetworkPlayer15GetNetworkNameWEv 0x00000071007e2464,U,000008, -0x00000071007e246c,U,000024, -0x00000071007e2484,U,000016, -0x00000071007e2494,U,000008, -0x00000071007e249c,U,000020, +0x00000071007e246c,U,000024,_ZN16NQRNetworkPlayer7IsLocalEv +0x00000071007e2484,U,000016,_ZN16NQRNetworkPlayer6IsHostEv +0x00000071007e2494,U,000008,_ZN16NQRNetworkPlayer19GetLocalPlayerIndexEv +0x00000071007e249c,U,000020,_ZN16NQRNetworkPlayer12IsSameSystemEPS_ 0x00000071007e24b0,U,000008, 0x00000071007e24b8,U,000008, 0x00000071007e24c0,U,000300, @@ -48360,23 +48360,23 @@ Address,Quality,Size,Name 0x00000071007e25f8,U,000044, 0x00000071007e2624,U,000020, 0x00000071007e2638,U,000012, -0x00000071007e2644,U,000036, -0x00000071007e2668,U,000036, +0x00000071007e2644,U,000036,_ZN16NQRNetworkPlayer6GetUIDEv +0x00000071007e2668,U,000036,_ZN16NQRNetworkPlayer6SetUIDE9PlayerUID 0x00000071007e268c,U,000016, 0x00000071007e269c,U,000020, -0x00000071007e26b0,U,000164, +0x00000071007e26b0,U,000164,_ZN16NQRNetworkPlayer8SendDataEPS_PKvjb 0x00000071007e2754,U,000204, 0x00000071007e2820,U,000036, 0x00000071007e2844,U,000056, -0x00000071007e287c,U,000016, +0x00000071007e287c,U,000016,_ZN16NQRNetworkPlayer22GetOutstandingAckCountEv 0x00000071007e288c,U,000008, 0x00000071007e2894,U,000056, -0x00000071007e28cc,U,000008, -0x00000071007e28d4,U,000008, -0x00000071007e28dc,U,000024, -0x00000071007e28f4,U,000060, -0x00000071007e2930,U,000008, -0x00000071007e2938,U,000008, +0x00000071007e28cc,U,000008,_ZN16NQRNetworkPlayer21GetSendQueueSizeBytesEv +0x00000071007e28d4,U,000008,_ZN16NQRNetworkPlayer24GetSendQueueSizeMessagesEv +0x00000071007e28dc,U,000024,_ZN16NQRNetworkPlayer15GetSessionIndexEv +0x00000071007e28f4,U,000060,_ZN16NQRNetworkPlayer8HasVoiceEv +0x00000071007e2930,U,000008,_ZN16NQRNetworkPlayer9IsTalkingEv +0x00000071007e2938,U,000008,_ZN16NQRNetworkPlayer18IsMutedByLocalUserEi 0x00000071007e2940,U,000072, 0x00000071007e2988,U,000196, 0x00000071007e2a4c,U,000052, diff --git a/src/4JLibraries_Source/NX/Render/RendererCore.cpp b/src/4JLibraries_Source/NX/Render/RendererCore.cpp index 44bcdeea..56b7673e 100644 --- a/src/4JLibraries_Source/NX/Render/RendererCore.cpp +++ b/src/4JLibraries_Source/NX/Render/RendererCore.cpp @@ -31,6 +31,47 @@ Renderer::Renderer() : C4JRender() { Renderer::sInstance = this; } +// NON_MATCHING: define some of the nvn functions and finish properly last but one call +void Renderer::GammaCorrect() { + NVNdepthStencilState _depthStencil; + NVNpolygonState _polygon; + NVNcolorState _color; + + nvnCommandBufferBindProgram(&this->m_nvNcommandBuffer, this->m_shaders8, 1); + nvnCommandBufferBindProgram(&this->m_nvNcommandBuffer, this->m_shaders15, 2); + + nvnDepthStencilStateSetDefaults(&_depthStencil); + nvnCommandBufferBindDepthStencilState(&this->m_nvNcommandBuffer, &_depthStencil); + + nvnPolygonStateSetDefaults(&_polygon); + nvnCommandBufferBindPolygonState(&this->m_nvNcommandBuffer, &_polygon); + + nvnColorStateSetDefaults(&_color); + nvnCommandBufferBindColorState(&this->m_nvNcommandBuffer, &_color); + + float buf[4] = {0.0f, 0.0f, 1.0f, 1.0f}; + this->BindShaderUniformData(NVN_SHADER_STAGE_VERTEX, 9, buf, sizeof(buf)); + + float buf2[4] = {1.0f / (this->m_gammaIntensity * 1.5f + 0.5f), 0.0f, 0.0f, 0.0f}; + this->BindShaderUniformData(NVN_SHADER_STAGE_FRAGMENT, 5, buf2, sizeof(buf2)); + + // those functions aren't called directly, they instead call some function that isn't defined by + // nnheaders, would have to dig through games with symbols that also call that function to grab + // signature... blahblah + nvnCommandBufferSetViewport(&this->m_nvNcommandBuffer, 0, 0, textureWidths[this->m_dword28E8], + textureHeights[this->m_dword28E8]); + nvnCommandBufferSetScissor(&this->m_nvNcommandBuffer, 0, 0, textureWidths[this->m_dword28E8], + textureHeights[this->m_dword28E8]); + nvnCommandBufferBindTexture(&this->m_nvNcommandBuffer, NVN_SHADER_STAGE_FRAGMENT, 0, + this->m_gap2858[8 * this->m_dword28E8]); + nvnCommandBufferBarrier(&this->m_nvNcommandBuffer, 18); + + // this is poorly *decompiled* as I didn't care later as I got sidetracked + /* nvnCommandBufferSetRenderTargets(&this->mNVNcommandBuffer, 1, this->qword26E0 + + *(int*)&this->gap2708[24], nullptr, nullptr, nullptr);*/ + nvnCommandBufferDrawArrays(&this->m_nvNcommandBuffer, NVN_DRAW_PRIMITIVE_TRIANGLE_STRIP, 0, 4); +} + // NON_MATCHING: inline the tls offset getter, could be some compiler flag void Renderer::InitialiseContext(bool idk) { sContext = new Renderer::Context(this, idk); diff --git a/src/4JLibraries_Source/NX/Render/RendererCore.h b/src/4JLibraries_Source/NX/Render/RendererCore.h index c69dea81..9d957415 100644 --- a/src/4JLibraries_Source/NX/Render/RendererCore.h +++ b/src/4JLibraries_Source/NX/Render/RendererCore.h @@ -55,6 +55,8 @@ class Renderer : public C4JRender { void LoadShaders(); void SetupShaders(); void Initialise(bool); + void GammaCorrect(); + void BindShaderUniformData(NVNshaderStage stage, int index, void* buffer, size_t bufferSize); virtual void Tick(); virtual void UpdateGamma(unsigned short gamma); @@ -274,7 +276,8 @@ class Renderer : public C4JRender { NVNprogram* m_shaders12; NVNprogram* m_shaders13; NVNprogram* m_shaders14; - char m_gap2960[48]; + NVNprogram* m_shaders15; + char m_gap2960[40]; int m_textureId1; unsigned short m_gammaIntensity; int m_dword2998; diff --git a/src/DecompUtils.h b/src/DecompUtils.h index ae1e85b9..41d93087 100644 --- a/src/DecompUtils.h +++ b/src/DecompUtils.h @@ -2,11 +2,6 @@ // this can be depracated if musl is fixed -inline __attribute__((__always_inline__)) float decomp_fmax1(float x, float y) { - __asm__("fmax %s0, %s1, %s2" : "=w"(x) : "w"(x), "w"(y)); - return x; -} - inline __attribute__((__always_inline__)) float decomp_fmax(float x, float y) { __asm__("fmaxnm %s0, %s1, %s2" : "=w"(x) : "w"(x), "w"(y)); return x; @@ -16,3 +11,13 @@ inline __attribute__((__always_inline__)) float decomp_fminf(float x, float y) { __asm__("fminnm %s0, %s1, %s2" : "=w"(x) : "w"(x), "w"(y)); return x; } + +inline __attribute__((__always_inline__)) float decomp_fmax1(float x, float y) { + __asm__("fmax %s0, %s1, %s2" : "=w"(x) : "w"(x), "w"(y)); + return x; +} + +inline __attribute__((__always_inline__)) float decomp_fmin1(float x, float y) { + __asm__("fmin %s0, %s1, %s2" : "=w"(x) : "w"(x), "w"(y)); + return x; +} \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/CGameNetworkManager.h b/src/Minecraft.Client/net/minecraft/client/CGameNetworkManager.h index 36264e8a..11aa9d1e 100644 --- a/src/Minecraft.Client/net/minecraft/client/CGameNetworkManager.h +++ b/src/Minecraft.Client/net/minecraft/client/CGameNetworkManager.h @@ -1,5 +1,7 @@ #pragma once +class GameSessionData; + class CGameNetworkManager { public: static CGameNetworkManager sInstance; @@ -13,4 +15,9 @@ class CGameNetworkManager { void DoWork(); bool IsLocalGame(); int GetPlayerCount(); + int GetPrimaryPad(); + bool ServerStoppedValid(); + void ServerStoppedWait(); + void ServerStoppedDestroy(); + int GetMaxPlayers(GameSessionData*); }; diff --git a/src/Minecraft.Client/net/minecraft/client/CMinecraftApp.h b/src/Minecraft.Client/net/minecraft/client/CMinecraftApp.h index ab70ffe7..fe67699e 100644 --- a/src/Minecraft.Client/net/minecraft/client/CMinecraftApp.h +++ b/src/Minecraft.Client/net/minecraft/client/CMinecraftApp.h @@ -1,5 +1,7 @@ #pragma once +#include "net/minecraft/client/model/geom/ModelPart.h" +#include "net/minecraft/world/entity/SkinAdjustments.h" #include "types.h" #include "NX/Commerce/cCommerceNintendo.h" @@ -54,7 +56,6 @@ class CMinecraftApp { int GetGameHostOption(eGameHostOption option); bool GetChangingSessionType(); bool GetGameStarted(); - static unsigned int getSkinIdFromPath(const std::wstring& path); bool isXuidNotch(PlayerUID* id); static void StaticCtor(); void loadDefaultGameRules(); // is this virtual? @@ -72,6 +73,8 @@ class CMinecraftApp { void SetAction(int, eXuiAction, void*); void setLevelGenerationOptions(LevelGenerationOptions* options); void SetGameHostOption(eGameHostOption option, unsigned int value); + std::vector* GetAdditionalModelParts(unsigned int); + _SkinAdjustments GetSkinAdjustments(unsigned int); void UpdateTrialPausedTimer(); void UpdateTime(); @@ -82,6 +85,7 @@ class CMinecraftApp { static void SignInChangeCallback(void*, bool, unsigned int); static void ProfileReadErrorCallback(void*); static void UpsellReturnedCallback(void*, eUpsellType, eUpsellResponse, int); + static unsigned int getSkinIdFromPath(const std::wstring& path); bool getSomething(); // dunno diff --git a/src/Minecraft.Client/net/minecraft/client/GameSettings.h b/src/Minecraft.Client/net/minecraft/client/GameSettings.h index 85f6ccde..023bdecf 100644 --- a/src/Minecraft.Client/net/minecraft/client/GameSettings.h +++ b/src/Minecraft.Client/net/minecraft/client/GameSettings.h @@ -2,10 +2,14 @@ #include "types.h" +// TODO: Go through UIScenes and grab those +enum eGameSetting { eGameSetting_CustomSkinAnimation = 25 }; + class GameSettings { public: static void ClearGameSettingsChangedFlag(int pad); static void ApplyGameSettingsChanged(int pad); static void SetDefaultActionMapping(uchar, int, uchar); static int OldProfileVersionCallback(void*, unsigned char*, unsigned short, int); + static int GetGameSettings(eGameSetting); }; diff --git a/src/Minecraft.Client/net/minecraft/client/dlc/DLCManager.h b/src/Minecraft.Client/net/minecraft/client/dlc/DLCManager.h new file mode 100644 index 00000000..72faaf03 --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/dlc/DLCManager.h @@ -0,0 +1,26 @@ +class DLCManager { +public: + enum EDLCParameterType { + DISPLAYNAME, + THEMENAME, + FREE, + CREDIT, + CAPEPATH, + BOX, + ANIM, + GAME_FLAGS, + PACKID, + NETHERPARTICLECOLOUR, + ENCHANTTEXTCOLOUR, + ENCHANTTEXTFOCUSCOLOUR, + DATAPATH, + PACKVERSION, + DISPLAYNAMEID, + THEMENAMEID, + CLOUDHEIGHT, + CREDITID, + DISABLEMIPMAP, + OFFSET, + XMLVERSION + }; +}; \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/dlc/DLCPack.h b/src/Minecraft.Client/net/minecraft/client/dlc/DLCPack.h new file mode 100644 index 00000000..88f39fb1 --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/dlc/DLCPack.h @@ -0,0 +1 @@ +class DLCPack {}; \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/model/Model.h b/src/Minecraft.Client/net/minecraft/client/model/Model.h index b7d2d172..fb5e2781 100644 --- a/src/Minecraft.Client/net/minecraft/client/model/Model.h +++ b/src/Minecraft.Client/net/minecraft/client/model/Model.h @@ -42,4 +42,5 @@ class Model { int m_texHeight; ModelPartsSkinned m_modelPartsSkinned; bool m_byte88; + bool m_byte89; }; diff --git a/src/Minecraft.Client/net/minecraft/client/model/models/ElytraModel.cpp b/src/Minecraft.Client/net/minecraft/client/model/models/ElytraModel.cpp new file mode 100644 index 00000000..de3ff4d8 --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/model/models/ElytraModel.cpp @@ -0,0 +1,53 @@ +#include "net/minecraft/client/model/ModelDefinition.h" +#include "net/minecraft/client/model/geom/ModelPartSkin.h" +#include "net/minecraft/client/model/models/ElytraModel.h" +#include "net/minecraft/client/renderer/platform/GlStateManager.h" +#include "net/minecraft/util/Mth.h" +#include "net/minecraft/world/eINSTANCEOF.h" +#include "net/minecraft/world/entity/Entity.h" +#include "net/minecraft/world/entity/LivingEntity.h" +#include +#include + +ElytraModel::ElytraModel(const ModelDefinition&) : Model() { + this->m_byte89 = false; + this->m_mLeftWing = new ModelPartSkin(this, 22, 0); + this->m_mLeftWing->addBox(-10.0f, 0.0f, 0.0f, 10, 20, 2, 1.0f); + + this->m_mRightWing = new ModelPartSkin(this, 22, 0); + this->m_mRightWing->m_mirror = true; + this->m_mRightWing->addBox(0.0f, 0.0f, 0.0f, 10, 20, 2, 1.0f); + + this->m_mLeftWing->m_xPos = 5.0f; + this->m_mLeftWing->m_xRot = Mth::RAD * 15.0f; + this->m_mLeftWing->m_yPos = 0.0f; + this->m_mLeftWing->m_yRot = 0.0f; + this->m_mLeftWing->m_zRot = Mth::RAD * -15.0f; + + this->m_mRightWing->m_xPos = -this->m_mLeftWing->m_xPos; + this->m_mRightWing->m_xRot = this->m_mLeftWing->m_xRot; + this->m_mRightWing->m_yPos = this->m_mLeftWing->m_yPos; + this->m_mRightWing->m_yRot = -this->m_mLeftWing->m_yRot; + this->m_mRightWing->m_zRot = -this->m_mLeftWing->m_zRot; + + this->compileSkinnedDrawlist(); +} + +void ElytraModel::render(std::shared_ptr& entity, float, float, float, float, float, float scale, + bool callList) { + GlStateManager::disableRescaleNormal(); + GlStateManager::disableCull(); + if (Entity::instanceof(entity, eLivingEntity) + && std::static_pointer_cast(entity)->isBaby()) { + GlStateManager::pushMatrix(); + GlStateManager::scalef(0.5F, 0.5F, 0.5F); + GlStateManager::translatef(0.0F, 1.5F, -0.1F); + this->m_mLeftWing->render(scale, callList, false); + this->m_mRightWing->render(scale, callList, false); + GlStateManager::popMatrix(); + } else { + this->m_mLeftWing->render(scale, callList, false); + this->m_mRightWing->render(scale, callList, false); + } + this->callSkinnedDrawlist(); +} \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/model/models/ElytraModel.h b/src/Minecraft.Client/net/minecraft/client/model/models/ElytraModel.h new file mode 100644 index 00000000..058fef32 --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/model/models/ElytraModel.h @@ -0,0 +1,15 @@ +#include "net/minecraft/client/model/Model.h" + +class ModelDefinition; + +class ElytraModel : public Model { +public: + ElytraModel(const ModelDefinition&); + + void render(std::shared_ptr&, float, float, float, float, float, float, bool) override; + void setupAnim(float, float, float, float, float, float, std::shared_ptr, + _SkinAdjustments) override; + + ModelPartSkin* m_mRightWing; + ModelPartSkin* m_mLeftWing; +}; \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/model/models/HumanoidModel.h b/src/Minecraft.Client/net/minecraft/client/model/models/HumanoidModel.h new file mode 100644 index 00000000..7838f5cd --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/model/models/HumanoidModel.h @@ -0,0 +1,42 @@ +#pragma once + +#include "net/minecraft/client/model/Model.h" +#include "net/minecraft/world/entity/EquipmentSlot.h" +#include "net/minecraft/world/entity/HumanoidArm.h" +#include "net/minecraft/world/entity/SkinAdjustments.h" + +class HumanoidModel : public Model { +public: + // TODO: fill in + enum eArmPose {}; + + HumanoidModel(const ModelDefinition&, float, float, int, int, bool, bool, bool); + + void _init(float, float, int, int, bool, bool, const ModelDefinition&, bool); + + virtual void render(HumanoidModel*, float, bool); // ? + virtual void setAllVisible(bool); + virtual void translateToHandItem(float, const HumanoidArm*); + virtual void setArmPose(const HumanoidArm*, HumanoidModel::eArmPose); + virtual void setArmPose(std::shared_ptr, HumanoidModel::eArmPose, bool); + + ModelPart* m_mHeadPart; + ModelPart* m_mHatPart; + ModelPart* m_mBodyPart; + ModelPart* m_mRightArmPart; + ModelPart* m_mLeftArmPart; + ModelPart* m_mRightLegPart; + ModelPart* m_mLeftLegPart; + ModelPart* m_mRightItemPart; + ModelPart* m_mLeftItemPart; + char m_gapD8[8]; + bool m_flag1; + bool m_flag2; + bool m_flag3; + int m_dwordE4; + int m_dwordE8; + _SkinAdjustments m_mSkinAdjustments; + float m_float13C; + bool m_mSlim; + EquipmentSlot* m_mEquipSlot; // Equipment slot of what? +}; \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/model/models/PlayerModel.h b/src/Minecraft.Client/net/minecraft/client/model/models/PlayerModel.h new file mode 100644 index 00000000..f41dabea --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/model/models/PlayerModel.h @@ -0,0 +1,17 @@ +#pragma once + +#include "net/minecraft/client/model/models/HumanoidModel.h" + +// TODO: grab shit for this +enum EPlayerModelType {}; + +class PlayerModel : public HumanoidModel { +public: + void renderCloak(float); + + void render(HumanoidModel*, float, bool) override; + void setAllVisible(bool) override; + void translateToHandItem(float, const HumanoidArm*) override; + + char m_fill[0x1E0 - 336]; +}; \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/renderer/Lighting.h b/src/Minecraft.Client/net/minecraft/client/renderer/Lighting.h new file mode 100644 index 00000000..e9ddbeef --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/renderer/Lighting.h @@ -0,0 +1,5 @@ +class Lighting { +public: + static void turnOn(); + static void turnOff(); +}; \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderDispatcher.h b/src/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderDispatcher.h index 36bc9915..66096d9c 100644 --- a/src/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderDispatcher.h +++ b/src/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderDispatcher.h @@ -1,5 +1,8 @@ #pragma once +#include "net/minecraft/client/model/models/PlayerModel.h" + +class EntityRenderer; class Textures; class ItemRenderer; @@ -7,5 +10,7 @@ class EntityRenderDispatcher { public: EntityRenderDispatcher(Textures* textures, ItemRenderer* renderer); + EntityRenderer* getPlayerRenderer(EPlayerModelType); + unsigned char m_padding[0xE0]; }; diff --git a/src/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderer.h b/src/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderer.h index 28e39e46..88334f93 100644 --- a/src/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderer.h +++ b/src/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderer.h @@ -11,6 +11,7 @@ class BlockPos; class TexturePack; class ModelDefinition; class EntityRenderDispatcher; +class Model; class EntityRenderer { public: @@ -40,14 +41,14 @@ class EntityRenderer { virtual void renderSecondPass(SharedEntity&, double, double, double, float, float); virtual void setupForTexturePack(TexturePack*); virtual void SetItemFrame(bool); - virtual void getModel(); + virtual Model* getModel(); virtual void getModelName(); virtual void createModel(const ModelDefinition&); - EntityRenderDispatcher* mDispatcher; - int field_10; - float field_14; - void* field_18; - void* field_20; - void* field_28; + EntityRenderDispatcher* m_mDispatcher; + int m_field10; + float m_field14; + void* m_field18; + void* m_field20; + void* m_field28; }; diff --git a/src/Minecraft.Client/net/minecraft/client/renderer/platform/GlStateManager.h b/src/Minecraft.Client/net/minecraft/client/renderer/platform/GlStateManager.h index 0a84bd49..c07c29ca 100644 --- a/src/Minecraft.Client/net/minecraft/client/renderer/platform/GlStateManager.h +++ b/src/Minecraft.Client/net/minecraft/client/renderer/platform/GlStateManager.h @@ -198,4 +198,5 @@ class GlStateManager { static TexGenCoord* getTexGen(GlStateManager::TexGen coord); static int genTexture(); static void deleteTexture(int texture); + static void enableCull(); }; diff --git a/src/Minecraft.Client/net/minecraft/client/renderer/texture/Textures.h b/src/Minecraft.Client/net/minecraft/client/renderer/texture/Textures.h index f570ba08..6068ce46 100644 --- a/src/Minecraft.Client/net/minecraft/client/renderer/texture/Textures.h +++ b/src/Minecraft.Client/net/minecraft/client/renderer/texture/Textures.h @@ -31,6 +31,8 @@ class Textures { void bindTexture(const ResourceLocation*); int loadTexture(_TEXTURE_NAME, const std::wstring&); void loadIndexedTextures(); + int loadMemTexture(const std::wstring&, int); + int loadMemTexture(const std::wstring&, const std::wstring&); static bool IsTUImage(_TEXTURE_NAME name, const std::wstring&); static bool IsOriginalImage(_TEXTURE_NAME name, const std::wstring&); diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/UIScene.h b/src/Minecraft.Client/net/minecraft/client/ui/scene/UIScene.h index 95b8a4eb..5ac0f6e4 100644 --- a/src/Minecraft.Client/net/minecraft/client/ui/scene/UIScene.h +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/UIScene.h @@ -214,4 +214,13 @@ class UIScene { bool m_byteEb; int m_dwordF8; std::vector m_cachedSlotDrawData; + int m_fill; // 8 + union { + int m_focusedSection; + union { + bool m_byte10C; + bool m_bool10D; + bool m_bool10E; + }; + }; }; diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_BitmapIcon.cpp b/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_BitmapIcon.cpp new file mode 100644 index 00000000..ca8e81f2 --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_BitmapIcon.cpp @@ -0,0 +1,7 @@ +#include "net/minecraft/client/ui/scene/control/UIControl.h" +#include "net/minecraft/client/ui/scene/control/UIControl_BitmapIcon.h" + +UIControl_BitmapIcon::UIControl_BitmapIcon() : UIControl() { + this->m_boolIdk2 = false; + this->m_mTextureName = L""; +} \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_BitmapIcon.h b/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_BitmapIcon.h new file mode 100644 index 00000000..e14a1966 --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_BitmapIcon.h @@ -0,0 +1,12 @@ +#include "net/minecraft/client/ui/scene/control/UIControl.h" +class UIControl_BitmapIcon : public UIControl { +public: + UIControl_BitmapIcon(); + + ~UIControl_BitmapIcon() override; + bool setupControl(UIScene*, fuiRenderNode*, const std::string&) override; + void tick() override; + void ReInit() override; + + std::wstring m_mTextureName; +}; \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_PlayerSkinPreview.cpp b/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_PlayerSkinPreview.cpp new file mode 100644 index 00000000..8b8b17dd --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_PlayerSkinPreview.cpp @@ -0,0 +1,297 @@ +#include "DecompUtils.h" +#include "NX/Platform.h" +#include "fui/fuiFile.h" +#include "net/minecraft/client/CMinecraftApp.h" +#include "net/minecraft/client/GameSettings.h" +#include "net/minecraft/client/Minecraft.h" +#include "net/minecraft/client/Options.h" +#include "net/minecraft/client/model/models/HumanoidModel.h" +#include "net/minecraft/client/model/models/PlayerModel.h" +#include "net/minecraft/client/renderer/Lighting.h" +#include "net/minecraft/client/renderer/entity/EntityRenderDispatcher.h" +#include "net/minecraft/client/renderer/entity/EntityRenderer.h" +#include "net/minecraft/client/renderer/platform/GlStateManager.h" +#include "net/minecraft/client/renderer/texture/Textures.h" +#include "net/minecraft/client/ui/scene/control/UIControl.h" +#include "net/minecraft/client/ui/scene/control/UIControl_PlayerSkinPreview.h" +#include "net/minecraft/client/ui/screen/ScreenSizeCalculator.h" +#include "net/minecraft/util/Mth.h" +#include "net/minecraft/world/entity/HumanoidArm.h" +#include "net/minecraft/world/entity/SkinAdjustments.h" +#include "net/minecraft/world/entity/player/Player.h" + +#include +#include + +UIControl_PlayerSkinPreview::UIControl_PlayerSkinPreview() { + this->setSettedUp(12); + this->m_dword58 = 0; + this->m_float5C = 1.0; + this->m_float60 = 1.0; + Minecraft* mc = Minecraft::GetInstance(); + ScreenSizeCalculator calc(mc->m_options, mc->m_displayWidth, mc->m_displayHeight, -1); + this->m_mDisplayWidth = mc->m_displayWidth; + this->m_mScaleWidth = calc.m_scaledWidth; + this->m_mDisplayHeight = mc->m_displayHeight; + this->m_mScaledHeight = calc.m_scaledHeight; + this->m_mSkinCapePath = L"default"; + this->m_mTextureId = eTextureName_STEVE; + this->m_mSkinTexturePath = L""; + this->m_mModelYRotation = 0; + this->m_dword104 = 0; + this->m_mStartYRotation = 0; + this->m_mTargetYRotation = 0; + this->m_mArmSwingProgress = 0; + this->m_bool120 = 0; + this->m_bool121 = 0; + this->m_bool140 = 0; + this->m_bool141 = 0; + this->m_bool142 = 0; + this->m_bool143 = 0; + this->m_mPlayerAnimation = 0; + this->m_mSkinChangeFrame = 0; + this->m_mIsChangingSkin = false; + this->m_mAdditionalModelParts = nullptr; + this->m_mModelYRotation = 0.0f; + this->m_dword104 = 0; + this->m_float118 = 0.0f; + this->m_float11C = 0.0f; +} + +UIControl_PlayerSkinPreview::~UIControl_PlayerSkinPreview() {} + +void UIControl_PlayerSkinPreview::tick() { + UIControl::tick(); + + if (this->m_mIsChangingSkin) { + this->m_mSkinChangeFrame++; + this->m_mModelYRotation + = this->m_mStartYRotation + + ((this->m_mTargetYRotation - this->m_mStartYRotation) / 15) * (this->m_mSkinChangeFrame); + return; + } + + if (this->m_bool140) + this->sub_710055F360(); + if (this->m_bool141) + this->sub_710055F37C(); + if (this->m_bool142) + this->sub_710055F398(); + if (this->m_bool143) + this->sub_710055F3B4(); + + if (this->m_bool120) { + ++this->m_char122; + if ((this->m_char122 & 3) != 0) + return; + + if (this->m_mModelYRotation > 44) { + this->m_bool121 = false; + } else if (this->m_mModelYRotation < -44) { + this->m_bool121 = true; + } + + if (this->m_bool121) { + this->sub_710055F398(); + } else { + this->sub_710055F3B4(); + } + } +} + +void UIControl_PlayerSkinPreview::SetTexture(const std::wstring& skinTexPath, _TEXTURE_NAME texId) { + this->m_mSkinTexturePath = skinTexPath; + this->m_mTextureId = texId; + + _SkinAdjustments adj + = Player::getSkinAdjustmentsById(CMinecraftApp::getSkinIdFromPath(this->m_mSkinTexturePath)); + char customSkinAnims = GameSettings::GetGameSettings(eGameSetting_CustomSkinAnimation); + memcpy(&this->m_mSkinAdjustments, &adj, sizeof(this->m_mSkinAdjustments)); + + if (!customSkinAnims && (adj.m_anim & 0x1F1F810) == 0) + this->m_mSkinAdjustments.m_anim = 0; + + this->m_mAdditionalModelParts = CConsoleMinecraftApp::sInstance.GetAdditionalModelParts( + CMinecraftApp::getSkinIdFromPath(this->m_mSkinTexturePath)); +} + +bool UIControl_PlayerSkinPreview::bindTexture(const std::wstring& texName, int texId) { + Textures* texs = Minecraft::GetInstance()->m_textures; + int tex = texs->loadMemTexture(texName, texId); + if (tex < 0) + return false; + + texs->bind(tex); + return true; +} + +// not sure if that's texPath and don't care about checking that +bool UIControl_PlayerSkinPreview::bindTexture(const std::wstring& texName, const std::wstring& texPath) { + Textures* texs = Minecraft::GetInstance()->m_textures; + int tex = texs->loadMemTexture(texName, texPath); + if (tex < 0) + return false; + + texs->bind(tex); + return true; +} + +// NON_MATCHING: math math math, idk if functionality is the same +void UIControl_PlayerSkinPreview::render(EntityRenderer* entRenderer, double a3, double a4, double a5, + float a8, float a7) { + // args are probably posses, and some width hehight + GlStateManager::pushMatrix(); + GlStateManager::disableCull(); + // or PlayerModel + PlayerModel* model = (PlayerModel*)entRenderer->getModel(); + model->m_attackTime = 0.0f; + model->m_flag2 = false; + model->setArmPose(HumanoidArm::RIGHT, (HumanoidModel::eArmPose)0); + model->setArmPose(HumanoidArm::LEFT, (HumanoidModel::eArmPose)0); + model->m_flag1 = false; + model->m_flag3 = false; + model->m_dwordE4 = 0; + model->m_dwordE8 = 0; + model->m_isYoung = false; + model->m_riding = false; + model->m_mHeadPart->m_xRot = 0.0f; + memcpy(&model->m_mSkinAdjustments, &this->m_mSkinAdjustments, sizeof(this->m_mSkinAdjustments)); + if (!this->m_mIsChangingSkin) { + if (this->m_mPlayerAnimation == 1) { + model->m_flag1 = true; + model->m_mHeadPart->m_yRot = 0.1f; + } else if (this->m_mPlayerAnimation == 2) { + model->setArmPose(HumanoidArm::RIGHT, (HumanoidModel::eArmPose)1); + this->m_mArmSwingProgress++; + if (this->m_mArmSwingProgress >= 18.0f) + this->m_mArmSwingProgress = 0.0f; + + model->m_attackTime = this->m_mArmSwingProgress / 18.0f; + } + } + int modelYRot = this->m_mModelYRotation; + + GlStateManager::translatef(a3, a4, a5); + GlStateManager::rotatef(180.0f - modelYRot, 0.0f, 1.0f, 0.0f); + GlStateManager::enableRescaleNormal(); + GlStateManager::scalef(-1.0f, -1.0f, -1.0f); + GlStateManager::scalef(0.9375f, 0.9375f, 0.9375f); + GlStateManager::translatef(0.0f, -1.5078f, 0.0f); + // NOTE: go back to this if not matching, as this is simplifed af + float prev118 = this->m_float118; + this->m_float114 = prev118; + + float delta = prev118 + (0.1f - prev118) * 0.4f; + this->m_float118 = delta; + + this->m_float11C += delta; + + float a = this->m_float11C - (1.0f - a7) * delta; + float b = decomp_fmin1(prev118 + (delta - prev118) * a7, 1.0f); + + MemSect(31); + this->bindTexture(this->m_mSkinTexturePath, this->m_mTextureId); + MemSect(0); + + GlStateManager::enableAlphaTest(); + model->setAllVisible(true); + std::shared_ptr ent = nullptr; + ((Model*)model)->render(ent, a, b, 0.0f, modelYRot - modelYRot, 0.0f, 0.0625f, true); + + if (this->bindTexture(this->m_mSkinCapePath, L"")) { + GlStateManager::pushMatrix(); + GlStateManager::translatef(0.0f, 0.0f, 0.125f); + float a = sinf(0.017453f); + float b = -cosf(0.017453f) * 0.0f; // what lmfao + float c = a * 0.0f + b; + b = b - a * 0.0f; + float d = b * 100.0f; + float e = decomp_fmax(c * 100.0f, 0.0f); + GlStateManager::rotatef((model->m_flag2 == false ? 1.0f : 26.0f) + e * 0.5f + 6.0f, 1.0f, 0.0f, 0.0f); + GlStateManager::rotatef(d * 0.5f, 0.0f, 0.0f, 1.0f); + GlStateManager::rotatef(d * -0.5f, 0.0f, 1.0f, 0.0f); + GlStateManager::rotatef(180.0f, 0.0f, 1.0f, 0.0f); + model->renderCloak(0.0625); // 1.0f / 16.0f, idk which one represents better what 4J had on mind + GlStateManager::popMatrix(); + } + + GlStateManager::disableRescaleNormal(); + GlStateManager::enableCull(); + GlStateManager::popMatrix(); + MemSect(31); + // :( + MemSect(0); + + model->m_attackTime = 0; + model->m_flag2 = false; + model->setArmPose(HumanoidArm::RIGHT, (HumanoidModel::eArmPose)0); + model->setArmPose(HumanoidArm::LEFT, (HumanoidModel::eArmPose)0); + model->clearAllOffsets(); +} + +void UIControl_PlayerSkinPreview::render(fuiRect* rect) { + Minecraft* mc = Minecraft::GetInstance(); + GlStateManager::enableRescaleNormal(); + GlStateManager::enableColorMaterial(); + GlStateManager::pushMatrix(); + + float width = rect->getWidth(); + float height = rect->getHeight(); + + if ((this->m_mSkinAdjustments.m_anim & 0x80000000) != 0) { + GlStateManager::translatef(width * 0.5f, height - 250.0f - 3.5f, 50.0f); + } else { + GlStateManager::translatef(width * 0.5f, height - 3.5f, 50.0f); + } + + float a = (width / (this->m_mDisplayWidth / this->m_mDisplayHeight)); + GlStateManager::scalef(-a, a, a); + if ((this->m_mSkinAdjustments.m_anim & 0x80000000) == 0) { + GlStateManager::rotatef(180.0f, 0.0f, 0.0f, 1.0f); + } + Lighting::turnOn(); + float angle = this->m_dword104; + GlStateManager::rotatef(-angle, 1.0f, 0.0f, 0.0f); + bool prevOption = mc->m_options->m_byte13c; + mc->m_options->m_byte13c = true; + + EPlayerModelType modelType; + if (!this->m_mSkinTexturePath.empty()) { + _SkinAdjustments adj = CConsoleMinecraftApp::sInstance.GetSkinAdjustments( + CMinecraftApp::getSkinIdFromPath(this->m_mSkinTexturePath)); + modelType = Player::GetModelTypeFromAnimBitmask(adj.m_anim); + } else { + modelType = Player::GetModelTypeFromTextureId(this->m_mTextureId); + } + + EntityRenderer* entRenderer + = Minecraft::GetInstance()->getEntityRenderDispatcher()->getPlayerRenderer(modelType); + if (entRenderer) { + // what's the point of checking size... btw took me hours to figure that out lmao + if (this->m_mAdditionalModelParts) { + if (this->m_mAdditionalModelParts->size() != 0) { + for (auto it = this->m_mAdditionalModelParts->begin(); + it != this->m_mAdditionalModelParts->end(); ++it) { + (*it)->m_visible = true; + } + } + } + + this->render(entRenderer, 0.0, 0.0, 0.0, 1.0f, 1.0f); + + // what's the point of checking size... btw took me hours to figure that out lmao + if (this->m_mAdditionalModelParts) { + if (this->m_mAdditionalModelParts->size() != 0) { + for (auto it = this->m_mAdditionalModelParts->begin(); + it != this->m_mAdditionalModelParts->end(); ++it) { + (*it)->m_visible = false; + } + } + } + } + + mc->m_options->m_byte13c = prevOption; + GlStateManager::popMatrix(); + Lighting::turnOff(); + GlStateManager::disableRescaleNormal(); +} \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_PlayerSkinPreview.h b/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_PlayerSkinPreview.h new file mode 100644 index 00000000..9bd48e51 --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/control/UIControl_PlayerSkinPreview.h @@ -0,0 +1,61 @@ +#include "net/minecraft/client/model/geom/ModelPart.h" +#include "net/minecraft/client/renderer/texture/TextureName.h" +#include "net/minecraft/client/ui/scene/control/UIControl.h" + +#include "net/minecraft/world/entity/SkinAdjustments.h" +#include + +class EntityRenderer; +struct fuiRect; + +class UIControl_PlayerSkinPreview : public UIControl { +public: + enum ESkinPreviewFacing { FRONT, LEFT, RIGHT }; + UIControl_PlayerSkinPreview(); + + ~UIControl_PlayerSkinPreview() override; + void tick() override; + + bool bindTexture(const std::wstring&, int); + bool bindTexture(const std::wstring&, const std::wstring&); + void render(EntityRenderer*, double, double, double, float, float); + void render(fuiRect*); + void SetTexture(const std::wstring& skinTexPath, _TEXTURE_NAME texId); + void SetFacing(UIControl_PlayerSkinPreview::ESkinPreviewFacing, bool); + void sub_710055F360(); + void sub_710055F37C(); + void sub_710055F398(); + void sub_710055F3B4(); + + int m_dword58; + float m_float5C; + float m_float60; + std::wstring m_mSkinTexturePath; + _TEXTURE_NAME m_mTextureId; + std::wstring m_mSkinCapePath; + _SkinAdjustments m_mSkinAdjustments; + float m_mDisplayWidth; + float m_mDisplayHeight; + float m_mScaleWidth; + float m_mScaledHeight; + int m_mModelYRotation; + int m_dword104; + int m_mStartYRotation; + int m_mTargetYRotation; + float m_float110; + float m_float114; + float m_float118; + float m_float11C; + bool m_bool120; + bool m_bool121; + char m_char122; + int m_mSkinChangeFrame; + bool m_mIsChangingSkin; + float m_mArmSwingProgress; + int m_mPlayerAnimation; + std::vector* m_mAdditionalModelParts; + bool m_bool140; + bool m_bool141; + bool m_bool142; + bool m_bool143; +}; \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/IUIScene_DlcSelectMenu.h b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/IUIScene_DlcSelectMenu.h new file mode 100644 index 00000000..3d759cb8 --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/IUIScene_DlcSelectMenu.h @@ -0,0 +1,12 @@ +class DLCPack; + +enum eDLCContentType { MAP, SKIN }; + +class IUIScene_DlcSelectMenu { +public: + IUIScene_DlcSelectMenu(eDLCContentType); + + bool char0; + DLCPack* mDLCPack; + eDLCContentType mDLCContentType; +}; \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_AbstractContainerMenu.cpp b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_AbstractContainerMenu.cpp index 67d8904c..bc973a23 100644 --- a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_AbstractContainerMenu.cpp +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_AbstractContainerMenu.cpp @@ -281,7 +281,8 @@ void UIScene_AbstractContainerMenu::setSectionFocus(IUIScene_AbstractContainerMe sectionBefore->setFocus(true); if (this->m_focusedSection != ESceneSection_NONE) { - UIControl_SlotList* sectionAfter = this->getSection(this->m_focusedSection); + UIControl_SlotList* sectionAfter + = this->getSection((IUIScene_AbstractContainerMenu::ESceneSection)this->m_focusedSection); if (sectionAfter != sectionBefore && sectionAfter != nullptr) sectionAfter->setFocus(false); } @@ -291,7 +292,8 @@ void UIScene_AbstractContainerMenu::setSectionFocus(IUIScene_AbstractContainerMe void UIScene_AbstractContainerMenu::setFocusToPointer(int) { if (this->m_focusedSection != ESceneSection_NONE) { - UIControl_SlotList* section = this->getSection(this->m_focusedSection); + UIControl_SlotList* section + = this->getSection((IUIScene_AbstractContainerMenu::ESceneSection)this->m_focusedSection); if (section) { section->setFocus(false); } diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_AbstractContainerMenu.h b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_AbstractContainerMenu.h index 9037a75a..4e0f9616 100644 --- a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_AbstractContainerMenu.h +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_AbstractContainerMenu.h @@ -38,9 +38,7 @@ class UIScene_AbstractContainerMenu : public UIScene, virtual public IUIScene_Ab virtual UIControl_SlotList* getSection(IUIScene_AbstractContainerMenu::ESceneSection); virtual int GetBaseSlotCount(); - int m_fill; // 8 - ESceneSection m_focusedSection; // 12 - bool m_byte110; // 17 + bool m_byte110; // 17 int m_dword114; int m_dword118; UIControl m_mainPanel; // 288 diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_DeathMenu.h b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_DeathMenu.h index 7e23abbf..afa290d6 100644 --- a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_DeathMenu.h +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_DeathMenu.h @@ -19,10 +19,6 @@ class UIScene_DeathMenu : public UIScene { void handleInput(int, int, bool, bool, bool, bool&) override; void handlePress(int, int) override; - char m_gap108[4]; - bool m_byte10C; - bool m_bool10D; - bool m_bool10E; UIControl_Button m_respawnButton; UIControl_Button m_exitGameButton; UIControl_Label m_titleLabel; diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_HowToPlayMenu.h b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_HowToPlayMenu.h index d5a35e6a..c8a43ab0 100644 --- a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_HowToPlayMenu.h +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_HowToPlayMenu.h @@ -15,7 +15,6 @@ class UIScene_HowToPlayMenu : public UIScene { bool mapElementsAndNames() override; EUIScene getSceneType() override; - void* m_qword108; UIControl_ButtonList m_uicontrolList110; int m_dword200; }; diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_Intro.cpp b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_Intro.cpp index 291fc28a..3d60329d 100644 --- a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_Intro.cpp +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_Intro.cpp @@ -7,8 +7,8 @@ // NON_MATCHING | Score: 935 (lower is better) UIScene_Intro::UIScene_Intro(int a1, void* a2, UILayer* layer) : UIScene(a1, layer) { this->initialiseMovie(); - this->m_unk = false; - this->m_skippable = false; + this->m_byte10C = false; + this->m_bool10D = false; this->setIntroPlatform(); this->m_touchToSkip->init(0); } @@ -36,7 +36,7 @@ bool UIScene_Intro::hasFocus(int i) { } void UIScene_Intro::handleGainFocus(bool focused) { - if (this->m_skippable) + if (this->m_byte10C) gConsoleUIController.NavigateToScene(0, EUIScene_MainMenu, nullptr, static_cast(6), static_cast(6)); } diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_Intro.h b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_Intro.h index 5c5344a1..38378c29 100644 --- a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_Intro.h +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_Intro.h @@ -20,8 +20,5 @@ class UIScene_Intro : public UIScene { void setIntroPlatform(); - int m_padding; - bool m_unk; - bool m_skippable; UIControl_Touch* m_touchToSkip; }; diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_MainMenu.h b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_MainMenu.h index 7c1bf2be..1f498829 100644 --- a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_MainMenu.h +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_MainMenu.h @@ -22,7 +22,6 @@ class UIScene_MainMenu : public UIScene { static int MustSignInReturned(void*, int, C4JStorage::EMessageResult); - void* m_unk2; UIControl_Button m_buttons[8]; UIControl m_timer; bool m_4e8; diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_SettingsListMenu.h b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_SettingsListMenu.h index 4a3f8c1e..6e7e98e8 100644 --- a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_SettingsListMenu.h +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_SettingsListMenu.h @@ -7,7 +7,6 @@ class UIScene_SettingsListMenu : public UIScene { public: - char gap108[8]; UIControl_MultiList mSettingsList; char gap200[112]; int mSettingsTab; diff --git a/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_SkinSelectMenu.h b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_SkinSelectMenu.h new file mode 100644 index 00000000..7553493c --- /dev/null +++ b/src/Minecraft.Client/net/minecraft/client/ui/scene/scenes/UIScene_SkinSelectMenu.h @@ -0,0 +1,66 @@ +#include "net/minecraft/client/model/Model.h" +#include "net/minecraft/client/ui/scene/UIScene.h" +#include "net/minecraft/client/ui/scene/control/UIControl_BitmapIcon.h" +#include "net/minecraft/client/ui/scene/control/UIControl_Label.h" +#include "net/minecraft/client/ui/scene/control/UIControl_MultiList.h" +#include "net/minecraft/client/ui/scene/control/UIControl_PlayerSkinPreview.h" +#include "net/minecraft/client/ui/scene/control/UIControl_Touch.h" +#include "net/minecraft/client/ui/scene/scenes/IUIScene_DlcSelectMenu.h" + +class UIScene_SkinSelectMenu : public UIScene, public IUIScene_DlcSelectMenu { +public: + UIScene_SkinSelectMenu(); + + bool mapElementsAndNames() override; + std::wstring getMoviePath() override; + ~UIScene_SkinSelectMenu() override; + EUIScene getSceneType() override; + void tick() override; + void updateTooltips() override; + void updateComponents() override; + void customDraw(const char*, fuiRect*) override; + void handleInput(int, int, bool, bool, bool, bool&) override; + void handleReload() override; + void handlePress(int, int) override; + void handleFocusChange(int, int) override; + void handleAnimationEnd() override; + void HandleDLCMountingComplete() override; + void HandleDLCInstalled() override; + void HandleDLCLicenseChange() override; + void handleTouchInput(unsigned int, int, int, int, bool, bool, bool) override; + + UIControl_PlayerSkinPreview mSkinPreviews[7]; + UIControl_Label mSkinTitle1Control; + UIControl_Label mSkinTitle2Control; + UIControl_Label mPackNameControl; + UIControl_Label mPackTypeControl; + UIControl mIggyCharactersControl; + UIControl mTimerControl; + UIControl_Touch mTouchControl; + UIControl_MultiList mSkinButtonList; + UIControl_BitmapIcon mTexturePackIconControl; + void* qwordE58; + void* qwordE60; + void* qwordE68; + void* qwordE70; + void* qwordE78; + void* qwordE80; + void* qwordE88; + void* qwordE90; + void* qwordE98; + void* qwordEA0; + int mSkinID; + int mSelectedSkinID; + std::wstring mSelectedSkinName; // that's wrong for sure + std::wstring mSkinName; + std::wstring mSkinCapePath; + std::vector* mAdditionalBoxes; + uint16_t wordF00; + char byteF02; + char byteF03; + char byteF04; + uint16_t wordF05; + uint16_t dwordF08; + char gapF0C[5]; + char byteF11; +}; \ No newline at end of file diff --git a/src/Minecraft.Client/net/minecraft/network/Socket.h b/src/Minecraft.Client/net/minecraft/network/Socket.h index 2368c6bf..9c58e767 100644 --- a/src/Minecraft.Client/net/minecraft/network/Socket.h +++ b/src/Minecraft.Client/net/minecraft/network/Socket.h @@ -4,6 +4,7 @@ #include "net/minecraft/world/ArrayWithLength.h" class InputStream; +class C4JEventImpl; class Socket { public: @@ -44,6 +45,8 @@ class Socket { Socket* m_socket; }; + ~Socket(); + long getRemoteSocketAddress(); void setSoTimeout(int); @@ -54,4 +57,7 @@ class Socket { void close(bool); bool sub_71000EA668(); + + char m_fill[208]; + C4JEventImpl* m_mEvent; }; diff --git a/src/Minecraft.World/net/minecraft/util/Mth.h b/src/Minecraft.World/net/minecraft/util/Mth.h index 97227879..e9a267f0 100644 --- a/src/Minecraft.World/net/minecraft/util/Mth.h +++ b/src/Minecraft.World/net/minecraft/util/Mth.h @@ -8,6 +8,7 @@ class Random; class Mth { public: static constexpr float PI = 3.1415927; + static inline float RAD = PI / 180.0f; // radian static float* SIN; diff --git a/src/Minecraft.World/net/minecraft/world/entity/Entity.h b/src/Minecraft.World/net/minecraft/world/entity/Entity.h index ea148673..c590fdda 100644 --- a/src/Minecraft.World/net/minecraft/world/entity/Entity.h +++ b/src/Minecraft.World/net/minecraft/world/entity/Entity.h @@ -62,6 +62,7 @@ class Entity : public std::enable_shared_from_this, public CommandSender static void staticCtor(); static int getSmallId(); + static bool instanceof(const std::shared_ptr&, eINSTANCEOF); Entity(Level*, bool); void _init(bool, Level*); diff --git a/src/Minecraft.World/net/minecraft/world/entity/SkinAdjustments.h b/src/Minecraft.World/net/minecraft/world/entity/SkinAdjustments.h index 34bbc8f6..537396da 100644 --- a/src/Minecraft.World/net/minecraft/world/entity/SkinAdjustments.h +++ b/src/Minecraft.World/net/minecraft/world/entity/SkinAdjustments.h @@ -21,7 +21,7 @@ class _SkinAdjustments { float m_float38; float m_float3C; float m_float40; - int m_dword44; + int m_anim; int m_dword48; int m_dword4C; }; diff --git a/src/Minecraft.World/net/minecraft/world/entity/player/Player.h b/src/Minecraft.World/net/minecraft/world/entity/player/Player.h index 658b7322..b0ba9e29 100644 --- a/src/Minecraft.World/net/minecraft/world/entity/player/Player.h +++ b/src/Minecraft.World/net/minecraft/world/entity/player/Player.h @@ -1,11 +1,13 @@ #pragma once +#include "net/minecraft/client/model/models/PlayerModel.h" #include "net/minecraft/sounds/SoundSource.h" #include "net/minecraft/world/ArrayWithLength.h" #include "net/minecraft/world/PlayerUID.h" #include "net/minecraft/world/eINSTANCEOF.h" #include "net/minecraft/world/entity/Entity.h" #include "net/minecraft/world/entity/LivingEntity.h" +#include "net/minecraft/world/entity/SkinAdjustments.h" #include "net/minecraft/world/entity/player/Abilities.h" #include "net/minecraft/world/entity/player/StatsUID.h" #include "net/minecraft/world/food/FoodData.h" @@ -201,6 +203,10 @@ class Player : public LivingEntity { const StatsUID getSUID(); PlayerUID getPlayerUID() { return this->m_playerUiD1; } // guessed name + static _SkinAdjustments getSkinAdjustmentsById(int id); + static EPlayerModelType GetModelTypeFromAnimBitmask(int anim); + static EPlayerModelType GetModelTypeFromTextureId(int textureId); + static std::vector sSkins; std::shared_ptr m_inventory = nullptr; diff --git a/src/PlatformLibraries_Source/CPlatformNetworkManager.h b/src/PlatformLibraries_Source/CPlatformNetworkManager.h index 2a5976b8..e7e2efcf 100644 --- a/src/PlatformLibraries_Source/CPlatformNetworkManager.h +++ b/src/PlatformLibraries_Source/CPlatformNetworkManager.h @@ -1,5 +1,119 @@ #pragma once +#include "PlatformLibraries_Source/NQRNetworkManager.h" +#include "net/minecraft/network/protocol/game/ClientboundPreLoginPacket.h" +#include "net/minecraft/world/PlayerUID.h" +#include "net/minecraft/world/level/gamemode/minigames/EMiniGameId.h" +#include + +namespace nn::friends { +class FriendPresence; +} +class CGameNetworkManager; +class GameSessionData { + char m_filuniek[346]; +}; +struct FriendSessionInfo { + void* m_qword0; + NQRNetworkManager::SessionSearchResult m_mSearchResult; + GameSessionData m_mGameSessionData; + uint8_t m_mCurrentPlayerCount; +}; +class INetworkPlayer; +class NQRNetworkPlayer; + class CPlatformNetworkManager { public: + virtual void Initialise(CGameNetworkManager*, int) = 0; + virtual void Terminate() = 0; + virtual int GetJoiningReadyPercentage() = 0; + virtual int CorrectErrorIDS(int) = 0; + virtual void DoWork() = 0; + virtual int GetPlayerCount() = 0; + virtual int GetOnlinePlayerCount() = 0; + virtual int GetLocalPlayerMask(int) = 0; + virtual void AddLocalPlayerByUserIndex(int) = 0; + virtual void RemoveLocalPlayerByUserIndex(int) = 0; + virtual int AddLocalPlayerByPlayerUID(PlayerUID) = 0; + virtual INetworkPlayer* GetLocalPlayerByUserIndex(int) = 0; + virtual INetworkPlayer* GetPlayerByIndex(int) = 0; + virtual INetworkPlayer* GetPlayerByXuid(PlayerUID) = 0; + virtual INetworkPlayer* GetPlayerBySmallId(unsigned char) = 0; + virtual bool ShouldMessageForFullSession() = 0; + virtual INetworkPlayer* GetHostPlayer() = 0; + virtual bool IsHost() = 0; + virtual void JoinGameFromInviteInfo(int, int, const nn::friends::FriendPresence*) = 0; + virtual bool LeaveGame(bool) = 0; + virtual bool IsInSession() = 0; + virtual bool IsInGameplay() = 0; + virtual bool IsReadyToPlayOrIdle() = 0; + virtual bool IsInStatsEnabledSession() = 0; + virtual bool IsMatchmakingEnabled() = 0; + virtual bool IsHandlingBootInvite() = 0; + virtual bool SessionHasSpace(unsigned int) = 0; + // virtual bool SessionHasMii(int) = 0; + virtual void SendInviteGUI(int) = 0; + virtual bool IsAddingPlayer() = 0; + virtual void HostGame(int, bool, bool, unsigned char, EMiniGameId, unsigned int, unsigned int*) = 0; + virtual int JoinGame(FriendSessionInfo*, int, int, bool) = 0; + virtual bool FindAndJoinGame(int, int, EMiniGameId, unsigned int, unsigned int*, unsigned int*) = 0; + virtual void CancelJoinGame() = 0; + virtual bool SetLocalGame(bool) = 0; + virtual bool IsLocalGame() = 0; + virtual bool SetPrivateGame(bool) = 0; + virtual bool IsPrivateGame() = 0; + virtual bool IsLeavingGame() = 0; + virtual void ResetLeavingGame() = 0; + virtual void RegisterPlayerChangedCallback(int, void (*)(void*, INetworkPlayer*, bool), void*) = 0; + virtual void UnRegisterPlayerChangedCallback(int, void (*)(void*, INetworkPlayer*, bool), void*) = 0; + virtual void HandleSignInChange() = 0; + virtual void _RunNetworkGame() = 0; + virtual bool _LeaveGame(bool, bool) = 0; + virtual void _HostGame(int, unsigned char, EMiniGameId, unsigned int, unsigned int*) = 0; + virtual void _StartGame() = 0; + virtual void UpdateAndSetGameSessionData(INetworkPlayer*) = 0; + virtual void RemoveLocalPlayer(INetworkPlayer*) = 0; + virtual void SystemFlagAddPlayer(INetworkPlayer*) = 0; + virtual void SystemFlagSet(INetworkPlayer*, int) = 0; + virtual void SystemFlagGet(INetworkPlayer*, int) = 0; + virtual void SystemFlagClearAll(INetworkPlayer*) = 0; + virtual void GatherStats() = 0; + virtual void GatherRTTStats() = 0; + virtual void SetSessionTexturePackParentId(int) = 0; + virtual void SetSessionSubTexturePackId(int) = 0; + virtual void SetSessionGameModeId(int) = 0; + virtual void Notify(int, unsigned long) = 0; + virtual void GetSessionList(int, int, bool) = 0; + virtual void GetGameSessionInfo(int, unsigned int, FriendSessionInfo*) = 0; + virtual void SetSessionsUpdatedCallback(void (*)(void*), void*) = 0; + virtual void GetFullFriendSessionInfo(FriendSessionInfo*, void (*)(bool, void*), void*) = 0; + virtual void ForceFriendsSessionRefresh() = 0; + virtual void ClearFriendsSessions() = 0; + virtual void AlreadyInSession(const nn::friends::FriendPresence*) = 0; + virtual void GetAgeRestricted() = 0; + virtual void usingAdhocMode() = 0; + virtual void setAdhocMode(bool) = 0; + virtual void startAdhocMatching() = 0; + virtual bool isAdhocConnected() = 0; + virtual void connectToAdhoc() = 0; + virtual bool isAdhocModeChangeInProgress() = 0; + virtual void AttemptAdhocSignIn(int (*)(void*, bool, int), void*, bool) = 0; + virtual void setLanMode(bool) = 0; + virtual void usingLanMode() = 0; + virtual bool isLanConnected() = 0; + virtual bool isLanModeChangeInProgress() = 0; + virtual void checkValidInviteData(const nn::friends::FriendPresence*) = 0; + virtual void SetExitAndJoinFromInviteInProgress(bool) = 0; + virtual void CancelDisconnectFromExitAndJoin() = 0; + virtual void FakeLocalPlayerJoined() = 0; + virtual void GetDisplayNameByGamertag(std::wstring) = 0; + virtual void GetOutstandingAckCount(INetworkPlayer*) = 0; + virtual void TryToConnectOnline(int (*)(void*, bool, int), void*, bool) = 0; + virtual void AttemptPSNSignIn(int (*)(void*, bool, int), void*, bool, int) = 0; + virtual void RecvInviteGUI() = 0; + virtual void UpdateInviteData(void*) = 0; + virtual void CheckFriendsCanPlay(int, int&, std::shared_ptr, int, int&, int&, + int&, int&) + = 0; + virtual ~CPlatformNetworkManager() = 0; }; diff --git a/src/PlatformLibraries_Source/GameSessionData.h b/src/PlatformLibraries_Source/GameSessionData.h new file mode 100644 index 00000000..4db44b13 --- /dev/null +++ b/src/PlatformLibraries_Source/GameSessionData.h @@ -0,0 +1,3 @@ +#pragma once + +class GameSessionData {}; \ No newline at end of file diff --git a/src/PlatformLibraries_Source/INQRNetworkManagerListener.h b/src/PlatformLibraries_Source/INQRNetworkManagerListener.h new file mode 100644 index 00000000..9b507169 --- /dev/null +++ b/src/PlatformLibraries_Source/INQRNetworkManagerListener.h @@ -0,0 +1,21 @@ +#pragma once + +#include "CPlatformNetworkManager.h" +#include "NQRNetworkManager.h" + +class NQRNetworkPlayer; + +class INQRNetworkManagerListener { +public: + virtual ~INQRNetworkManagerListener(); + virtual void HandleDataReceived(NQRNetworkPlayer*, NQRNetworkPlayer*, unsigned char*, unsigned int) = 0; + virtual void HandlePlayerJoined(NQRNetworkPlayer*) = 0; + virtual void HandlePlayerLeaving(NQRNetworkPlayer*) = 0; + virtual void HandleStateChange(NQRNetworkManager::eNQRNetworkManagerState, + NQRNetworkManager::eNQRNetworkManagerState, bool) + = 0; + virtual void HandleResyncPlayerRequest(NQRNetworkPlayer**) = 0; + virtual void HandleAddLocalPlayerFailed(int) = 0; + virtual void HandleDisconnect(bool) = 0; + virtual void HandleInviteReceived(int, nn::friends::FriendPresence*) = 0; +}; \ No newline at end of file diff --git a/src/PlatformLibraries_Source/INetworkPlayer.h b/src/PlatformLibraries_Source/INetworkPlayer.h new file mode 100644 index 00000000..f25286d1 --- /dev/null +++ b/src/PlatformLibraries_Source/INetworkPlayer.h @@ -0,0 +1,42 @@ +#pragma once + +#include "net/minecraft/world/PlayerUID.h" + +class Socket; +class NQRNetworkPlayer; + +class INetworkPlayer { +public: + INetworkPlayer(); + + virtual ~INetworkPlayer() = 0; + virtual int GetSmallId() = 0; + virtual void SendData(INetworkPlayer* player, const void* data, int size, bool reliable, bool ordered) + = 0; + virtual bool IsSameSystem(INetworkPlayer* player) = 0; + virtual int GetOutstandingAckCount() = 0; + virtual int GetSinglePlayerOutstandingAckCount() = 0; + virtual void DecrementAcksOutstanding() = 0; + virtual int GetSendQueueSizeBytes(INetworkPlayer* player, bool includeOverhead) = 0; + virtual int GetSendQueueSizeMessages(INetworkPlayer* player, bool includeOverhead) = 0; + virtual int GetCurrentRtt() = 0; + virtual bool IsHost() = 0; + virtual bool IsGuest() = 0; + virtual bool IsLocal() = 0; + virtual int GetSessionIndex() = 0; + virtual bool IsTalking() = 0; + virtual bool IsMutedByLocalUser(int userIndex) = 0; + virtual bool HasVoice() = 0; + virtual bool HasCamera() = 0; + virtual int GetUserIndex() = 0; + virtual void SetSocket(Socket* socket) = 0; + virtual Socket* GetSocket() = 0; + virtual std::wstring GetOnlineName() = 0; + virtual std::wstring GetDisplayName() = 0; + virtual PlayerUID GetUID() = 0; + virtual void SetUID(PlayerUID uid) = 0; + virtual void SentChunkPacket() = 0; + virtual int GetTimeSinceLastChunkPacket_ms() = 0; + virtual bool isFake() = 0; + virtual NQRNetworkPlayer* GetQNetPlayer() = 0; +}; \ No newline at end of file diff --git a/src/PlatformLibraries_Source/NQRNetworkManager.h b/src/PlatformLibraries_Source/NQRNetworkManager.h index 9b139084..37e8c7fb 100644 --- a/src/PlatformLibraries_Source/NQRNetworkManager.h +++ b/src/PlatformLibraries_Source/NQRNetworkManager.h @@ -2,65 +2,72 @@ #include +class NQRNetworkPlayer; +class PlayerUID; + namespace nn::friends { class FriendPresence; } -class CMatchMakeSearchParam; -class NQRNetworkPlayer; -class PlayerUID; +struct CMatchMakeSearchParam { + unsigned int m_params[14]; +}; class NQRNetworkManager { public: - class SessionSearchResult; + struct SessionSearchResult { + char m_fill[84]; + }; class PresenceSyncInfo; + enum eNQRNetworkManagerState { IN_GAMEPLAY = 6 }; + virtual ~NQRNetworkManager(); virtual void Tick() = 0; virtual void Initialise() = 0; virtual void Terminate() = 0; - virtual void GetState() = 0; - virtual void IsHost() = 0; - virtual void IsReadyToPlayOrIdle() = 0; - virtual void IsInSession() = 0; - virtual void IsMatchmakingEnabled() = 0; + virtual eNQRNetworkManagerState GetState() = 0; + virtual bool IsHost() = 0; + virtual bool IsReadyToPlayOrIdle() = 0; + virtual bool IsInSession() = 0; + virtual bool IsMatchmakingEnabled() = 0; virtual void CreateAndJoinRoom(int, int, void*, int, int*, int, bool, unsigned char) = 0; virtual void UpdateExternalRoomData() = 0; - virtual void FriendRoomManagerIsBusy() = 0; + virtual bool FriendRoomManagerIsBusy() = 0; virtual void FriendRoomManagerSearch() = 0; virtual void FriendRoomManagerSearch2() = 0; virtual void FriendRoomManagerGetCount() = 0; virtual void FriendRoomManagerGetRoomInfo(int, NQRNetworkManager::SessionSearchResult*) = 0; - virtual void JoinRoom(NQRNetworkManager::SessionSearchResult*, int) = 0; + virtual int JoinRoom(NQRNetworkManager::SessionSearchResult*, int) = 0; + virtual bool FriendPresenceUpdatedRoomList() = 0; + virtual void GetFriendRoomSearchResults(int*) = 0; virtual void JoinRoom(unsigned int, int, const NQRNetworkManager::PresenceSyncInfo*) = 0; virtual void JoinRoom(int, const nn::friends::FriendPresence*) = 0; - virtual void FriendPresenceUpdatedRoomList() = 0; - virtual void GetFriendRoomSearchResults(int*) = 0; virtual void GetExtDataForRoom(unsigned int, void*, void (*)(bool, void*), void*) = 0; - virtual void FindAndJoinRoom(int, unsigned int, CMatchMakeSearchParam*, unsigned char) = 0; + virtual bool FindAndJoinRoom(int, unsigned int, CMatchMakeSearchParam*, unsigned char) = 0; virtual void StartGame() = 0; virtual void LeaveRoom(bool) = 0; virtual void EndGame() = 0; - virtual void SessionHasSpace(int) = 0; - virtual void SessionHasMii(int) = 0; + virtual bool SessionHasSpace(int) = 0; + virtual bool SessionHasMii(int) = 0; virtual void AddLocalPlayerByUserIndex(int) = 0; virtual void RemoveLocalPlayerByUserIndex(int) = 0; virtual void SendInviteGUI() = 0; - virtual void GetPlayerCount() = 0; - virtual void GetOnlinePlayerCount() = 0; - virtual void GetPlayerByIndex(int) = 0; - virtual void GetPlayerBySmallId(int) = 0; - virtual void GetPlayerByXuid(PlayerUID) = 0; + virtual int GetPlayerCount() = 0; + virtual int GetOnlinePlayerCount() = 0; + virtual NQRNetworkPlayer* GetPlayerByIndex(int) = 0; + virtual NQRNetworkPlayer* GetPlayerBySmallId(int) = 0; + virtual NQRNetworkPlayer* GetPlayerByXuid(PlayerUID) = 0; virtual void GetDisplayNameByGamertag(std::wstring) = 0; - virtual void GetLocalPlayerByUserIndex(int) = 0; - virtual void GetHostPlayer() = 0; + virtual NQRNetworkPlayer* GetLocalPlayerByUserIndex(int) = 0; + virtual NQRNetworkPlayer* GetHostPlayer() = 0; virtual void SetPresenceDataStartHostingGame() = 0; - virtual void GetJoiningReadyPercentage() = 0; + virtual int GetJoiningReadyPercentage() = 0; virtual void LocalDataSend(NQRNetworkPlayer*, NQRNetworkPlayer*, const void*, unsigned int) = 0; virtual void RemoteDataSend(NQRNetworkPlayer*, NQRNetworkPlayer*, const void*, unsigned int) = 0; virtual void GetSessionIndex(NQRNetworkPlayer*) = 0; virtual void TryToConnectOnline(int (*)(void*, bool, int), void*, bool) = 0; - virtual void isAdhocConnected() = 0; + virtual bool isAdhocConnected() = 0; virtual void connectToAdhoc() = 0; - virtual void isLanConnected() = 0; + virtual bool isLanConnected() = 0; }; diff --git a/src/PlatformLibraries_Source/NQRNetworkPlayer.h b/src/PlatformLibraries_Source/NQRNetworkPlayer.h new file mode 100644 index 00000000..00efa10d --- /dev/null +++ b/src/PlatformLibraries_Source/NQRNetworkPlayer.h @@ -0,0 +1,24 @@ +#pragma once + +#include "net/minecraft/world/PlayerUID.h" +class NQRNetworkPlayer { +public: + int GetCustomDataValue(); + int GetSmallId(); + void SendData(NQRNetworkPlayer*, const void*, unsigned int, bool); + bool IsSameSystem(NQRNetworkPlayer*); + int GetOutstandingAckCount(); + int GetSendQueueSizeBytes(); + int GetSendQueueSizeMessages(); + bool IsHost(); + PlayerUID GetUID(); + bool IsLocal(); + int GetSessionIndex(); + bool IsTalking(); + bool IsMutedByLocalUser(int); + bool HasVoice(); + int GetLocalPlayerIndex(); + std::wstring GetNetworkNameW(); + std::wstring GetMiiName(); + void SetUID(PlayerUID); +}; \ No newline at end of file diff --git a/src/PlatformLibraries_Source/Nintendo/NX/Network/CPlatformNetworkManagerNintendo.cpp b/src/PlatformLibraries_Source/Nintendo/NX/Network/CPlatformNetworkManagerNintendo.cpp new file mode 100644 index 00000000..9916fa47 --- /dev/null +++ b/src/PlatformLibraries_Source/Nintendo/NX/Network/CPlatformNetworkManagerNintendo.cpp @@ -0,0 +1,403 @@ +#include "INetworkPlayer.h" +#include "NQRNetworkManager.h" +#include "NQRNetworkPlayer.h" +#include "NX/Thread/C4JEventImpl.h" +#include "NX/Thread/C4JThreadImpl.h" +#include "Nintendo/NX/Network/CPlatformNetworkManagerNintendo.h" +#include "net/minecraft/client/CGameNetworkManager.h" +#include "net/minecraft/network/Socket.h" + +/*void CPlatformNetworkManagerNintendo::Initialise(CGameNetworkManager*, int) { + this->byte10 = 0; + this->byte13 = 0; + (*(void(__fastcall**)(__int64, _QWORD))(*(_QWORD*)CProfile::sInstance + 632LL))(CProfile::sInstance, 0LL); + this->word11 = 0; + this->byte12 = 0; + this->word14 = 0; + v6 = (NQRNetworkManager_NX*)operator new(0x1950u); + sub_71007D6B84(v6, (__int64)&this->Listener_VTable); + this->qword18 = v6; + v7 = operator new(0x1950u); + ZN26NQRNetworkManager_Adhoc_NXC_gen(v7, (__int64)&this->Listener_VTable); + this->qword20 = v7; + v8 = operator new(0x22C0u); + sub_71007CE934(v8, (__int64)&this->Listener_VTable); + qword_71017DB830 = v8; + v9 = (NQRNetworkManager_NX*)this->qword18; + this->mNQRNetworkManager = v9; + v9->VTable->Initialise(v9); + (*(void(__fastcall**)(_QWORD))(*(_QWORD*)this->qword20 + 24LL))(this->qword20); + (*(void(__fastcall**)(__int64))(*(_QWORD*)qword_71017DB830 + 24LL))(qword_71017DB830); + this->qword1E0 = a2; + this->dword58 = a3; + qword_71017DB838 = (__int64)this; + this->qword1E8 = 0LL; + this->qword1F0 = 0LL; + this->word50 = 0; + this->qword1F8 = 0LL; + this->qword200 = 0LL; + result = 1LL; + this->byte53 = 0; + this->byte55 = 0; + this->qword278 = 0LL; + this->qword280 = 0LL; + this->qword260 = 0LL; + this->qword268 = 0LL; + this->byte54 = 1; + this->byte274 = 0; +}*/ + +void CPlatformNetworkManagerNintendo::Terminate() { + this->m_mNqrNetworkManager->Terminate(); +} + +int CPlatformNetworkManagerNintendo::GetJoiningReadyPercentage() { + return this->m_mNqrNetworkManager->GetJoiningReadyPercentage(); +} + +int CPlatformNetworkManagerNintendo::CorrectErrorIDS(int errorIDS) { + return errorIDS; +} + +void CPlatformNetworkManagerNintendo::DoWork() { + this->TickSearch(); + + if (this->m_mRequestLeaveRoom) { + this->m_mNqrNetworkManager->LeaveRoom(this->m_byte54); + this->m_mRequestLeaveRoom = false; + } + this->m_mNqrNetworkManager->Tick(); + if (this->m_mRequestEnableAdhoc) { + this->setAdhocMode(true); + } else if (this->m_mRequestDisableAdhoc) { + this->setAdhocMode(false); + } else if (this->m_mRequestSignIn) { + this->setLanMode(true); + } else if (this->m_mRequestSignout) { + this->setLanMode(false); + } +} + +int CPlatformNetworkManagerNintendo::GetPlayerCount() { + return this->m_mNqrNetworkManager->GetPlayerCount(); +} + +int CPlatformNetworkManagerNintendo::GetOnlinePlayerCount() { + return this->m_mNqrNetworkManager->GetOnlinePlayerCount(); +} + +int CPlatformNetworkManagerNintendo::GetLocalPlayerMask(int mask) { + return 1 << mask; +} + +void CPlatformNetworkManagerNintendo::AddLocalPlayerByUserIndex(int index) { + this->m_mNqrNetworkManager->AddLocalPlayerByUserIndex(index); +} + +// NON_MATCHING: something is getting pushed on stack??? +void CPlatformNetworkManagerNintendo::RemoveLocalPlayerByUserIndex(int index) { + INetworkPlayer* netPlayer = getNetworkPlayer(this->m_mNqrNetworkManager->GetLocalPlayerByUserIndex(index)); + if (netPlayer) { + if (netPlayer->GetSocket()) { + C4JThreadImpl* thr = new C4JThreadImpl(RemovePlayerOnSocketClosedThreadProc, netPlayer, + "RemovePlayerOnSocketClosed", 0); + thr->SetProcessor(2); + thr->Run(); + } else { + this->m_mNqrNetworkManager->RemoveLocalPlayerByUserIndex(index); + } + } +} + +int CPlatformNetworkManagerNintendo::AddLocalPlayerByPlayerUID(PlayerUID) { + return 0; +} + +INetworkPlayer* CPlatformNetworkManagerNintendo::GetLocalPlayerByUserIndex(int index) { + return getNetworkPlayer(this->m_mNqrNetworkManager->GetLocalPlayerByUserIndex(index)); +} + +INetworkPlayer* CPlatformNetworkManagerNintendo::GetPlayerByIndex(int index) { + return getNetworkPlayer(this->m_mNqrNetworkManager->GetPlayerByIndex(index)); +} + +INetworkPlayer* CPlatformNetworkManagerNintendo::GetPlayerByXuid(PlayerUID uid) { + return getNetworkPlayer(this->m_mNqrNetworkManager->GetPlayerByXuid(uid)); +} + +INetworkPlayer* CPlatformNetworkManagerNintendo::GetPlayerBySmallId(unsigned char id) { + return getNetworkPlayer(this->m_mNqrNetworkManager->GetPlayerBySmallId(id)); +} + +bool CPlatformNetworkManagerNintendo::ShouldMessageForFullSession() { + return false; +} + +INetworkPlayer* CPlatformNetworkManagerNintendo::GetHostPlayer() { + return getNetworkPlayer(this->m_mNqrNetworkManager->GetHostPlayer()); +} + +bool CPlatformNetworkManagerNintendo::IsHost() { + if (this->m_mNqrNetworkManager->IsHost()) + return !this->m_byte53; + + return false; +} + +void CPlatformNetworkManagerNintendo::JoinGameFromInviteInfo(int, int a3, + const nn::friends::FriendPresence* a4) { + this->m_mNqrNetworkManager->JoinRoom(a3, a4); +} + +bool CPlatformNetworkManagerNintendo::LeaveGame(bool a2) { + if (this->m_mLeavingGame) + return true; + this->m_mLeavingGame = true; + INetworkPlayer* netPlayer = getNetworkPlayer( + this->m_mNqrNetworkManager->GetLocalPlayerByUserIndex(CGameNetworkManager::sInstance.GetPrimaryPad())); + if (netPlayer) { + Socket* socket = netPlayer->GetSocket(); + if (socket) { + socket->m_mEvent->WaitForSignal(-1); + if (this->IsInSession()) { + getNetworkPlayer(this->m_mNqrNetworkManager->GetLocalPlayerByUserIndex( + CGameNetworkManager::sInstance.GetPrimaryPad())) + ->SetSocket(nullptr); + } + delete socket; + } + } + if (this->m_mNqrNetworkManager->IsHost() && CGameNetworkManager::sInstance.ServerStoppedValid()) { + this->m_mNqrNetworkManager->EndGame(); + CGameNetworkManager::sInstance.ServerStoppedWait(); + CGameNetworkManager::sInstance.ServerStoppedDestroy(); + } + return this->_LeaveGame(a2, true); +} + +bool CPlatformNetworkManagerNintendo::IsInSession() { + return this->m_mNqrNetworkManager->IsInSession(); +} + +bool CPlatformNetworkManagerNintendo::IsInGameplay() { + return this->m_mNqrNetworkManager->GetState() == NQRNetworkManager::IN_GAMEPLAY; +} + +bool CPlatformNetworkManagerNintendo::IsReadyToPlayOrIdle() { + return this->m_mNqrNetworkManager->IsReadyToPlayOrIdle(); +} + +bool CPlatformNetworkManagerNintendo::IsInStatsEnabledSession() { + return true; +} + +bool CPlatformNetworkManagerNintendo::IsMatchmakingEnabled() { + return this->m_mNqrNetworkManager->IsMatchmakingEnabled(); +} + +bool CPlatformNetworkManagerNintendo::IsHandlingBootInvite() { + return this->m_mNqrNetworkManager->IsHandlingBootInvite(); +} + +bool CPlatformNetworkManagerNintendo::SessionHasSpace(unsigned int sessionId) { + return this->m_mNqrNetworkManager->SessionHasSpace(sessionId); +} + +/*bool CPlatformNetworkManagerNintendo::SessionHasMii(int sessionId) { + return this->mNQRNetworkManager->SessionHasMii(sessionId); +}*/ + +void CPlatformNetworkManagerNintendo::SendInviteGUI(int) { + this->m_mNqrNetworkManager->SendInviteGUI(); +} + +bool CPlatformNetworkManagerNintendo::IsAddingPlayer() { + return false; +} + +void CPlatformNetworkManagerNintendo::HostGame(int a2, bool onlineGame, bool privateGame, unsigned char a5, + EMiniGameId miniGameId, unsigned int a7, unsigned int* a8) { + this->SetLocalGame(!onlineGame); + this->SetPrivateGame(privateGame); + this->sub_71007C2578(); + this->m_bool5C = a7 != 0; + int playerMask = this->GetLocalPlayerMask(CGameNetworkManager::sInstance.GetPrimaryPad()) | a2; + this->_HostGame(playerMask, a5, miniGameId, a7, a8); +} + +int CPlatformNetworkManagerNintendo::JoinGame(FriendSessionInfo* info, int joiningPlayers, int, bool) { + int joiningCount = 0; + for (int i = 0; i < 4; i++) { + joiningCount += ((joiningPlayers >> i) & 1); + } + joiningCount += info->m_mCurrentPlayerCount; + + if (joiningCount <= CGameNetworkManager::sInstance.GetMaxPlayers(&info->m_mGameSessionData)) { + int ret = this->m_mNqrNetworkManager->JoinRoom(&info->m_mSearchResult, joiningPlayers); + return (ret & 1) == 0; + } + + return 2; +} + +// NON_MATCHING: logic should be the same though +bool CPlatformNetworkManagerNintendo::FindAndJoinGame(int joiningPlayers, int a3, EMiniGameId miniGameId, + unsigned int a5, unsigned int* a6, unsigned int* a7) { + CMatchMakeSearchParam searchParams; + + searchParams.m_params[0] = 0; + searchParams.m_params[1] = (miniGameId << 24) | 0x30780; + searchParams.m_params[2] = 0; + searchParams.m_params[3] = 1; + int joiningCount = 0; + for (int i = 0; i < 4; i++) { + joiningCount += ((joiningPlayers >> i) & 1); + } + searchParams.m_params[4] = joiningCount; + searchParams.m_params[5] = 5; + + int paramIndex = 6; + for (unsigned int i = 0; i < a5; ++i) { + searchParams.m_params[paramIndex] = a6[i]; + searchParams.m_params[paramIndex + 1] = a7[i] + 2; + + paramIndex += 3; + } + return !this->m_mNqrNetworkManager->FindAndJoinRoom(joiningPlayers, (a5 + 2), &searchParams, miniGameId); +} + +void CPlatformNetworkManagerNintendo::CancelJoinGame() {} + +bool CPlatformNetworkManagerNintendo::SetLocalGame(bool localGame) { + if (this->m_mNqrNetworkManager->GetState() == 2) + this->m_mLocalGame = localGame; + return true; +} + +bool CPlatformNetworkManagerNintendo::IsLocalGame() { + return this->m_mLocalGame; +} + +bool CPlatformNetworkManagerNintendo::SetPrivateGame(bool privateGame) { + return this->m_mPrivateGame = privateGame; +} + +bool CPlatformNetworkManagerNintendo::IsPrivateGame() { + return this->m_mPrivateGame; +} + +bool CPlatformNetworkManagerNintendo::IsLeavingGame() { + return this->m_mLeavingGame; +} + +void CPlatformNetworkManagerNintendo::ResetLeavingGame() { + this->m_mLeavingGame = false; +} + +void CPlatformNetworkManagerNintendo::RegisterPlayerChangedCallback(int playerId, + void (*)(void*, INetworkPlayer*, bool), + void*) { + // array stuff, but got really weak so gonnna leav it for futurte me +} + +void CPlatformNetworkManagerNintendo::UnRegisterPlayerChangedCallback(int playerId, + void (*)(void*, INetworkPlayer*, bool), + void*) {} + +void CPlatformNetworkManagerNintendo::HandleSignInChange() {} + +void CPlatformNetworkManagerNintendo::_RunNetworkGame() {} + +bool CPlatformNetworkManagerNintendo::_LeaveGame(bool, bool) {} + +void CPlatformNetworkManagerNintendo::_HostGame(int, unsigned char, EMiniGameId, unsigned int, + unsigned int*) {} + +void CPlatformNetworkManagerNintendo::_StartGame() {} + +void CPlatformNetworkManagerNintendo::UpdateAndSetGameSessionData(INetworkPlayer*) {} + +void CPlatformNetworkManagerNintendo::RemoveLocalPlayer(INetworkPlayer*) {} + +void CPlatformNetworkManagerNintendo::SystemFlagAddPlayer(INetworkPlayer*) {} + +void CPlatformNetworkManagerNintendo::SystemFlagSet(INetworkPlayer*, int) {} + +void CPlatformNetworkManagerNintendo::SystemFlagGet(INetworkPlayer*, int) {} + +void CPlatformNetworkManagerNintendo::SystemFlagClearAll(INetworkPlayer*) {} + +void CPlatformNetworkManagerNintendo::GatherStats() {} + +void CPlatformNetworkManagerNintendo::GatherRTTStats() {} + +void CPlatformNetworkManagerNintendo::SetSessionTexturePackParentId(int) {} + +void CPlatformNetworkManagerNintendo::SetSessionSubTexturePackId(int) {} + +void CPlatformNetworkManagerNintendo::SetSessionGameModeId(int) {} + +void CPlatformNetworkManagerNintendo::Notify(int, unsigned long) {} + +void CPlatformNetworkManagerNintendo::GetSessionList(int, int, bool) {} + +void CPlatformNetworkManagerNintendo::GetGameSessionInfo(int, unsigned int, FriendSessionInfo*) {} + +void CPlatformNetworkManagerNintendo::SetSessionsUpdatedCallback(void (*)(void*), void*) {} + +void CPlatformNetworkManagerNintendo::GetFullFriendSessionInfo(FriendSessionInfo*, void (*)(bool, void*), + void*) {} + +void CPlatformNetworkManagerNintendo::ForceFriendsSessionRefresh() {} + +void CPlatformNetworkManagerNintendo::ClearFriendsSessions() {} + +void CPlatformNetworkManagerNintendo::AlreadyInSession(const nn::friends::FriendPresence*) {} + +void CPlatformNetworkManagerNintendo::GetAgeRestricted() {} + +void CPlatformNetworkManagerNintendo::usingAdhocMode() {} + +void CPlatformNetworkManagerNintendo::setAdhocMode(bool) {} + +void CPlatformNetworkManagerNintendo::startAdhocMatching() {} + +bool CPlatformNetworkManagerNintendo::isAdhocConnected() {} + +void CPlatformNetworkManagerNintendo::connectToAdhoc() {} + +bool CPlatformNetworkManagerNintendo::isAdhocModeChangeInProgress() {} + +void CPlatformNetworkManagerNintendo::AttemptAdhocSignIn(int (*)(void*, bool, int), void*, bool) {} + +void CPlatformNetworkManagerNintendo::setLanMode(bool) {} + +void CPlatformNetworkManagerNintendo::usingLanMode() {} + +bool CPlatformNetworkManagerNintendo::isLanConnected() {} + +bool CPlatformNetworkManagerNintendo::isLanModeChangeInProgress() {} + +void CPlatformNetworkManagerNintendo::checkValidInviteData(const nn::friends::FriendPresence*) {} + +void CPlatformNetworkManagerNintendo::SetExitAndJoinFromInviteInProgress(bool) {} + +void CPlatformNetworkManagerNintendo::CancelDisconnectFromExitAndJoin() {} + +void CPlatformNetworkManagerNintendo::FakeLocalPlayerJoined() {} + +void CPlatformNetworkManagerNintendo::GetDisplayNameByGamertag(std::wstring) {} + +void CPlatformNetworkManagerNintendo::GetOutstandingAckCount(INetworkPlayer*) {} + +void CPlatformNetworkManagerNintendo::TryToConnectOnline(int (*)(void*, bool, int), void*, bool) {} + +void CPlatformNetworkManagerNintendo::AttemptPSNSignIn(int (*)(void*, bool, int), void*, bool, int) {} + +void CPlatformNetworkManagerNintendo::RecvInviteGUI() {} + +void CPlatformNetworkManagerNintendo::UpdateInviteData(void*) {} + +void CPlatformNetworkManagerNintendo::CheckFriendsCanPlay(int, int&, + std::shared_ptr, int, + int&, int&, int&, int&) {} diff --git a/src/PlatformLibraries_Source/Nintendo/NX/Network/CPlatformNetworkManagerNintendo.h b/src/PlatformLibraries_Source/Nintendo/NX/Network/CPlatformNetworkManagerNintendo.h new file mode 100644 index 00000000..a155e8f0 --- /dev/null +++ b/src/PlatformLibraries_Source/Nintendo/NX/Network/CPlatformNetworkManagerNintendo.h @@ -0,0 +1,148 @@ +#include "CPlatformNetworkManager.h" +#include "INQRNetworkManagerListener.h" +#include "Nintendo/NX/Network/NQRNetworkManager_NX.h" + +class CPlatformNetworkManagerNintendo : public CPlatformNetworkManager, protected INQRNetworkManagerListener { +public: + class PlayerFlags {}; + + static INetworkPlayer* getNetworkPlayer(NQRNetworkPlayer*); + static int RemovePlayerOnSocketClosedThreadProc(void*); + + void TickSearch(); + void sub_71007C2578(); + + void Initialise(CGameNetworkManager*, int) override; + void Terminate() override; + int GetJoiningReadyPercentage() override; + int CorrectErrorIDS(int) override; + void DoWork() override; + int GetPlayerCount() override; + int GetOnlinePlayerCount() override; + int GetLocalPlayerMask(int) override; + void AddLocalPlayerByUserIndex(int) override; + void RemoveLocalPlayerByUserIndex(int) override; + int AddLocalPlayerByPlayerUID(PlayerUID) override; + INetworkPlayer* GetLocalPlayerByUserIndex(int) override; + INetworkPlayer* GetPlayerByIndex(int) override; + INetworkPlayer* GetPlayerByXuid(PlayerUID) override; + INetworkPlayer* GetPlayerBySmallId(unsigned char) override; + bool ShouldMessageForFullSession() override; + INetworkPlayer* GetHostPlayer() override; + bool IsHost() override; + void JoinGameFromInviteInfo(int, int, const nn::friends::FriendPresence*) override; + bool LeaveGame(bool) override; + bool IsInSession() override; + bool IsInGameplay() override; + bool IsReadyToPlayOrIdle() override; + bool IsInStatsEnabledSession() override; + bool IsMatchmakingEnabled() override; + bool IsHandlingBootInvite() override; + bool SessionHasSpace(unsigned int) override; + // bool SessionHasMii(int) override; + void SendInviteGUI(int) override; + bool IsAddingPlayer() override; + void HostGame(int, bool, bool, unsigned char, EMiniGameId, unsigned int, unsigned int*) override; + int JoinGame(FriendSessionInfo*, int, int, bool) override; + bool FindAndJoinGame(int, int, EMiniGameId, unsigned int, unsigned int*, unsigned int*) override; + void CancelJoinGame() override; + bool SetLocalGame(bool) override; + bool IsLocalGame() override; + bool SetPrivateGame(bool) override; + bool IsPrivateGame() override; + bool IsLeavingGame() override; + void ResetLeavingGame() override; + void RegisterPlayerChangedCallback(int, void (*)(void*, INetworkPlayer*, bool), void*) override; + void UnRegisterPlayerChangedCallback(int, void (*)(void*, INetworkPlayer*, bool), void*) override; + void HandleSignInChange() override; + void _RunNetworkGame() override; + bool _LeaveGame(bool, bool) override; + void _HostGame(int, unsigned char, EMiniGameId, unsigned int, unsigned int*) override; + void _StartGame() override; + void UpdateAndSetGameSessionData(INetworkPlayer*) override; + void RemoveLocalPlayer(INetworkPlayer*) override; + void SystemFlagAddPlayer(INetworkPlayer*) override; + void SystemFlagSet(INetworkPlayer*, int) override; + void SystemFlagGet(INetworkPlayer*, int) override; + void SystemFlagClearAll(INetworkPlayer*) override; + void GatherStats() override; + void GatherRTTStats() override; + void SetSessionTexturePackParentId(int) override; + void SetSessionSubTexturePackId(int) override; + void SetSessionGameModeId(int) override; + void Notify(int, unsigned long) override; + void GetSessionList(int, int, bool) override; + void GetGameSessionInfo(int, unsigned int, FriendSessionInfo*) override; + void SetSessionsUpdatedCallback(void (*)(void*), void*) override; + void GetFullFriendSessionInfo(FriendSessionInfo*, void (*)(bool, void*), void*) override; + void ForceFriendsSessionRefresh() override; + void ClearFriendsSessions() override; + void AlreadyInSession(const nn::friends::FriendPresence*) override; + void GetAgeRestricted() override; + void usingAdhocMode() override; + void setAdhocMode(bool) override; + void startAdhocMatching() override; + bool isAdhocConnected() override; + void connectToAdhoc() override; + bool isAdhocModeChangeInProgress() override; + void AttemptAdhocSignIn(int (*)(void*, bool, int), void*, bool) override; + void setLanMode(bool) override; + void usingLanMode() override; + bool isLanConnected() override; + bool isLanModeChangeInProgress() override; + void checkValidInviteData(const nn::friends::FriendPresence*) override; + void SetExitAndJoinFromInviteInProgress(bool) override; + void CancelDisconnectFromExitAndJoin() override; + void FakeLocalPlayerJoined() override; + void GetDisplayNameByGamertag(std::wstring) override; + void GetOutstandingAckCount(INetworkPlayer*) override; + void TryToConnectOnline(int (*)(void*, bool, int), void*, bool) override; + void AttemptPSNSignIn(int (*)(void*, bool, int), void*, bool, int) override; + void RecvInviteGUI() override; + void UpdateInviteData(void*) override; + void CheckFriendsCanPlay(int, int&, std::shared_ptr, int, int&, int&, int&, + int&) override; + ~CPlatformNetworkManagerNintendo(); + + char m_byte10; + bool m_mRequestEnableAdhoc; + bool m_mRequestDisableAdhoc; + char m_mByte13; + bool m_mRequestSignIn; + bool m_mRequestSignout; + void* m_qword18; + void* m_qword20; + NQRNetworkManager_NX* m_mNqrNetworkManager; + void* m_qword30; + std::vector m_mPlayers; + bool m_mLeavingGame; + bool m_mRequestLeaveRoom; + char m_gap52; + bool m_byte53; + bool m_byte54; + bool m_mLocalGame; + bool m_mPrivateGame; + int m_dword58; + bool m_bool5C; + char m_gap5C[387]; + void* m_qword1E0; // 480 + void* m_qword1E8; + void* m_qword1F0; + void* m_qword1F8; + void* m_qword200; + void* m_qword208; + void* m_qword210; + void* m_qword218; + void* m_qword220; + std::vector m_mPlayerFlags; + void* m_qword240; + std::vector m_mFriendSessionInfos; + void* m_qword260; + void* m_qword268; + char m_gap270[4]; + char m_byte274; + void* m_qword278; + void* m_qword280; + void* m_qword288; + std::vector m_mNetworkPlayers; +}; \ No newline at end of file diff --git a/src/PlatformLibraries_Source/Nintendo/NX/Network/NQRNetworkManager_NX.cpp b/src/PlatformLibraries_Source/Nintendo/NX/Network/NQRNetworkManager_NX.cpp new file mode 100644 index 00000000..c9d4b7bf --- /dev/null +++ b/src/PlatformLibraries_Source/Nintendo/NX/Network/NQRNetworkManager_NX.cpp @@ -0,0 +1 @@ +#include "PlatformLibraries_Source/Nintendo/NX/Network/NQRNetworkManager_NX.h" \ No newline at end of file diff --git a/src/PlatformLibraries_Source/Nintendo/NX/Network/NQRNetworkManager_NX.h b/src/PlatformLibraries_Source/Nintendo/NX/Network/NQRNetworkManager_NX.h index d1237f2f..9b4489f1 100644 --- a/src/PlatformLibraries_Source/Nintendo/NX/Network/NQRNetworkManager_NX.h +++ b/src/PlatformLibraries_Source/Nintendo/NX/Network/NQRNetworkManager_NX.h @@ -4,52 +4,54 @@ class NQRNetworkManager_NX : public NQRNetworkManager { public: + static bool IsHandlingBootInvite(); + ~NQRNetworkManager_NX() override; void Tick() override; void Initialise() override; void Terminate() override; - void GetState() override; - void IsHost() override; - void IsReadyToPlayOrIdle() override; - void IsInSession() override; - void IsMatchmakingEnabled() override; + eNQRNetworkManagerState GetState() override; + bool IsHost() override; + bool IsReadyToPlayOrIdle() override; + bool IsInSession() override; + bool IsMatchmakingEnabled() override; void CreateAndJoinRoom(int, int, void*, int, int*, int, bool, unsigned char) override; void UpdateExternalRoomData() override; - void FriendRoomManagerIsBusy() override; + bool FriendRoomManagerIsBusy() override; void FriendRoomManagerSearch() override; void FriendRoomManagerSearch2() override; void FriendRoomManagerGetCount() override; void FriendRoomManagerGetRoomInfo(int, NQRNetworkManager::SessionSearchResult*) override; - void JoinRoom(NQRNetworkManager::SessionSearchResult*, int) override; + int JoinRoom(NQRNetworkManager::SessionSearchResult*, int) override; + bool FriendPresenceUpdatedRoomList() override; + void GetFriendRoomSearchResults(int*) override; void JoinRoom(unsigned int, int, const NQRNetworkManager::PresenceSyncInfo*) override; void JoinRoom(int, const nn::friends::FriendPresence*) override; - void FriendPresenceUpdatedRoomList() override; - void GetFriendRoomSearchResults(int*) override; void GetExtDataForRoom(unsigned int, void*, void (*)(bool, void*), void*) override; - void FindAndJoinRoom(int, unsigned int, CMatchMakeSearchParam*, unsigned char) override; + bool FindAndJoinRoom(int, unsigned int, CMatchMakeSearchParam*, unsigned char) override; void StartGame() override; void LeaveRoom(bool) override; void EndGame() override; - void SessionHasSpace(int) override; - void SessionHasMii(int) override; + bool SessionHasSpace(int) override; + bool SessionHasMii(int) override; void AddLocalPlayerByUserIndex(int) override; void RemoveLocalPlayerByUserIndex(int) override; void SendInviteGUI() override; - void GetPlayerCount() override; - void GetOnlinePlayerCount() override; - void GetPlayerByIndex(int) override; - void GetPlayerBySmallId(int) override; - void GetPlayerByXuid(PlayerUID) override; + int GetPlayerCount() override; + int GetOnlinePlayerCount() override; + NQRNetworkPlayer* GetPlayerByIndex(int) override; + NQRNetworkPlayer* GetPlayerBySmallId(int) override; + NQRNetworkPlayer* GetPlayerByXuid(PlayerUID) override; void GetDisplayNameByGamertag(std::wstring) override; - void GetLocalPlayerByUserIndex(int) override; - void GetHostPlayer() override; + NQRNetworkPlayer* GetLocalPlayerByUserIndex(int) override; + NQRNetworkPlayer* GetHostPlayer() override; void SetPresenceDataStartHostingGame() override; - void GetJoiningReadyPercentage() override; + int GetJoiningReadyPercentage() override; void LocalDataSend(NQRNetworkPlayer*, NQRNetworkPlayer*, const void*, unsigned int) override; void RemoteDataSend(NQRNetworkPlayer*, NQRNetworkPlayer*, const void*, unsigned int) override; void GetSessionIndex(NQRNetworkPlayer*) override; void TryToConnectOnline(int (*)(void*, bool, int), void*, bool) override; - void isAdhocConnected() override; + bool isAdhocConnected() override; void connectToAdhoc() override; - void isLanConnected() override; + bool isLanConnected() override; }; diff --git a/src/PlatformLibraries_Source/Nintendo/NX/Network/NetworkPlayerNintendo.cpp b/src/PlatformLibraries_Source/Nintendo/NX/Network/NetworkPlayerNintendo.cpp new file mode 100644 index 00000000..98e8f063 --- /dev/null +++ b/src/PlatformLibraries_Source/Nintendo/NX/Network/NetworkPlayerNintendo.cpp @@ -0,0 +1,130 @@ +#include "INetworkPlayer.h" +#include "NQRNetworkPlayer.h" +#include "PlatformLibraries_Source/Nintendo/NX/Network/NetworkPlayerNintendo.h" +#include "net/minecraft/core/System.h" +#include + +NetworkPlayerNintendo::NetworkPlayerNintendo(NQRNetworkPlayer* netPlayer) : INetworkPlayer() { + this->m_mSocket = nullptr; + this->m_mLastChunkPacketMs = 0; + this->m_mQNetPlayer = netPlayer; +} + +int NetworkPlayerNintendo::GetSmallId() { + return this->m_mQNetPlayer->GetSmallId(); +} + +void NetworkPlayerNintendo::SendData(INetworkPlayer* player, const void* data, int size, bool reliable, + bool ordered) { + this->m_mQNetPlayer->SendData(((NetworkPlayerNintendo*)player)->m_mQNetPlayer, data, size, ordered); +} + +bool NetworkPlayerNintendo::IsSameSystem(INetworkPlayer* player) { + // it's either that member variables are part of interface, or they are casting it like i'm doing rn + return this->m_mQNetPlayer->IsSameSystem(((NetworkPlayerNintendo*)player)->m_mQNetPlayer); +} + +int NetworkPlayerNintendo::GetOutstandingAckCount() { + return this->m_mQNetPlayer->GetOutstandingAckCount(); +} + +int NetworkPlayerNintendo::GetSinglePlayerOutstandingAckCount() { + return 0; +} + +void NetworkPlayerNintendo::DecrementAcksOutstanding() {} + +int NetworkPlayerNintendo::GetSendQueueSizeBytes(INetworkPlayer* player, bool includeOverhead) { + return this->m_mQNetPlayer->GetSendQueueSizeBytes(); +} + +int NetworkPlayerNintendo::GetSendQueueSizeMessages(INetworkPlayer* player, bool includeOverhead) { + return this->m_mQNetPlayer->GetSendQueueSizeMessages(); +} + +int NetworkPlayerNintendo::GetCurrentRtt() { + return 0; +} + +bool NetworkPlayerNintendo::IsHost() { + return this->m_mQNetPlayer->IsHost(); +} + +// NON_MATCHING: correct PlayerUID struct +bool NetworkPlayerNintendo::IsGuest() { + return (this->m_mQNetPlayer->GetUID().m_gap0 & 2) >> 1; +} + +bool NetworkPlayerNintendo::IsLocal() { + return this->m_mQNetPlayer->IsLocal(); +} + +int NetworkPlayerNintendo::GetSessionIndex() { + return this->m_mQNetPlayer->GetSessionIndex(); +} + +bool NetworkPlayerNintendo::IsTalking() { + return this->m_mQNetPlayer->IsTalking(); +} + +bool NetworkPlayerNintendo::IsMutedByLocalUser(int userIndex) { + return this->m_mQNetPlayer->IsMutedByLocalUser(userIndex); +} + +bool NetworkPlayerNintendo::HasVoice() { + return this->m_mQNetPlayer->HasVoice(); +} + +bool NetworkPlayerNintendo::HasCamera() { + return false; +} + +int NetworkPlayerNintendo::GetUserIndex() { + return this->m_mQNetPlayer->GetLocalPlayerIndex(); +} + +void NetworkPlayerNintendo::SetSocket(Socket* socket) { + this->m_mSocket = socket; +} + +Socket* NetworkPlayerNintendo::GetSocket() { + return this->m_mSocket; +} + +std::wstring NetworkPlayerNintendo::GetOnlineName() { + return this->m_mQNetPlayer->GetNetworkNameW(); +} + +std::wstring NetworkPlayerNintendo::GetDisplayName() { + if (this->IsLocal()) + return this->GetMiiName(); + + return this->GetOnlineName(); +} + +PlayerUID NetworkPlayerNintendo::GetUID() { + return this->m_mQNetPlayer->GetUID(); +} + +void NetworkPlayerNintendo::SetUID(PlayerUID uid) { + this->m_mQNetPlayer->SetUID(uid); +} + +void NetworkPlayerNintendo::SentChunkPacket() { + this->m_mLastChunkPacketMs = System::processTimeInMilliSecs(); +} + +int NetworkPlayerNintendo::GetTimeSinceLastChunkPacket_ms() { + if (this->m_mLastChunkPacketMs) + return System::processTimeInMilliSecs() - this->m_mLastChunkPacketMs; + else + return 0x7fffffff; +} + +bool NetworkPlayerNintendo::isFake() { + return false; +} + +NQRNetworkPlayer* NetworkPlayerNintendo::GetQNetPlayer() { + return this->m_mQNetPlayer; +} diff --git a/src/PlatformLibraries_Source/Nintendo/NX/Network/NetworkPlayerNintendo.h b/src/PlatformLibraries_Source/Nintendo/NX/Network/NetworkPlayerNintendo.h new file mode 100644 index 00000000..1a9c93a5 --- /dev/null +++ b/src/PlatformLibraries_Source/Nintendo/NX/Network/NetworkPlayerNintendo.h @@ -0,0 +1,44 @@ +#pragma once + +#include "INetworkPlayer.h" + +class NetworkPlayerNintendo : public INetworkPlayer { +public: + NetworkPlayerNintendo(NQRNetworkPlayer*); + + // symbol from WiiU let's assuem it's the same + const wchar_t* GetMiiName(); + + int GetSmallId() override; + void SendData(INetworkPlayer* player, const void* data, int size, bool reliable, bool ordered) override; + bool IsSameSystem(INetworkPlayer* player) override; + int GetOutstandingAckCount() override; + int GetSinglePlayerOutstandingAckCount() override; + void DecrementAcksOutstanding() override; + int GetSendQueueSizeBytes(INetworkPlayer* player, bool includeOverhead) override; + int GetSendQueueSizeMessages(INetworkPlayer* player, bool includeOverhead) override; + int GetCurrentRtt() override; + bool IsHost() override; + bool IsGuest() override; + bool IsLocal() override; + int GetSessionIndex() override; + bool IsTalking() override; + bool IsMutedByLocalUser(int userIndex) override; + bool HasVoice() override; + bool HasCamera() override; + int GetUserIndex() override; + void SetSocket(Socket* socket) override; + Socket* GetSocket() override; + std::wstring GetOnlineName() override; + std::wstring GetDisplayName() override; + PlayerUID GetUID() override; + void SetUID(PlayerUID uid) override; + void SentChunkPacket() override; + int GetTimeSinceLastChunkPacket_ms() override; + bool isFake() override; + NQRNetworkPlayer* GetQNetPlayer() override; + + NQRNetworkPlayer* m_mQNetPlayer; + Socket* m_mSocket; + long m_mLastChunkPacketMs; +}; \ No newline at end of file