Jump to content

[1.15] performEffect does not work


Zemelua

Recommended Posts

public class ModEffect extends Effect {

	protected ModEffect(EffectType typeIn, int liquidColorIn) {
		super(typeIn, liquidColorIn);
	}

	@Override
	public void performEffect(LivingEntity entityLivingBaseIn, int amplifier) {
		if (this == DepressionModRegistry.INSTANT_ANTIDEPRESSANT.get()) {
			LazyOptional<PlayerMentalInterface> cap = ((PlayerEntity)entityLivingBaseIn).getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY);
			int currentMental = 0;
			try {
				currentMental = cap.orElseThrow(IllegalAccessException::new).getMental();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
			int _currentMental = currentMental + 3;
			if (_currentMental > 20) {
				_currentMental = 20;
			}
			try {
				cap.orElseThrow(IllegalAccessException::new).setMental(_currentMental);
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
	}
}
public class DepressionModRegistry {

		//EffectRegistry
		public static final DeferredRegister<Effect> EFFECTS = DeferredRegister.create(ForgeRegistries.POTIONS, DepressionMod.MOD_ID);

		public static final RegistryObject<Effect> INSTANT_ANTIDEPRESSANT = EFFECTS.register("instant_antidepressant", () -> new InstantEffect(EffectType.BENEFICIAL, 123456));

		//PotionRegistry
		public static final DeferredRegister<Potion> POTIONS = DeferredRegister.create(ForgeRegistries.POTION_TYPES, DepressionMod.MOD_ID);

		public static final RegistryObject<Potion> BRON = POTIONS.register("bron", () -> new Potion(new EffectInstance(Effects.LEVITATION, 120), new EffectInstance(Effects.JUMP_BOOST, 3600, 2), new EffectInstance(Effects.SLOW_FALLING, 3600), new EffectInstance(INSTANT_ANTIDEPRESSANT.get(), 1)));

		//RecipeRegistry
		public static void addRecipes() {
			BrewingRecipeRegistry.addRecipe(new PotionRecipe(Lazy.concurrentOf(() -> Potions.AWKWARD), Ingredient.fromItems(Items.SUNFLOWER), Lazy.concurrentOf(() -> BRON.get())));
		}
	}

In the code above, I've succeeded in implementing potions and effects, but I can't get the effect's effect to work. Specifically, it increases the capacity value by a certain amount, similar to instant health. It has also been confirmed that the capabilities are properly implemented. It just seems to me that performEffect isn't working.

Link to comment
Share on other sites

public class ModEffect extends InstantEffect {

	protected ModEffect(EffectType typeIn, int liquidColorIn) {
		super(typeIn, liquidColorIn);
	}

	@Override
	public void affectEntity(@Nullable Entity source, @Nullable Entity indirectSource, LivingEntity entityLivingBaseIn, int amplifier, double health) {
		if (this == DepressionModRegistry.INSTANT_ANTIDEPRESSANT.get()) {
			this.performEffect(entityLivingBaseIn, amplifier);
		}
	}
	
	@Override
	public void performEffect(LivingEntity entityLivingBaseIn, int amplifier) {
		if (this == DepressionModRegistry.INSTANT_ANTIDEPRESSANT.get()) {
			LazyOptional<PlayerMentalInterface> cap = ((PlayerEntity)entityLivingBaseIn).getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY);
			int currentMental = 0;
			try {
				currentMental = cap.orElseThrow(IllegalAccessException::new).getMental();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
			int _currentMental = currentMental + 3;
			if (_currentMental > 20) {
				_currentMental = 20;
			}
			try {
				cap.orElseThrow(IllegalAccessException::new).setMental(_currentMental);
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
	}
}

I extended InstantEffect and override affectEntity, but it's still not working.

Link to comment
Share on other sites

public class ModEffect extends InstantEffect {

	public ModEffect(EffectType typeIn, int liquidColorIn) {
		super(typeIn, liquidColorIn);
	}

	@Override
	public void performEffect(LivingEntity entityLivingBaseIn, int amplifier) {
		if (entityLivingBaseIn instanceof PlayerEntity) {
			LazyOptional<PlayerMentalInterface> cap = ((PlayerEntity)entityLivingBaseIn).getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY);
			int currentMental = cap.ifPresent(f -> f.getMental());  //<-here
			int _currentMental = currentMental + 3;
		//if (_currentMental > 20) {
		//	_currentMental = 20;
		//}
			cap.ifPresent(f -> f.setMental(_currentMental));
		}
	}

	@Override
	public void affectEntity(@Nullable Entity source, @Nullable Entity indirectSource, LivingEntity entityLivingBaseIn, int amplifier, double health) {
		this.performEffect(entityLivingBaseIn, amplifier);
	}
}

I've improved the code, but I don't know how to use ifPresent with getMental ().

The code can be found at https://github.com/Zemelua/Depression-Mod . I haven't updated it yet, but I have a complete implementation of capability.

Edited by Zemelua
Link to comment
Share on other sites

1 hour ago, Zemelua said:

I've improved the code, but I don't know how to use ifPresent with getMental ().

Of course that won't work, since ifPresent() returns void. Why not put all code that needs access to your capability in the consumer in ifPresent()?

 

Basic Java stuff like this is best to know before going into modding, which is why I would strongly encourage you to take a few weeks off modding and take that time to learn the basics of Java. 

Link to comment
Share on other sites

I'm sorry. Since I am learning java in parallel with modding (such as learning java code that got stuck in modding at that time), I am aware that there is a part that is not learned enough. This time, I asked a question because I misunderstood that the cause was not in java. I'm sorry.

	@Override
	public void performEffect(LivingEntity entityLivingBaseIn, int amplifier) {
		if (entityLivingBaseIn instanceof PlayerEntity) {
			System.out.print("test");
			LazyOptional<PlayerMentalInterface> cap = ((PlayerEntity)entityLivingBaseIn).getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY);
			cap.ifPresent(f ->
				f.setMental(f.getMental() + 3)
			);

Well, I've fixed the code and I think this is the correct java code, but it doesn't work. Is this also a java issue?

Edited by Zemelua
Link to comment
Share on other sites

You haven't answered either of my two questions. How are you viewing the data? If you're grabbing it from the logical server, it will be present. However, the logical client would need to have the information synced across the two threads.

 

You also only attach the capability on the client player meaning that it will never be stored or found on the server. This means that nothing in your above code will work.

Link to comment
Share on other sites

I'm sorry. I forgot to answer. The data is displayed as a HUD in the client / gui / MentalOverlayHandler. (This has already been successful.) The current ultimate goal is to increase the value of capacity by drinking potions, and reflect that in the HUD. The code doesn't reflect the potion and effect code yet, but it's here. https://github.com/Zemelua/Depression-Mod

Link to comment
Share on other sites

1 hour ago, ChampionAsh5357 said:

You also only attach the capability on the client player meaning that it will never be stored or found on the server. This means that nothing in your above code will work.

Along with what I already mentioned, you need to sync the data to the logical client with a packet whenever the value changes.

Link to comment
Share on other sites

	@Override
	public void performEffect(LivingEntity entityLivingBaseIn, int amplifier) {
		if (entityLivingBaseIn instanceof PlayerEntity) {
			System.out.print("test");
			LazyOptional<PlayerMentalInterface> cap = ((PlayerEntity)entityLivingBaseIn).getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY);
			cap.ifPresent(f -> {
				int _currentMental = f.getMental() + 3;
				f.setMental(_currentMental);
				DepressionModPacketHandler.sendToClient(new PlayerMentalCapabilityMessage(_currentMental), (PlayerEntity) entityLivingBaseIn);
			});
		}
	}

I've improved the code, but it crashed when I drank a potion. I don't know the cause, so can you tell me? The crash report is below.

 

 

---- Minecraft Crash Report ----
// Shall we play a game?

Time: 20/10/26 3:40
Description: Ticking player

java.lang.ClassCastException: net.minecraftforge.common.util.LazyOptional cannot be cast to depression_mod.capability.mentalpoint.PlayerMentalInterface
    at depression_mod.network.PlayerMentalCapabilityMessage.<init>(PlayerMentalCapabilityMessage.java:19) ~[?:?] {re:classloading}
    at depression_mod.potion.ModEffect.lambda$0(ModEffect.java:30) ~[?:?] {re:classloading}
    at net.minecraftforge.common.util.LazyOptional.ifPresent(LazyOptional.java:161) ~[?:?] {re:classloading}
    at depression_mod.potion.ModEffect.performEffect(ModEffect.java:27) ~[?:?] {re:classloading}
    at depression_mod.potion.ModEffect.affectEntity(ModEffect.java:37) ~[?:?] {re:classloading}
    at net.minecraft.item.PotionItem.onItemUseFinish(PotionItem.java:47) ~[?:?] {re:classloading}
    at net.minecraft.item.ItemStack.onItemUseFinish(ItemStack.java:213) ~[?:?] {re:classloading}
    at net.minecraft.entity.LivingEntity.onItemUseFinish(LivingEntity.java:2876) ~[?:?] {re:classloading}
    at net.minecraft.entity.player.ServerPlayerEntity.onItemUseFinish(ServerPlayerEntity.java:1027) ~[?:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.entity.LivingEntity.updateActiveHand(LivingEntity.java:2754) ~[?:?] {re:classloading}
    at net.minecraft.entity.LivingEntity.tick(LivingEntity.java:2185) ~[?:?] {re:classloading}
    at net.minecraft.entity.player.PlayerEntity.tick(PlayerEntity.java:237) ~[?:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.entity.player.ServerPlayerEntity.playerTick(ServerPlayerEntity.java:379) ~[?:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.network.play.ServerPlayNetHandler.tick(ServerPlayNetHandler.java:188) ~[?:?] {re:classloading}
    at net.minecraft.network.NetworkManager.tick(NetworkManager.java:250) ~[?:?] {re:classloading}
    at net.minecraft.network.NetworkSystem.tick(NetworkSystem.java:152) ~[?:?] {re:classloading}
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:903) ~[?:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:821) ~[?:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120) ~[?:?] {re:classloading,pl:runtimedistcleaner:A}
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:662) [?:?] {re:classloading,pl:accesstransformer:B}
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261] {}


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Thread: Server thread
Stacktrace:
    at depression_mod.network.PlayerMentalCapabilityMessage.<init>(PlayerMentalCapabilityMessage.java:19)
    at depression_mod.potion.ModEffect.lambda$0(ModEffect.java:30)
    at net.minecraftforge.common.util.LazyOptional.ifPresent(LazyOptional.java:161)
    at depression_mod.potion.ModEffect.performEffect(ModEffect.java:27)
    at depression_mod.potion.ModEffect.affectEntity(ModEffect.java:37)
    at net.minecraft.item.PotionItem.onItemUseFinish(PotionItem.java:47)
    at net.minecraft.item.ItemStack.onItemUseFinish(ItemStack.java:213)
    at net.minecraft.entity.LivingEntity.onItemUseFinish(LivingEntity.java:2876)
    at net.minecraft.entity.player.ServerPlayerEntity.onItemUseFinish(ServerPlayerEntity.java:1027)
    at net.minecraft.entity.LivingEntity.updateActiveHand(LivingEntity.java:2754)
    at net.minecraft.entity.LivingEntity.tick(LivingEntity.java:2185)
    at net.minecraft.entity.player.PlayerEntity.tick(PlayerEntity.java:237)

-- Player being ticked --
Details:
    Entity Type: minecraft:player (net.minecraft.entity.player.ServerPlayerEntity)
    Entity ID: 135
    Entity Name: Dev
    Entity's Exact location: -140.31, 70.20, -6.46
    Entity's Block location: World: (-141,70,-7), Chunk: (at 3,4,9 in -9,-1; contains blocks -144,0,-16 to -129,255,-1), Region: (-1,-1; contains chunks -32,-32 to -1,-1, blocks -512,0,-512 to -1,255,-1)
    Entity's Momentum: 0.00, 0.01, 0.00
    Entity's Passengers: []
    Entity's Vehicle: ~~ERROR~~ NullPointerException: null
Stacktrace:
    at net.minecraft.entity.player.ServerPlayerEntity.playerTick(ServerPlayerEntity.java:379)
    at net.minecraft.network.play.ServerPlayNetHandler.tick(ServerPlayNetHandler.java:188)
    at net.minecraft.network.NetworkManager.tick(NetworkManager.java:250)

-- Ticking connection --
Details:
    Connection: net.minecraft.network.NetworkManager@3bcb3751
Stacktrace:
    at net.minecraft.network.NetworkSystem.tick(NetworkSystem.java:152)
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:903)
    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:821)
    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:662)
    at java.lang.Thread.run(Thread.java:748)

