11package huix .infinity .common .world .curse ;
22
3+ import huix .infinity .common .core .tag .IFWItemTags ;
34import huix .infinity .common .world .item .IFWItems ;
45import huix .infinity .extension .func .PlayerExtension ;
6+ import huix .infinity .init .event .IFWSoundEvents ;
57import huix .infinity .network .ClientBoundSetCursePayload ;
68import huix .infinity .util .ReflectHelper ;
9+ import net .minecraft .core .Holder ;
10+ import net .minecraft .core .registries .BuiltInRegistries ;
711import net .minecraft .server .level .ServerPlayer ;
12+ import net .minecraft .sounds .SoundSource ;
13+ import net .minecraft .tags .FluidTags ;
14+ import net .minecraft .world .entity .monster .EnderMan ;
815import net .minecraft .world .entity .player .Player ;
16+ import net .minecraft .world .item .Item ;
917import net .minecraft .world .item .ItemStack ;
18+ import net .minecraft .world .level .block .Block ;
1019import net .neoforged .neoforge .network .PacketDistributor ;
1120
1221public class CurseEffectHelper {
@@ -51,4 +60,76 @@ public static void learnCurseEffect(PlayerExtension ext) {
5160 }
5261 }
5362 }
63+
64+ public static boolean shouldBlockSprint (Player player ) {
65+ if (!(player instanceof PlayerExtension ext )) return false ;
66+ if (ext .getCurse () == CurseType .cannot_run ) {
67+ learnCurseEffect (ext );
68+ return true ;
69+ }
70+ return false ;
71+ }
72+
73+ public static int getCursedMaxAirSupply (Player player , int vanillaMaxAir ) {
74+ if (!(player instanceof PlayerExtension ext )) return vanillaMaxAir ;
75+ if (ext .getCurse () == CurseType .cannot_hold_breath ) {
76+ return 90 ;
77+ }
78+ return vanillaMaxAir ;
79+ }
80+
81+ public static int getCursedAirSupply (Player player , int vanillaAir ) {
82+ if (!(player instanceof PlayerExtension ext )) return vanillaAir ;
83+ if (ext .getCurse () == CurseType .cannot_hold_breath && player .isEyeInFluid (FluidTags .WATER )) {
84+ learnCurseEffect (ext );
85+ return 90 ;
86+ }
87+ return vanillaAir ;
88+ }
89+
90+ public static int getCursedBubbleMax (Player player , int vanillaBubbleMax , int maxAirSupply ) {
91+ if (!(player instanceof PlayerExtension ext )) return vanillaBubbleMax ;
92+ if (ext .getCurse () == CurseType .cannot_hold_breath ) {
93+ return Math .max (1 , maxAirSupply / 30 );
94+ }
95+ return vanillaBubbleMax ;
96+ }
97+
98+ public static boolean handleChestCurse (Player player , Block block ) {
99+ if (!(player instanceof PlayerExtension ext )) return false ;
100+ if (ext .getCurse () == CurseType .cannot_open_chests ) {
101+ Item item = Item .BY_BLOCK .get (block );
102+ if (item != null ) {
103+ Holder <Item > holder = BuiltInRegistries .ITEM .wrapAsHolder (item );
104+ if (holder .is (IFWItemTags .CHESTS )) {
105+ learnCurseEffect (ext );
106+ player .level ().playSound (null , player .getX (), player .getY (), player .getZ (), IFWSoundEvents .CHEST_LOCKED .get (), SoundSource .BLOCKS , 0.2F , 1.0F );
107+ return true ;
108+ }
109+ }
110+ }
111+ return false ;
112+ }
113+
114+ public static void handleEndermanAggro (EnderMan enderman ) {
115+ PlayerExtension nearestExt = null ;
116+ Player nearestPlayer = null ;
117+ double nearestDist = Double .MAX_VALUE ;
118+ for (Player player : enderman .level ().players ()) {
119+ if (player instanceof PlayerExtension ext && ext .getCurse () == CurseType .endermen_aggro ) {
120+ double dist = enderman .distanceTo (player );
121+ if (dist < nearestDist ) {
122+ nearestDist = dist ;
123+ nearestPlayer = player ;
124+ nearestExt = ext ;
125+ }
126+ }
127+ }
128+ if (nearestPlayer != null ) {
129+ enderman .setTarget (nearestPlayer );
130+ if (enderman .getTarget () == nearestPlayer ) {
131+ learnCurseEffect (nearestExt );
132+ }
133+ }
134+ }
54135}
0 commit comments