ModDimensions.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package me.km.dimensions;
  2. import java.util.Arrays;
  3. import java.util.Random;
  4. import me.km.KajetansMod;
  5. import net.minecraft.server.MinecraftServer;
  6. import net.minecraft.world.DimensionType;
  7. import net.minecraft.world.ServerWorldEventHandler;
  8. import net.minecraft.world.World;
  9. import net.minecraft.world.WorldServer;
  10. import net.minecraft.world.WorldSettings;
  11. import net.minecraft.world.WorldType;
  12. import net.minecraft.world.storage.ISaveHandler;
  13. import net.minecraft.world.storage.WorldInfo;
  14. import net.minecraftforge.common.DimensionManager;
  15. public class ModDimensions
  16. {
  17. private static int counter = 2;
  18. public static final DimensionType CUSTOM_OVERWORLD = DimensionType.register("CUSTOM_OVERWORLD", "_coverworld", 3, CustomWorldProviderSurface.class, false);
  19. public static final DimensionType CUSTOM_NETHER = DimensionType.register("CUSTOM_NETHER", "_cnether", 2, CustomWorldProviderHell.class, false);
  20. public static final DimensionType CUSTOM_THE_END = DimensionType.register("CUSTOM_THE_END", "_cend", 4, CustomWorldProviderEnd.class, false);
  21. public static String getWorldName(World ws)
  22. {
  23. int dim = ws.provider.getDimension();
  24. switch(dim)
  25. {
  26. case -1: return DimensionManager.getWorld(-1).getWorldInfo().getWorldName() + "_nether";
  27. case 1: return DimensionManager.getWorld(-1).getWorldInfo().getWorldName() + "_end";
  28. }
  29. return ws.getWorldInfo().getWorldName();
  30. }
  31. public static WorldServer getWorldFromName(String s)
  32. {
  33. WorldServer ws = DimensionManager.getWorld(0);
  34. String normal = DimensionManager.getWorld(0).getWorldInfo().getWorldName();
  35. if(s.equals(normal))
  36. {
  37. return ws;
  38. }
  39. else if(s.equals(normal + "_nether"))
  40. {
  41. return DimensionManager.getWorld(-1);
  42. }
  43. else if(s.equals(normal + "_end"))
  44. {
  45. return DimensionManager.getWorld(1);
  46. }
  47. return Arrays.stream(DimensionManager.getWorlds()).filter(w -> w.getWorldInfo().getWorldName().equals(s)).findAny().orElse(null);
  48. }
  49. /** Unloads a world by its name.
  50. *
  51. * @param name the name of the world
  52. * @return false, if world does not exist or cannot be unloaded
  53. */
  54. public static boolean unloadWorld(String name)
  55. {
  56. WorldServer ws = getWorldFromName(name);
  57. if(ws == null)
  58. {
  59. return false;
  60. }
  61. int id = ws.provider.getDimension();
  62. if(id >= -1 && id <= 1)
  63. {
  64. return false;
  65. }
  66. DimensionManager.unregisterDimension(id);
  67. DimensionManager.unloadWorld(id);
  68. return true;
  69. }
  70. /** Loads a world by its name.
  71. *
  72. * @param name the name of the world
  73. * @param type a custom dimension type
  74. * @return false, if the world is already loaded
  75. */
  76. public static boolean loadWorld(String name, DimensionType type)
  77. {
  78. WorldServer ws = getWorldFromName(name);
  79. if(ws != null)
  80. {
  81. return false;
  82. }
  83. loadWorld(type, counter, name);
  84. counter++;
  85. if(counter == Integer.MAX_VALUE)
  86. {
  87. counter = 2;
  88. }
  89. return true;
  90. }
  91. private static void loadWorld(DimensionType type2, int dim, String name)
  92. {
  93. if(!DimensionManager.isDimensionRegistered(dim))
  94. {
  95. DimensionManager.registerDimension(dim, type2);
  96. }
  97. MinecraftServer ms = KajetansMod.server;
  98. ISaveHandler isavehandler = ms.getActiveAnvilConverter().getSaveLoader(name, true);
  99. WorldInfo worldinfo = isavehandler.loadWorldInfo();
  100. WorldSettings worldsettings;
  101. if (worldinfo == null)
  102. {
  103. worldsettings = new WorldSettings((new Random()).nextLong(), ms.getGameType(), ms.canStructuresSpawn(), ms.isHardcore(), WorldType.DEFAULT);
  104. worldsettings.setGeneratorOptions("");
  105. worldinfo = new WorldInfo(worldsettings, name);
  106. }
  107. else
  108. {
  109. worldinfo.setWorldName(name);
  110. worldsettings = new WorldSettings(worldinfo);
  111. }
  112. WorldServer overWorld = (WorldServer) new WorldServer(ms, isavehandler, worldinfo, dim, ms.profiler).init();
  113. overWorld.initialize(worldsettings);
  114. overWorld.addEventListener(new ServerWorldEventHandler(ms, overWorld));
  115. overWorld.getWorldInfo().setGameType(ms.getGameType());
  116. //net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.world.WorldEvent.Load(world));
  117. }
  118. }