-- System Details --
Details:
    Minecraft Version: 1.15.2
    Minecraft Version ID: 1.15.2
    Operating System: Windows 10 (amd64) version 10.0
    Java Version: 1.8.0_261, Oracle Corporation
    Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
    Memory: 532880904 bytes (508 MB) / 1263534080 bytes (1205 MB) up to 1873805312 bytes (1787 MB)
    CPUs: 12
    JVM Flags: 1 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
    ModLauncher: 5.1.2+70+master.2845bb9
    ModLauncher launch target: fmluserdevclient
    ModLauncher naming: mcp
    ModLauncher services: 
        /eventbus-2.2.0-service.jar eventbus PLUGINSERVICE 
        /forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-launcher.jar object_holder_definalize PLUGINSERVICE 
        /forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-launcher.jar runtime_enum_extender PLUGINSERVICE 
        /accesstransformers-2.1.3-shadowed.jar accesstransformer PLUGINSERVICE 
        /forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-launcher.jar capability_inject_definalize PLUGINSERVICE 
        /forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-launcher.jar runtimedistcleaner PLUGINSERVICE 
        /forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-launcher.jar fml TRANSFORMATIONSERVICE 
    FML: 31.2
    Forge: net.minecraftforge:31.2.41
    FML Language Providers: 
        [email protected]
        minecraft@1
    Mod List: 
        client-extra.jar Minecraft {[email protected] DONE}
        forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-recomp.jar Forge {[email protected] DONE}
        main Depression Mod {depression_mod@NONE DONE}
    Player Count: 1 / 8; [ServerPlayerEntity['Dev'/135, l='New World', x=-140.31, y=70.20, z=-6.46]]
    Data Packs: vanilla, mod:forge (incompatible), mod:depression_mod
    Type: Integrated Server (map_client.txt)
    Is Modded: Definitely; Client brand changed to 'forge'

