WorldManager.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package me.km.world;
  2. import java.util.ArrayList;
  3. import java.util.function.Consumer;
  4. import me.km.KajetansMod;
  5. import me.km.utils.ReflectionUtils;
  6. import net.minecraft.server.MinecraftServer;
  7. import net.minecraft.util.ResourceLocation;
  8. import net.minecraft.world.IWorld;
  9. import net.minecraft.world.dimension.DimensionType;
  10. import net.minecraft.world.server.ServerWorld;
  11. import net.minecraftforge.common.DimensionManager;
  12. import net.minecraftforge.common.ModDimension;
  13. import net.minecraftforge.registries.ClearableRegistry;
  14. public class WorldManager
  15. {
  16. public static final ModDimension MOD_DIMENSION = new ModDimensionFactory().setRegistryName(KajetansMod.MODID, "mod_dimension");
  17. // -------------------------------------------------------------------------
  18. // unsafe stuff
  19. // -------------------------------------------------------------------------
  20. public static void registerUnsafe(int id, String name)
  21. {
  22. DimensionManager.registerDimensionInternal(id, new ResourceLocation(name), MOD_DIMENSION, null, true);
  23. }
  24. public static void reset()
  25. {
  26. ClearableRegistry<DimensionType> reg = (ClearableRegistry<DimensionType>) DimensionManager.getRegistry();
  27. reg.clear();
  28. reg.register(DimensionType.OVERWORLD.getId() + 1, new ResourceLocation("minecraft", "overworld"), DimensionType.OVERWORLD);
  29. reg.register(DimensionType.THE_NETHER.getId() + 1, new ResourceLocation("minecraft", "the_nether"), DimensionType.THE_NETHER);
  30. reg.register(DimensionType.THE_END.getId() + 1, new ResourceLocation("minecraft", "the_end"), DimensionType.THE_END);
  31. }
  32. private static ResourceLocation getRegistry(DimensionType type)
  33. {
  34. ResourceLocation rl = type.getRegistryName();
  35. if(rl != null)
  36. {
  37. return rl;
  38. }
  39. rl = DimensionManager.getRegistry().getKey(type);
  40. if(rl == null)
  41. {
  42. return null;
  43. }
  44. type.setRegistryName(rl);
  45. return rl;
  46. }
  47. public static void forEachType(Consumer<DimensionType> c)
  48. {
  49. DimensionManager.getRegistry().iterator().forEachRemaining((type) ->
  50. {
  51. getRegistry(type);
  52. c.accept(type);
  53. });
  54. }
  55. private static DimensionType getType(ResourceLocation rl)
  56. {
  57. return DimensionManager.getRegistry().getOrDefault(rl);
  58. }
  59. private static ServerWorld getWorld(MinecraftServer server, DimensionType type, boolean force)
  60. {
  61. return DimensionManager.getWorld(server, type, force, force);
  62. }
  63. private static boolean containsRegistry(ResourceLocation rl)
  64. {
  65. return DimensionManager.getRegistry().getOrDefault(rl) != null;
  66. }
  67. private static void unregister(ResourceLocation rl, DimensionType removeType)
  68. {
  69. // unregister the id
  70. try
  71. {
  72. // data might not be set
  73. DimensionManager.unregisterDimension(removeType.getId() + 1);
  74. }
  75. catch(Exception ex)
  76. {
  77. }
  78. // remove entry in "savedEntries"
  79. ReflectionUtils.removeDimensionSaveEntry(rl);
  80. // remove the registry
  81. ClearableRegistry<DimensionType> reg = (ClearableRegistry<DimensionType>) DimensionManager.getRegistry();
  82. ArrayList<ResourceLocation> regs = new ArrayList<>();
  83. ArrayList<DimensionType> types = new ArrayList<>();
  84. for(DimensionType type : reg)
  85. {
  86. if(type == removeType)
  87. {
  88. continue;
  89. }
  90. types.add(type);
  91. regs.add(reg.getKey(type));
  92. }
  93. reg.clear();
  94. for(int i = 0; i < regs.size(); i++)
  95. {
  96. DimensionType type = types.get(i);
  97. reg.register(type.getId() + 1, regs.get(i), type);
  98. }
  99. }
  100. // -------------------------------------------------------------------------
  101. // normal stuff
  102. // -------------------------------------------------------------------------
  103. public static String getName(IWorld ws)
  104. {
  105. if(ws == null)
  106. {
  107. return "null";
  108. }
  109. DimensionType type = ws.getDimension().getType();
  110. ResourceLocation rl = getRegistry(type);
  111. return rl == null ? "null" : rl.getPath();
  112. }
  113. public static ServerWorld get(MinecraftServer server, String name)
  114. {
  115. String domain;
  116. if(name.equals("overworld") || name.equals("the_nether") || name.equals("the_end"))
  117. {
  118. domain = "minecraft";
  119. }
  120. else
  121. {
  122. domain = KajetansMod.MODID;
  123. }
  124. ResourceLocation rl = new ResourceLocation(domain, name);
  125. DimensionType type = getType(new ResourceLocation(domain, name));
  126. if(type == null)
  127. {
  128. return null;
  129. }
  130. return getWorld(server, type, true);
  131. }
  132. public static boolean register(String name)
  133. {
  134. ResourceLocation rl = new ResourceLocation(KajetansMod.MODID, name);
  135. if(containsRegistry(rl))
  136. {
  137. return false;
  138. }
  139. DimensionType dt = DimensionManager.registerDimension(rl, MOD_DIMENSION, null, true);
  140. DimensionManager.keepLoaded(dt, true);
  141. return true;
  142. }
  143. public static boolean unregister(MinecraftServer server, String name)
  144. {
  145. ResourceLocation rl = new ResourceLocation(KajetansMod.MODID, name);
  146. DimensionType removeType = getType(rl);
  147. if(removeType == null)
  148. {
  149. return false;
  150. }
  151. ServerWorld ws = getWorld(server, removeType, false);
  152. if(ws != null)
  153. {
  154. return false;
  155. }
  156. unregister(rl, removeType);
  157. return true;
  158. }
  159. }