ChangeWorldEvent.java 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package me.km.dimensions;
  2. import me.km.KajetansMod;
  3. import me.km.api.Location;
  4. import me.km.api.Module;
  5. import me.km.api.ModuleListener;
  6. import me.km.api.SimpleConfig;
  7. import me.km.utils.ReflectionUtils;
  8. import net.minecraft.entity.player.EntityPlayer;
  9. import net.minecraft.inventory.InventoryEnderChest;
  10. import net.minecraft.item.ItemStack;
  11. import net.minecraft.util.FoodStats;
  12. import net.minecraft.util.NonNullList;
  13. import net.minecraftforge.common.DimensionManager;
  14. import net.minecraftforge.event.world.WorldEvent;
  15. import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
  16. import net.minecraftforge.fml.common.gameevent.PlayerEvent;
  17. public class ChangeWorldEvent extends ModuleListener
  18. {
  19. public ChangeWorldEvent(Module m)
  20. {
  21. super(m);
  22. }
  23. @SubscribeEvent
  24. public void onWorldUnload(WorldEvent.Unload e)
  25. {
  26. // doing this should be safe here
  27. int i = e.getWorld().provider.getDimension();
  28. if(i >= -1 && i <= 1)
  29. {
  30. return;
  31. }
  32. if(DimensionManager.isDimensionRegistered(i))
  33. {
  34. DimensionManager.unregisterDimension(i);
  35. ModDimensions.LOADED_DIMS.remove(i);
  36. }
  37. }
  38. @SubscribeEvent
  39. public void changeWorldEvent(PlayerEvent.PlayerChangedDimensionEvent e)
  40. {
  41. if(e.fromDim >= 2 || e.toDim >= 2)
  42. {
  43. savePlayerInventory(e.player, e.fromDim);
  44. loadPlayerInventory(e.player, e.toDim);
  45. }
  46. }
  47. public void savePlayerInventory(EntityPlayer p, int dimension)
  48. {
  49. String s;
  50. if(dimension <= 1)
  51. {
  52. s = DimensionManager.getWorld(0).getWorldInfo().getWorldName();
  53. }
  54. else
  55. {
  56. s = ModDimensions.getWorldName(DimensionManager.getWorld(dimension));
  57. }
  58. SimpleConfig sp = new SimpleConfig(KajetansMod.worldManager, "world/" + p.getUniqueID() + "/" + s + ".yml", false);
  59. // general data
  60. sp.setInt("exp", p.experienceTotal);
  61. FoodStats stats = p.getFoodStats();
  62. sp.setFloat("exhaustion", ReflectionUtils.getExhaustion(stats));
  63. sp.setFloat("saturation", ReflectionUtils.getSaturation(stats));
  64. sp.setInt("foodlevel", stats.getFoodLevel());
  65. sp.setFloat("currenthealth", p.getHealth());
  66. sp.setFloat("maxhealth", 20);
  67. sp.setInt("maxair", p.getAir());
  68. // position in world
  69. sp.setLocation("location", new Location(p.world, p.getPositionVector()));
  70. // main inventory
  71. int counter = 0;
  72. for(ItemStack stack : p.inventory.mainInventory)
  73. {
  74. sp.setItemStack("inv." + counter, stack);
  75. counter++;
  76. }
  77. // armor inventory
  78. counter = 0;
  79. for(ItemStack stack : p.inventory.armorInventory)
  80. {
  81. sp.setItemStack("armor." + counter, stack);
  82. counter++;
  83. }
  84. // offhand inventory
  85. counter = 0;
  86. for(ItemStack stack : p.inventory.offHandInventory)
  87. {
  88. sp.setItemStack("offhand." + counter, stack);
  89. counter++;
  90. }
  91. // enderchest
  92. InventoryEnderChest chest = p.getInventoryEnderChest();
  93. for(counter = 0; counter < chest.getSizeInventory(); counter++)
  94. {
  95. sp.setItemStack("enderchest." + counter, chest.getStackInSlot(counter));
  96. }
  97. if(sp.save())
  98. {
  99. this.getModule().sendToConsole("Der Spieler '" + p.getName() + "' wurde gespeichert.");
  100. return;
  101. }
  102. this.getModule().sendWarningToConsole("Der Spieler '" + p.getName() + "' konnte nicht gespeichert werden.");
  103. }
  104. public void loadPlayerInventory(EntityPlayer p, int dimension)
  105. {
  106. String s;
  107. if(dimension <= 1)
  108. {
  109. s = DimensionManager.getWorld(0).getWorldInfo().getWorldName();
  110. }
  111. else
  112. {
  113. s = ModDimensions.getWorldName(DimensionManager.getWorld(dimension));
  114. }
  115. SimpleConfig sp = new SimpleConfig(KajetansMod.worldManager, "world/" + p.getUniqueID() + "/" + s + ".yml", true);
  116. if(!sp.exists())
  117. {
  118. this.getModule().sendToConsole("Der Spieler '" + p.getName() + "' hat keine Daten in der Welt '" + s + "'.");
  119. p.inventory.clear();
  120. p.experienceTotal = 0;
  121. FoodStats stats = p.getFoodStats();
  122. stats.setFoodLevel(20);
  123. ReflectionUtils.setExhaustion(stats, 1);
  124. ReflectionUtils.setSaturation(stats, 5);
  125. p.setHealth(20);
  126. p.getInventoryEnderChest().clear();
  127. return;
  128. }
  129. // general data
  130. p.experience = 0;
  131. p.experienceTotal = 0;
  132. p.experienceLevel = 0;
  133. p.addExperience(sp.getInt("exp", 0));
  134. FoodStats stats = p.getFoodStats();
  135. ReflectionUtils.setExhaustion(stats, sp.getFloat("exhaustion", 1));
  136. ReflectionUtils.setSaturation(stats, sp.getFloat("saturation", 5));
  137. stats.setFoodLevel(sp.getInt("foodlevel", 20));
  138. p.setHealth(sp.getFloat("currenthealth", 20));
  139. // position in world
  140. //Utils.teleportEntity(p, sp.getLocation("location"));
  141. // main inventory
  142. int counter;
  143. NonNullList<ItemStack> inv = p.inventory.mainInventory;
  144. for(counter = 0; counter < inv.size(); counter++)
  145. {
  146. inv.set(counter, sp.getItemStack("inv." + counter));
  147. counter++;
  148. }
  149. // armor inventory
  150. inv = p.inventory.armorInventory;
  151. for(counter = 0; counter < inv.size(); counter++)
  152. {
  153. inv.set(counter, sp.getItemStack("armor." + counter));
  154. counter++;
  155. }
  156. // offhand inventory
  157. inv = p.inventory.offHandInventory;
  158. for(counter = 0; counter < inv.size(); counter++)
  159. {
  160. inv.set(counter, sp.getItemStack("offhand." + counter));
  161. counter++;
  162. }
  163. // enderchest
  164. InventoryEnderChest chest = p.getInventoryEnderChest();
  165. for(counter = 0; counter < chest.getSizeInventory(); counter++)
  166. {
  167. chest.setInventorySlotContents(counter, sp.getItemStack("enderchest." + counter));
  168. }
  169. this.getModule().sendToConsole("Der Spieler '" + p.getName() + "' wurde geladen.");
  170. }
  171. }