Link to comment
Share on other sites

public class PlayerMentalCapabilityMessage {
	ClientPlayerEntity player = Minecraft.getInstance().player;  //getInstance().playerをplayerにぶち込む
	LazyOptional<PlayerMentalInterface> cap = player.getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY);
		//playerからキャパビリティを取得してplayerMentalInterfaceにぶち込む
	int currentMental = cap.orElseThrow(IllegalArgumentException::new).getMental();
	//int currentMental = ((PlayerMentalInterface) playerMentalInterface).getMental();  //playerMentalInterfaceからmentalの値を取得してcurrentMentalにぶち込む

	public PlayerMentalCapabilityMessage(int currentMental) {
		this.currentMental = currentMental;
	}

	public static void encode(PlayerMentalCapabilityMessage message, PacketBuffer buf) {
		buf.writeInt(message.currentMental);
	}

	public static PlayerMentalCapabilityMessage decode(PacketBuffer buf) {
		int currentMental = buf.readInt();
		return new PlayerMentalCapabilityMessage(currentMental);

	}

	public static void handle(PlayerMentalCapabilityMessage message, Supplier<NetworkEvent.Context> ctx) {
		ctx.get().enqueueWork(() -> {
			DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> Handle.handleClient(message.currentMental));
		});
		ctx.get().setPacketHandled(true);
	}

	//@SuppressWarnings("resource")
	public static class Handle {
		public static DistExecutor.SafeRunnable handleClient(int currentMental) {
			return new DistExecutor.SafeRunnable() {
				@Override
				public void run() {
					LazyOptional<PlayerMentalInterface> cap = Minecraft.getInstance().player.getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY);
					cap.orElseThrow(IllegalArgumentException::new).setMental(currentMental);
				}
			};
		}
	}

