February 2, 20223 yr 6 hours ago, ocome said: By the way, if this is a java thing, I hope you don't mind, but why do I get a static context error with getManaData the method is static, so you don't need a instance of the class to call this method 6 hours ago, ocome said: ManaData statsa1s = MyCapabilityImplementation.getManaData(); this is completely wrong, call Player#getCapability to get your Capability inside of a LazyOptional then call LazyOptional#orElseThrow to get the Capability Interface and to throw a Exception if the Capability is not present, then you can get the data from your Capability Interface 1 hour ago, ocome said: final MyCapabilityProviderEntity provider = new MyCapabilityProviderEntity(); you didn't do what i told you to do, you should create a constructor with the Player and store it in your MyCapabilityImplementation 1 hour ago, ocome said: new MyCapabilityImplementation().tick(eventObject); what on earth is that?
February 3, 20223 yr Author 17 hours ago, Luis_ST said: this is completely wrong, call Player#getCapability to get your Capability inside of a LazyOptional then call LazyOptional#orElseThrow to get the Capability Interface and to throw a Exception if the Capability is not present, then you can get the data from your Capability Interface LazyOptional<MyCapabilityInterface> stats1 = minecraft.player.getCapability(MyCapability.INSTANCE); MyCapabilityInterface myCapabilityInterface=stats1.orElseThrow(IllegalStateException::new); ManaData manaData= myCapabilityInterface.getManaData(); int level =manaData.getManaLevel(); implemented. No errors are seen. 17 hours ago, Luis_ST said: you didn't do what i told you to do, you should create a constructor with the Player and store it in your MyCapabilityImplementation public MyCapabilityProviderEntity(Player eventObject) { new MyCapabilityImplementation(eventObject) ; } public void onAttachingCapabilitiesEntity(final AttachCapabilitiesEvent<Entity> event) { boolean iof = event.getObject() instanceof Player; if (iof ==true) { Player eventObject = (Player) event.getObject(); final MyCapabilityProviderEntity provider = new MyCapabilityProviderEntity(eventObject); event.addCapability(MyCapabilityProviderEntity.IDENTIFIER, provider); } } MyCapabilityImplementation public class MyCapabilityImplementation implements MyCapabilityInterface { protected ManaData manaData = new ManaData(); private static final String NBT_KEY_DAMAGE_DEALT = "damageDealt"; public Player player ; public Level level; private String Value = ""; public Minecraft minecraft; public MyCapabilityImplementation() { } public MyCapabilityImplementation(Player object) { player=object; } @Override public ManaData getManaData() { return this.manaData; } Is this what it means to create in the player? Honestly, I'm not sure I'm getting it right due to the way the meaning is conveyed and my lack of knowledge
February 3, 20223 yr 4 hours ago, ocome said: implemented. No errors are seen. correct, you can short up the code a bit but this is optional 4 hours ago, ocome said: Is this what it means to create in the player? yeah 4 hours ago, ocome said: Honestly, I'm not sure I'm getting it right due to the way the meaning is conveyed and my lack of knowledge that's basic java, to create a Constructor with a parameter and then to store the Object in Field
February 3, 20223 yr Author 13 hours ago, Luis_ST said: that's basic java, to create a Constructor with a parameter MyCapabilityAttacher Player eventObject = (Player) event.getObject(); final MyCapabilityProviderEntity provider = new MyCapabilityProviderEntity(eventObject); event.addCapability(MyCapabilityProviderEntity.IDENTIFIER, provider); public MyCapabilityProviderEntity(Player eventObject) { new MyCapabilityImplementation(eventObject); } 13 hours ago, Luis_ST said: and then to store the Object in Field MyCapabilityImplementation public class MyCapabilityImplementation implements MyCapabilityInterface { protected ManaData manaData = new ManaData(); private static final String NBT_KEY_DAMAGE_DEALT = "damageDealt"; public Player player ; public Level level; private String Value = ""; public MyCapabilityImplementation(Player eventObject) { player=eventObject; } Is this correct? I tried to make it as described, but it may not have come across correctly. Edited February 3, 20223 yr by ocome
February 3, 20223 yr 19 minutes ago, ocome said: Is this correct? you could make the fields final and initialize the level field in the constructor, does it work?
February 3, 20223 yr Author 1 hour ago, Luis_ST said: you could make the fields final and initialize the level field in the constructor, does it work? public class MyCapabilityImplementation implements MyCapabilityInterface { protected ManaData manaData = new ManaData(); private static final String NBT_KEY_DAMAGE_DEALT = "damageDealt"; public final Player player ; public final Level level ; private String Value = ""; public MyCapabilityImplementation(Player eventObject) { player=eventObject; level = eventObject.getLevel(); } public MyCapabilityImplementation() { player = null; level = null; } It works and no special errors occur anymore I added it to the previous section thinking it should be executed at Player runtime, but it was only executed at the start. Edited February 3, 20223 yr by ocome
February 4, 20223 yr 8 hours ago, ocome said: I added it to the previous section thinking it should be executed at Player runtime, but it was only executed at the start. what are you talking about?
February 4, 20223 yr Author Oh, I left out an explanation. I think I need a method that runs all the time, but in the above location, it is only called at startup. I'd like to get some hints on where to call it.
February 4, 20223 yr 29 minutes ago, ocome said: I'd like to get some hints on where to call it. about which method you are talking, MyCapabilityInterface#tick? it depends on what the method should do
February 4, 20223 yr Author I want to implement something that automatically decreases like the hunger value. (Ideally, something that increases since it is mana)
February 4, 20223 yr then subscribe to TickEvent.Player and check if it's on server, then get your Capability and call tick there Note: TickEvents are fired twice you need to check the phase of the Event
February 7, 20223 yr Author On 2/4/2022 at 11:40 PM, Luis_ST said: hen subscribe to TickEvent.Player and check if it's on server, then get your Capability and call tick there Note: TickEvents are fired twice you need to check the phase of the Event @SubscribeEvent public void onPlayerPreTick(final AttachCapabilitiesEvent<Entity> event){ Player player =Minecraft.getInstance().player; boolean playercheck = MinecraftForge.EVENT_BUS.post(new TickEvent.PlayerTickEvent(TickEvent.Phase.START, player)); if(playercheck ==true) { Minecraft minecraft = Minecraft.getInstance(); LazyOptional<MyCapabilityInterface> stats1 = minecraft.player.getCapability(MyCapability.INSTANCE); MyCapabilityInterface myCapabilityInterface = stats1.orElseThrow(IllegalStateException::new); myCapabilityInterface.tick(); } } Is this wrong? player is being called, but all return false
February 7, 20223 yr 9 minutes ago, ocome said: MinecraftForge.EVENT_BUS.post(new TickEvent.PlayerTickEvent(TickEvent.Phase.START, player)); why on earth are you doing this? 10 minutes ago, ocome said: Minecraft minecraft = Minecraft.getInstance(); thus is client side only, what do you want to call each tick
February 7, 20223 yr Author 19 minutes ago, Luis_ST said: why on earth are you doing this? I thought if I used this it would return true for Player.END 22 minutes ago, Luis_ST said: thus is client side only, what do you want to call each tick Okay, I'll think about it some more.
February 7, 20223 yr 1 hour ago, ocome said: I thought if I used this it would return true for Player.END no you create a new TickEvent inside the TickEvent, you basically need to check if the Phase which is given by the Event equals Phase.START or Phase.END 1 hour ago, ocome said: Okay, I'll think about it some more. please answer my question Edited February 7, 20223 yr by Luis_ST
February 7, 20223 yr Author 6 minutes ago, Luis_ST said: please answer my question I thought I needed to call capability, so I used getinstance to get it.
February 7, 20223 yr 5 minutes ago, ocome said: I thought I needed to call capability yeah but use the Player from the Event 1 hour ago, ocome said: public void onPlayerPreTick(final AttachCapabilitiesEvent<Entity> event) you need to use there TickEvent.Player and not AttachCapabilitiesEvent 2 hours ago, ocome said: myCapabilityInterface.tick(); what does this method do?
February 7, 20223 yr Author 24 minutes ago, Luis_ST said: yeah but use the Player from the Event My idea is to get the vanilla player, call Capability when the vanilla START is obtained, and then call tick from Interface.... However, from your answer, it seems that it is not. It's hard to .... I want to understand 21 minutes ago, Luis_ST said: you need to use there TickEvent.Player and not AttachCapabilitiesEvent I did not know what parameters were available. I'm sure there is a way to find out from somewhere, but do you know of one? 21 minutes ago, Luis_ST said: what does this method do? implementation public void tick() { if (!this.level.isClientSide) { this.manaData.tick(player); } } net.minecraftforge.event.ForgeEventFactory.onPlayerPreTick(player); need equivalent of this code? Manadata public void tick(Player p_38711_) { Difficulty difficulty = p_38711_.level.getDifficulty(); this.lastManaLevel = this.manaLevel; if (this.exhaustionLevel > 4.0F) { this.exhaustionLevel -= 4.0F; if (this.saturationLevel > 0.0F) { this.saturationLevel = Math.max(this.saturationLevel - 1.0F, 0.0F); } else if (difficulty != Difficulty.PEACEFUL) { this.manaLevel = Math.max(this.manaLevel - 1, 0); } } boolean flag = p_38711_.level.getGameRules().getBoolean(GameRules.RULE_NATURAL_REGENERATION); if (flag && this.saturationLevel > 0.0F && p_38711_.isHurt() && this.manaLevel >= 20) { ++this.tickTimer; if (this.tickTimer >= 10) { float f = Math.min(this.saturationLevel, 6.0F); p_38711_.heal(f / 6.0F); this.addExhaustion(f); this.tickTimer = 0; } } else if (flag && this.manaLevel >= 18 && p_38711_.isHurt()) { ++this.tickTimer; if (this.tickTimer >= 80) { p_38711_.heal(1.0F); this.addExhaustion(6.0F); this.tickTimer = 0; } } else if (this.manaLevel <= 0) { ++this.tickTimer; if (this.tickTimer >= 80) { if (p_38711_.getHealth() > 10.0F || difficulty == Difficulty.HARD || p_38711_.getHealth() > 1.0F && difficulty == Difficulty.NORMAL) { p_38711_.hurt(DamageSource.STARVE, 1.0F); } this.tickTimer = 0; } } else { this.tickTimer = 0; } }
February 7, 20223 yr 8 hours ago, ocome said: need equivalent of this code? no just create a Event handler, similar to the AttachCapabilitiesEvent but with TickEvent.Player Edit: I would recommend you to read the doc about Events Edited February 7, 20223 yr by Luis_ST
February 8, 20223 yr Author 20 hours ago, Luis_ST said: no just create a Event handler, similar to the AttachCapabilitiesEvent but with TickEvent.Player @SubscribeEvent public void onPlayerPreTick(final TickEvent.PlayerTickEvent event){ Player player = event.player; boolean iof = player instanceof Player; if (iof ==true) { LazyOptional<MyCapabilityInterface> stats1 = player.getCapability(MyCapability.INSTANCE); try { MyCapabilityInterface myCapabilityInterface = stats1.orElseThrow(IllegalStateException::new); myCapabilityInterface.tick(event.player); } catch (IllegalStateException e) { return; } } } Basically, it's working! Edited February 8, 20223 yr by ocome
February 8, 20223 yr Author OK!!! I've created a system for regeneration mana it's working!(not perfect, but I think it's adjustable.) I was able to do this while thinking about it, and I think I have gained some abilities that I can use in other ways. Thank you very much for answering my questions so many times over a very long period of time!
February 8, 20223 yr Author I could be wrong, but I seem to get an error when I try to load a player when they are killed. Um... Does this mean that I need to make sure that the player exists on the server? And if they aren't, don't try read them?
February 8, 20223 yr Author 7 hours ago, diesieben07 said: What error? ---- Minecraft Crash Report ---- // There are four lights! Time: 2022/02/09 1:28 Description: Ticking player java.lang.IllegalStateException: null at net.minecraftforge.common.util.LazyOptional.orElseThrow(LazyOptional.java:295) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2376%2382!/:?] {re:classloading} at com.playerelementtutorial.playerelementtutorialmod.MyCapabilityAttacher.onPlayerPreTick(MyCapabilityAttacher.java:72) ~[%2381!/:?] {re:classloading} at net.minecraftforge.eventbus.ASMEventHandler_1_MyCapabilityAttacher_onPlayerPreTick_PlayerTickEvent.invoke(.dynamic) ~[?:?] {} at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) ~[eventbus-5.0.7.jar%239!/:?] {} at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302) ~[eventbus-5.0.7.jar%239!/:?] {} at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283) ~[eventbus-5.0.7.jar%239!/:?] {} at net.minecraftforge.event.ForgeEventFactory.onPlayerPostTick(ForgeEventFactory.java:856) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2376%2382!/:?] {re:classloading} at net.minecraft.world.entity.player.Player.tick(Player.java:278) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.level.ServerPlayer.doTick(ServerPlayer.java:439) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.network.ServerGamePacketListenerImpl.tick(ServerGamePacketListenerImpl.java:206) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading} at net.minecraft.network.Connection.tick(Connection.java:233) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading} at net.minecraft.server.network.ServerConnectionListener.tick(ServerConnectionListener.java:142) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading} at net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:882) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:808) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.client.server.IntegratedServer.tickServer(IntegratedServer.java:86) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:668) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.lambda$spin$2(MinecraftServer.java:258) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} at java.lang.Thread.run(Thread.java:833) [?:?] {} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Server thread Stacktrace: at net.minecraftforge.common.util.LazyOptional.orElseThrow(LazyOptional.java:295) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2376%2382!/:?] {re:classloading} at com.playerelementtutorial.playerelementtutorialmod.MyCapabilityAttacher.onPlayerPreTick(MyCapabilityAttacher.java:72) ~[%2381!/:?] {re:classloading} at net.minecraftforge.eventbus.ASMEventHandler_1_MyCapabilityAttacher_onPlayerPreTick_PlayerTickEvent.invoke(.dynamic) ~[?:?] {} at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) ~[eventbus-5.0.7.jar%239!/:?] {} at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302) ~[eventbus-5.0.7.jar%239!/:?] {} at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283) ~[eventbus-5.0.7.jar%239!/:?] {} at net.minecraftforge.event.ForgeEventFactory.onPlayerPostTick(ForgeEventFactory.java:856) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2376%2382!/:?] {re:classloading} at net.minecraft.world.entity.player.Player.tick(Player.java:278) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} -- Player being ticked -- Details: Entity Type: minecraft:player (net.minecraft.server.level.ServerPlayer) Entity ID: 154 Entity Name: Dev Entity's Exact location: -239.30, 65.00, 496.09 Entity's Block location: World: (-240,65,496), Section: (at 0,1,0 in -15,4,31; chunk contains blocks -240,-64,496 to -225,319,511), Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,-64,0 to -1,319,511) Entity's Momentum: 0.00, -0.16, 0.00 Entity's Passengers: [] Entity's Vehicle: null Stacktrace: at net.minecraft.server.level.ServerPlayer.doTick(ServerPlayer.java:439) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.network.ServerGamePacketListenerImpl.tick(ServerGamePacketListenerImpl.java:206) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading} at net.minecraft.network.Connection.tick(Connection.java:233) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading} at net.minecraft.server.network.ServerConnectionListener.tick(ServerConnectionListener.java:142) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading} at net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:882) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:808) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.client.server.IntegratedServer.tickServer(IntegratedServer.java:86) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:668) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.lambda$spin$2(MinecraftServer.java:258) ~[forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp.jar%2377!/:?] {re:classloading,pl:accesstransformer:B} at java.lang.Thread.run(Thread.java:833) [?:?] {} -- System Details -- Details: Minecraft Version: 1.18.1 Minecraft Version ID: 1.18.1 Operating System: Windows 10 (amd64) version 10.0 Java Version: 17.0.1, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode, sharing), Oracle Corporation Memory: 4097892080 bytes (3908 MiB) / 6509559808 bytes (6208 MiB) up to 12859736064 bytes (12264 MiB) CPUs: 8 Processor Vendor: GenuineIntel Processor Name: Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz Identifier: Intel64 Family 6 Model 158 Stepping 9 Microarchitecture: Kaby Lake Frequency (GHz): 3.60 Number of physical packages: 1 Number of physical CPUs: 4 Number of logical CPUs: 8 Graphics card #0 name: NVIDIA GeForce GTX 1050 Ti Graphics card #0 vendor: NVIDIA (0x10de) Graphics card #0 VRAM (MB): 4095.00 Graphics card #0 deviceId: 0x1c82 Graphics card #0 versionInfo: DriverVersion=30.0.14.7111 Graphics card #1 name: Intel(R) HD Graphics 630 Graphics card #1 vendor: Intel Corporation (0x8086) Graphics card #1 VRAM (MB): 1024.00 Graphics card #1 deviceId: 0x5912 Graphics card #1 versionInfo: DriverVersion=27.20.100.8681 Memory slot #0 capacity (MB): 8192.00 Memory slot #0 clockSpeed (GHz): 2.40 Memory slot #0 type: DDR4 Memory slot #1 capacity (MB): 16384.00 Memory slot #1 clockSpeed (GHz): 2.40 Memory slot #1 type: DDR4 Memory slot #2 capacity (MB): 8192.00 Memory slot #2 clockSpeed (GHz): 2.40 Memory slot #2 type: DDR4 Memory slot #3 capacity (MB): 16384.00 Memory slot #3 clockSpeed (GHz): 2.40 Memory slot #3 type: DDR4 Virtual memory max (MB): 79089.23 Virtual memory used (MB): 35052.52 Swap memory total (MB): 30061.29 Swap memory used (MB): 659.84 JVM Flags: 1 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump Server Running: true Player Count: 1 / 8; [ServerPlayer['Dev'/154, l='ServerLevel[new world]', x=-239.30, y=65.00, z=496.09, removed=KILLED]] Data Packs: vanilla, mod:playerelementtutorialmod, mod:forge Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'forge'; Server brand changed to 'forge' ModLauncher: 9.1.0+9.1.0+main.6690ee51 ModLauncher launch target: forgeclientuserdev ModLauncher naming: mcp ModLauncher services: mixin PLUGINSERVICE eventbus PLUGINSERVICE object_holder_definalize PLUGINSERVICE runtime_enum_extender PLUGINSERVICE capability_token_subclass PLUGINSERVICE accesstransformer PLUGINSERVICE runtimedistcleaner PLUGINSERVICE mixin TRANSFORMATIONSERVICE fml TRANSFORMATIONSERVICE FML Language Providers: [email protected] javafml@null Mod List: forge-1.18.1-39.0.64_mapped_official_1.18.1-recomp|Minecraft |minecraft |1.18.1 |DONE |Manifest: a1:d4:5e:04:4f:d3:d6:e0:7b:37:97:cf:77:b0:de:ad:4a:47:ce:8c:96:49:5f:0a:cf:8c:ae:b2:6d:4b:8a:3f main |Player Element Tutorialmod |playerelementtutorialmod |0.0NONE |DONE |Manifest: NOSIGNATURE |Forge |forge |39.0.64 |DONE |Manifest: NOSIGNATURE Crash Report UUID: ac5951cf-4cbe-4001-910d-a749a904453a FML: 39.0 Forge: net.minecraftforge:39.0.64
February 8, 20223 yr Author myCapabilityInterface.tick(event.player); final MyCapabilityProviderEntity provider = new MyCapabilityProviderEntity(player); event.addCapability(IDENTIFIER, provider); Does that mean we need addcapability? I don't think tickevent has it, but is there a way to do it?
February 8, 20223 yr Author if (iof ==true) { LazyOptional<MyCapabilityInterface> stats1 = player.getCapability(MyCapability.INSTANCE); MyCapabilityInterface myCapabilityInterface = stats1.orElseThrow(IllegalStateException::new); myCapabilityInterface.tick(event.player); final MyCapabilityProviderEntity provider = new MyCapabilityProviderEntity(player); AttachCapabilitiesEvent.addCapability(IDENTIFIER, provider); Is this simply how it is? This would cause a context error, but... Edited February 8, 20223 yr by ocome
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.