WorldManager.java 5.7 KB

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