I fixed the code in the network message and it seems that it crashed for another reason, but I don't know ...

 

---- Minecraft Crash Report ----
// Don't do that.

Time: 20/10/26 13:32
Description: Ticking player

java.lang.ExceptionInInitializerError: null
    at depression_mod.potion.ModEffect.lambda$0(ModEffect.java:30) ~[?:?] {re:classloading}
    at net.minecraftforge.common.util.LazyOptional.ifPresent(LazyOptional.java:161) ~[?:?] {re:classloading}
    at depression_mod.potion.ModEffect.performEffect(ModEffect.java:27) ~[?:?] {re:classloading}
    at depression_mod.potion.ModEffect.affectEntity(ModEffect.java:37) ~[?:?] {re:classloading}
    at net.minecraft.item.PotionItem.onItemUseFinish(PotionItem.java:47) ~[?:?] {re:classloading}
    at net.minecraft.item.ItemStack.onItemUseFinish(ItemStack.java:213) ~[?:?] {re:classloading}
    at net.minecraft.entity.LivingEntity.onItemUseFinish(LivingEntity.java:2876) ~[?:?] {re:classloading}
    at net.minecraft.entity.player.ServerPlayerEntity.onItemUseFinish(ServerPlayerEntity.java:1027) ~[?:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.entity.LivingEntity.updateActiveHand(LivingEntity.java:2754) ~[?:?] {re:classloading}
    at net.minecraft.entity.LivingEntity.tick(LivingEntity.java:2185) ~[?:?] {re:classloading}
    at net.minecraft.entity.player.PlayerEntity.tick(PlayerEntity.java:237) ~[?:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.entity.player.ServerPlayerEntity.playerTick(ServerPlayerEntity.java:379) ~[?:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.network.play.ServerPlayNetHandler.tick(ServerPlayNetHandler.java:188) ~[?:?] {re:classloading}
    at net.minecraft.network.NetworkManager.tick(NetworkManager.java:250) ~[?:?] {re:classloading}
    at net.minecraft.network.NetworkSystem.tick(NetworkSystem.java:152) ~[?:?] {re:classloading}
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:903) ~[?:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:821) ~[?:?] {re:classloading,pl:accesstransformer:B}
    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120) ~[?:?] {re:classloading,pl:runtimedistcleaner:A}
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:662) [?:?] {re:classloading,pl:accesstransformer:B}
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_261] {}
Caused by: java.lang.IllegalArgumentException: Registration of network channels is locked
    at net.minecraftforge.fml.network.NetworkRegistry.createInstance(NetworkRegistry.java:130) ~[?:?] {re:classloading}
    at net.minecraftforge.fml.network.NetworkRegistry.newSimpleChannel(NetworkRegistry.java:97) ~[?:?] {re:classloading}
    at depression_mod.network.DepressionModPacketHandler.<clinit>(DepressionModPacketHandler.java:13) ~[?:?] {re:classloading}
    ... 20 more


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Thread: Server thread
Stacktrace:
    at depression_mod.potion.ModEffect.lambda$0(ModEffect.java:30)
    at net.minecraftforge.common.util.LazyOptional.ifPresent(LazyOptional.java:161)
    at depression_mod.potion.ModEffect.performEffect(ModEffect.java:27)
    at depression_mod.potion.ModEffect.affectEntity(ModEffect.java:37)
    at net.minecraft.item.PotionItem.onItemUseFinish(PotionItem.java:47)
    at net.minecraft.item.ItemStack.onItemUseFinish(ItemStack.java:213)
    at net.minecraft.entity.LivingEntity.onItemUseFinish(LivingEntity.java:2876)
    at net.minecraft.entity.player.ServerPlayerEntity.onItemUseFinish(ServerPlayerEntity.java:1027)
    at net.minecraft.entity.LivingEntity.updateActiveHand(LivingEntity.java:2754)
    at net.minecraft.entity.LivingEntity.tick(LivingEntity.java:2185)
    at net.minecraft.entity.player.PlayerEntity.tick(PlayerEntity.java:237)

