엘라스키
대표칭호 없음
이해도 | 초보자 |
---|---|
게임버전 (JE) | 1.16.5, 1.19.2 |
게임버전 (BE) | 관련없음 |
기존 1.16.5 모드를 1.19.2로 포트할려고 하는데@deprecated 표시도 없이 일부 메소드가 제거가 되었네요.
관련 정보를 찾아보니 Capability 클래스가 리워크되어서 IStorage 인터페이스가 사라졌네요.
(https://github.com/MinecraftForge/MinecraftForge/pull/8116)
Class Capability에 있는 메소드 writeNBT, readNBT가 삭제되어 더 이상 활용이 불가능해졌습니다.
다른 메소드를 가져와서 해결해야 하는 건 확실해 보이는데 어디서 가져와야 할 지 모르겠습니다.
문제가 되는 코드(BasicCapabilityProviderSerializable.java)
package meldexun.better_diving.capability; import net.minecraft.nbt.Tag; //import net.minecraft.nbt.INBT; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.util.NonNullSupplier; public class BasicCapabilityProviderSerializable<C> extends BasicCapabilityProvider<C> implements ICapabilitySerializable<Tag> { public BasicCapabilityProviderSerializable(Capability<C> capability, NonNullSupplier<C> instanceSupplier) { super(capability, instanceSupplier); } @Override public Tag serializeNBT() { return this.capability.writeNBT(this.instance.orElse(null), null); } @Override public void deserializeNBT(Tag nbt) { this.capability.readNBT(this.instance.orElse(null), null, nbt); } }
연관되어 있는 코드(BasicCapabilityProvider.java)
package meldexun.better_diving.capability; import net.minecraft.core.Direction; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.NonNullSupplier; public abstract class BasicCapabilityProvider<C> implements ICapabilityProvider { public final Capability<C> capability; public final LazyOptional<C> instance; public BasicCapabilityProvider(Capability<C> capability, NonNullSupplier<C> instanceSupplier){ this.capability = capability; this.instance = LazyOptional.of(instanceSupplier); } @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { return cap == this.capability ? this.instance.cast() : LazyOptional.empty(); } }
모드 전체 코드 출처
https://github.com/Meldexun/BetterDiving
코코냐
2023.07.13deprecated 없이가 아니라, 1.17, 1.18에서 deprecated 되었을 가능성이 높습니다. 보통 대체제가 냐오면 같이 대체제 설명을 해주니, 그걸 찾아보는게 빠를겁니다.
엘라스키
2023.07.13이미 다 확인한 내용입니다. 위에 참조 링크도 넣어놨는데, 좀 더 확인하고 답변 달아주시면 감사하겠습니다.
1.16.5 https://nekoyue.github.io/ForgeJavaDocs-NG/javadoc/1.16.5/net/minecraftforge/common/capabilities/Capability.html
1.17.1 https://nekoyue.github.io/ForgeJavaDocs-NG/javadoc/1.17.1/net/minecraftforge/common/capabilities/Capability.html
Capability 리워크 https://github.com/MinecraftForge/MinecraftForge/pull/8116
https://gist.github.com/50ap5ud5/beebcf056cbdd3c922cc8993689428f4#capabilities
일반적으로 @deprecated을 달고 다른 코드를 사용하도록 알려주는데 그냥 아예 다 사라져버려서 문제입니다.
코코냐
2023.07.14포지 자체가 문서가 개판이라 큰 도움이 되지 않을 가능성이 높습니다. 주변 커밋 다 확인해보셨냐요?
엘라스키
2023.07.14네 확인해봤습니다.
1.16.5 에서 1.17.1로 넘어갈 때 제거되었다는 것만 알겠네요. Capability 클래스 자체는 그대로 있는데 IStorage가 삭제되었습니다.
IStorage 내부에 있는 writeNBT, readNBT도 같이 삭제되었습니다.
코코냐
2023.07.14Build: 1.17.1-37.0.74 - Fri Oct 01 05:54:38 GMT 2021
lexmanos:
Capability rework to get rid of @CapabilityInject and use CapabilityToken as the identifier, deprecated old system for removal in 1.18. (#8116)
변경사항 검색으로 5분도 채 되지 않아 관련 정보가 냐옵니다. 해당 PR 확인해보셨냐요?
엘라스키
2023.07.14공식 깃허브 들어가서 찾았습니다.
https://github.com/MinecraftForge/MinecraftForge/issues/7622
리워크 되는건 알고 있었지만 IStorage 관련 내용은 변경사항에 안 나와있네요.
IStorage가 대체제 없이 제거되어서 기존 코드를 다시 활용하진 못하겠네요.
도움 주셔서 감사합니다.