-- Player being ticked --
Details:
    Entity Type: minecraft:player (net.minecraft.entity.player.ServerPlayerEntity)
    Entity ID: 134
    Entity Name: Dev
    Entity's Exact location: -140.36, 70.20, -5.77
    Entity's Block location: World: (-141,70,-6), Chunk: (at 3,4,10 in -9,-1; contains blocks -144,0,-16 to -129,255,-1), Region: (-1,-1; contains chunks -32,-32 to -1,-1, blocks -512,0,-512 to -1,255,-1)
    Entity's Momentum: 0.00, 0.01, 0.00
    Entity's Passengers: []
    Entity's Vehicle: ~~ERROR~~ NullPointerException: null
Stacktrace:
    at net.minecraft.entity.player.ServerPlayerEntity.playerTick(ServerPlayerEntity.java:379)
    at net.minecraft.network.play.ServerPlayNetHandler.tick(ServerPlayNetHandler.java:188)
    at net.minecraft.network.NetworkManager.tick(NetworkManager.java:250)

-- Ticking connection --
Details:
    Connection: net.minecraft.network.NetworkManager@20737ec4
Stacktrace:
    at net.minecraft.network.NetworkSystem.tick(NetworkSystem.java:152)
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:903)
    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:821)
    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:662)
    at java.lang.Thread.run(Thread.java:748)

-- System Details --
Details:
    Minecraft Version: 1.15.2
    Minecraft Version ID: 1.15.2
    Operating System: Windows 10 (amd64) version 10.0
    Java Version: 1.8.0_261, Oracle Corporation
    Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
    Memory: 435238600 bytes (415 MB) / 1243086848 bytes (1185 MB) up to 1873805312 bytes (1787 MB)
    CPUs: 12
    JVM Flags: 1 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
    ModLauncher: 5.1.2+70+master.2845bb9
    ModLauncher launch target: fmluserdevclient
    ModLauncher naming: mcp
    ModLauncher services: 
        /eventbus-2.2.0-service.jar eventbus PLUGINSERVICE 
        /forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-launcher.jar object_holder_definalize PLUGINSERVICE 
        /forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-launcher.jar runtime_enum_extender PLUGINSERVICE 
        /accesstransformers-2.1.3-shadowed.jar accesstransformer PLUGINSERVICE 
        /forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-launcher.jar capability_inject_definalize PLUGINSERVICE 
        /forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-launcher.jar runtimedistcleaner PLUGINSERVICE 
        /forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-launcher.jar fml TRANSFORMATIONSERVICE 
    FML: 31.2
    Forge: net.minecraftforge:31.2.41
    FML Language Providers: 
        [email protected]
        minecraft@1
    Mod List: 
        client-extra.jar Minecraft {[email protected] DONE}
        forge-1.15.2-31.2.41_mapped_snapshot_20200514-1.15.1-recomp.jar Forge {[email protected] DONE}
        main Depression Mod {depression_mod@NONE DONE}
    Player Count: 1 / 8; [ServerPlayerEntity['Dev'/134, l='New World', x=-140.36, y=70.20, z=-5.77]]
    Data Packs: vanilla, mod:forge (incompatible), mod:depression_mod
    Type: Integrated Server (map_client.txt)
    Is Modded: Definitely; Client brand changed to 'forge'

Link to comment
Share on other sites

12 hours ago, Zemelua said:

ClientPlayerEntity player = Minecraft.getInstance().player; //getInstance().playerをplayerにぶち込む LazyOptional<PlayerMentalInterface> cap = player.getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY); //playerからキャパビリティを取得してplayerMentalInterfaceにぶち込む int currentMental = cap.orElseThrow(IllegalArgumentException::new).getMental();

Reaching across logical sides. Don't ever do this.

13 hours ago, Zemelua said:

LazyOptional<PlayerMentalInterface> cap = Minecraft.getInstance().player.getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY); cap.orElseThrow(IllegalArgumentException::new).setMental(currentMental);

We've already went over not to use this.

13 hours ago, Zemelua said:

Registration of network channels is locked

This is the actual error. You're trying to register your network too late. You probably also haven't registered the message either.

13 hours ago, Zemelua said:

public static class Handle { public static DistExecutor.SafeRunnable handleClient(int currentMental) { return new DistExecutor.SafeRunnable() { @Override public void run() { LazyOptional<PlayerMentalInterface> cap = Minecraft.getInstance().player.getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY); cap.orElseThrow(IllegalArgumentException::new).setMental(currentMental); } }; } }

This entire thing is a hack. Isolate the code in a different class an use the unsafe version of DistExecutor.

Link to comment
Share on other sites

I'm sorry. I'm still not familiar with network systems. I've read the documentation and some commentary over and over again to understand the rough mechanics (which allows the server / client to exchange data with each other via packets), but specifically which method does what. I'm not sure what it is (what the encode and decode are doing, which method is actually passing the data, etc.) ... if you like, I'll explain it in detail. Could you please?

Link to comment
Share on other sites

In you encode you are writing data from the instance of the packet class to the buffer that is going to be send to the client/server. In decode you are reading the data of the buffer, and pass it into the instance of the packet class which is what handle() will receive and proceed with it.

Edited by poopoodice
Link to comment
Share on other sites

public class PlayerMentalCapabilityMessage {
	ClientPlayerEntity player = Minecraft.getInstance().player;  //getInstance().playerをplayerにぶち込む
	LazyOptional<PlayerMentalInterface> cap = player.getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY);
		//playerからキャパビリティを取得してplayerMentalInterfaceにぶち込む
	int currentMental = cap.orElseThrow(IllegalArgumentException::new).getMental();
	//int currentMental = ((PlayerMentalInterface) playerMentalInterface).getMental();  //playerMentalInterfaceからmentalの値を取得してcurrentMentalにぶち込む

	public PlayerMentalCapabilityMessage(int currentMental) {
		this.currentMental = currentMental;
	}

	public static void encode(PlayerMentalCapabilityMessage message, PacketBuffer buf) {
		buf.writeInt(message.currentMental);  //currentMentalの値をバッファーにぶち込む
	}

	public static PlayerMentalCapabilityMessage decode(PacketBuffer buf) {
		int currentMental = buf.readInt();  //バッファーから値を取得する
		return new PlayerMentalCapabilityMessage(currentMental);  //バッファーから取得した値でPlayerMentalCapabilityMessage(int)をインスタンス化

	}

	public static void handle(PlayerMentalCapabilityMessage message, Supplier<NetworkEvent.Context> ctx) {
		ctx.get().enqueueWork(() -> {
			DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> Handle.handleClient(message.currentMental));
		});
		ctx.get().setPacketHandled(true);
	}

	//@SuppressWarnings("resource")
	public static class Handle {
		public static DistExecutor.SafeRunnable handleClient(int currentMental) {
			return new DistExecutor.SafeRunnable() {
				@Override
				public void run() {
					LazyOptional<PlayerMentalInterface> cap = Minecraft.getInstance().player.getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY);
					cap.orElseThrow(IllegalArgumentException::new).setMental(currentMental);
				}
			};
		}
	}
}

Sorry. this is.

Link to comment
Share on other sites

I'm not sure why you still have this

	ClientPlayerEntity player = Minecraft.getInstance().player;  //getInstance().playerをplayerにぶち込む
	LazyOptional<PlayerMentalInterface> cap = player.getCapability(PlayerMentalCapabilityRegistry.PLAYER_MENTAL_CAPABILITY);
		//playerからキャパビリティを取得してplayerMentalInterfaceにぶち込む
	int currentMental = cap.orElseThrow(IllegalArgumentException::new).getMental();

You have the value that has passed in to the contructor, just store it there, and use it when needed.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • KLIK DISINI >>> LINK LOGIN & DAFTAR KLIK DISINI >>>   DAFTAR AKUN GACOR KLIK DISINI >>> DAFTAR AKUN VVIP KLIK DISINI >>> DAFTAR AKUN SLOT ANTI RUNGKAD KLIK DISINI >>>  LINK ALTERNATIF KLIK DISINI >>> AKUN GACOR SCATTER HITAM SLOT888 adalah slot gacor winrate 100% dengan server thailand dan akun pro. Dapatkan akses menuju kemenangan ke puluhan sampai ratusan juta rupiah hanya dalam hitungan menit. 3 web yang kami hadirkan ini adalah yang terbaik dengan histori kemenangan tertinggi di satu Asia Tenggara. Member-member dari web ini selalu kembali karena tim admin dan CS yang profesional serta kemenangan berapapun pasti akan dibayar. RTP slot gacor juga sudah disiapkan agar kalian tidak bingung lagi mau main apa dan di jam berapa. Semua fasilitas seperti deposit dana dan pulsa sudah disiapkan juga untuk kemudahan para slotters. Jadi tunggu apalagi? Raih kemenangan kalian disini sekarang juga!
    • Winning303 menyediakan berbagai jenis permainan dengan kemenangan yang tinggi , slot gacor dengan winrate 100% , hanya dengan modal receh sudah bisa meraih jutaan  Nikmati berbagai permainan judi online yang menarik dengan jaminan keamanan dan kenyamanan di WINNING303 LINK ALTERNATIF => https://w303.pink/ref1x    
    • RELATED: Horror Games Inspired By Movies Still, there are some options for a Wizard if it comes to melee combat, and there also are some alternatives on the subject of the catalyst they use to solid Spells. For each, those alternatives are first-class: Spellbook: All three spellcasting options, the Staff, Spellbook, and Crystal Ball can all have a whole lot of extra advantages of Dark And Darker Gold on them depending on rarity. But, at a base degree, the Spellbook is the catalyst option gamers appeared to gravitate to. This spell-casting catalyst will increase a Wizard's movement velocity by using the maximum overall, which clearly makes a large distinction. Crystal Ball: The distinction among the three Spell catalysts is quite easy. The Staff is the default option and has melee assaults of its own, the Spellbook is faster all around however offers no melee alternatives, and the Crystal Ball is the center ground between the 2 in regard to motion velocity, however gamers may also equip a Dagger or something in their other hand at the identical time. Crossbow: That's right, Wizards can really run Crossbows, but it is without a doubt simplest well worth the usage of once or at maximum twice at some stage in a suit, and best as soon as a Wizard is out of Spell casts. Still, tricking an enemy into thinking a Wizard is out of Spells, simplest to tug out a Crossbow and launch a bolt into them is a surprisingly effective strategy. Rondel Dagger: Again, if it ever does come right down to melee combat, a Wizard loses ninety percent of the time. But, having a Rondel Dagger as a secondary or geared up alongside the Crystal Ball improves the ones odds at least a bit bit. The Wizard's Expansive Repertoire Of Spells. Moving on to the category all and sundry became in all likelihood anticipating when studying approximately the Wizard magnificence, the Spells. Which Spells are the quality to use on the Wizard and why? Or, not less than, which of them are the maximum 'meta'? Are those professional kind Wizards, together with ones that use White, Green, Red, or even Blue magic, or are they a piece extra stereotypical? Well, after doing a little research, those appear to be the consequences, listed from least to most used: Slow: Slows an opponent for a duration, maximum of the time is changed by means of Haste, but a few gamers choose to slow others in preference to velocity themselves up. Haste: Speeds the Wizard up by way of a quite noticeable amount for a brief duration. This is the important thing device Wizards use to usually maintain their combatants at variety, and the use of this they can outrun just about everybody in the game (outside of projectile guns or different Spells). Invisibility: One of the fine Spells to apply on Wizard, but only veteran players appear to be utilizing it to the maximum. Basically permits the Wizard to use the identical strategies as a Rogue does with their Hide capability. Fireball: The Spell everyone makes use of before everything, tends to reveal up in each game, and is nearly usually extraordinarily suitable. But, in Dark and Darker, gamers will fast realizes that it is straightforward to hit allies with and there are better options for normal damage. Chain Lightning: Likely the pleasant alternative damage-sensible, and the friendly-fireplace element of it's far a chunk misleading (would not clearly chain to allies find it irresistible says it does). When aimed well, can decimate an unaware foe. Magic Missile: The most iconic 'Wizard Spell', Magic Missile, is tremendously right in Dark and Darker as properly. It's extraordinary for NPC enemies, excellent for region denial in a PvP fight, and it is the pleasant Spell to apply if the enemy manages to shut the space as it may speedy soften via their HP earlier than their swing connects. Last-Second General Wizard Tips. And it is pretty a great deal the whole thing gamers want to realize about constructing Wizards in Dark and Darker. This class, out of all of the instructions the sport currently gives Darker Gold, might be one of the maximum challenging ones to play for a newcomer.
    • Sakura38 Menghadirkan Situs Link Slot Deposit 1000 Gampang Menang Di Tahun 2024 Anda Memiliki Peluang Lebih Tinggi Untuk Meraih Kemenangan. Jadilah Bagian Dari Kesuksesan Kami Dan Bergabunglah Sekarang Untuk Memenangkan Hadiah-hadiah Fantastis   ▶️▶️ KLIK DISINI DAFTAR SEKARANG ◀️◀️ ▶️▶️ KLIK DISINI LINK ALTERNATIF DAFTAR AKUN 1 ◀️◀️ ▶️▶️ KLIK DISINI LINK ALTERNATIF DAFTAR AKUN 2 ◀️◀️ 💥Rahasia Mudah Dapat Perkalian Besar💥 💸Modal Receh Jamin AUTO JEPE 💸 ⚡Deposit Scan QRIS Proses Hanya 2 Detik !, WD Pasti LAND Kilat⚡ 🎰RTP & Pola GACOR Akurat🎰
    • Jagex held the Winter Summit towards the end of the year, where it revealed its content plans for 2023. Old School RuneScape recently got its Grandmaster Quest which serves as an expansion of Desert Treasure, a quest which is nearly twenty years old. If you were in the game the time Desert Treasure came out, you can imagine how thrilled a lot of players of OSRS gold were when the sequel was revealed. Desert Treasure II will make its way into Old School RuneScape during the summer of 2023. it's expected to introduce new bosses and content. There will be even more social elements that will be added to the Woodcutting game that has been a favorite with gamers. There's a new quest called the Secret of the North, which is a master-level quest is now available in the game and comes with some amazing boss fights that are only for solo players. Additionally, the Bounty Hunters miniature game returning to the game, which is sure to delight PvP players. I am sure there will be more games to come out by 2024 or later. RuneScape will not be going away and there's plenty of new content available to enjoy each year. The gameplay, the content, advancement systems, environments and even the music do not need introduction. I'd lie if I claimed that the game doesn't show its age. However, OSRS remains an enjoyable experience loved by the players and hasn't changed for over two decades. I've had plenty of unpleasant experiences in RuneScape and was cheated to death by "friends" earlier in the days, but we grow and learn. Even though it's a long-running MMORPG The game has a huge player base and there are many loyal players who have played for a long time. I had been away playing for a long time and yet it took me just a few minutes to locate helpful players who came together and assisted me. RuneScape is one of the most friendly communities I've seen across all gaming. my experience as a player was mostly positive, even in 2023. We're all aware of how much of the community devotes itself to skills, and it appears that we aren't seeing the final of the skills system yet. The new skill still to be announced and will be available in the coming months. Additionally, the minigames and side-activities are not left out by the game's developers, and they are constantly adding more features to the game. Over two decades of material is available, and, at the rate that it is going I'm not able to even guess how long the game will flourish. The community is active in its part in providing feedback and requests for more features for the old game. In the age of next-generation gaming, OSRS and RuneScape still retain the interest of a lot of players and keep them returning every day. I would highly suggest RuneScape in addition to Old School RuneScape to new players of 2023. but there's a caveat. The MMORPG genre has changed dramatically throughout the years, and it isn't easy to suggest RuneScape to those who are familiar with contemporary graphics and the extravagant environments that many of MMORPGs and live-services have to offer. However, if graphics aren't important to you and you are looking for a game that is fun, then consider giving it a shot and it's definitely worth the time. If you're a veteran who gave up RuneScape and cheap OSRS gold and is contemplating returning it, I highly recommend that you play the latest game's content. Like I said, RuneScape respects your time and, even if it's been more than a decade since the last time you played, you'll not have any issues jumping in to the action and starting it over and over. The process of preparing for new features took approximately a week. I had the chance to play the brand-new Secrets of the North content even after a lengthy hiatus.
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.