PageRenderTime 58ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java

http://github.com/sk89q/worldedit
Java | 244 lines | 194 code | 32 blank | 18 comment | 15 complexity | 3566c8a86c14366de00c65a55e158ddd MD5 | raw file
  1. /*
  2. * WorldEdit, a Minecraft world manipulation toolkit
  3. * Copyright (C) sk89q <http://www.sk89q.com>
  4. * Copyright (C) WorldEdit team and contributors
  5. *
  6. * This program is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  18. */
  19. package com.sk89q.worldedit.forge;
  20. import com.google.common.collect.Sets;
  21. import com.sk89q.worldedit.WorldEdit;
  22. import com.sk89q.worldedit.command.util.PermissionCondition;
  23. import com.sk89q.worldedit.entity.Player;
  24. import com.sk89q.worldedit.extension.platform.AbstractPlatform;
  25. import com.sk89q.worldedit.extension.platform.Actor;
  26. import com.sk89q.worldedit.extension.platform.Capability;
  27. import com.sk89q.worldedit.extension.platform.MultiUserPlatform;
  28. import com.sk89q.worldedit.extension.platform.Preference;
  29. import com.sk89q.worldedit.util.SideEffect;
  30. import com.sk89q.worldedit.util.io.ResourceLoader;
  31. import com.sk89q.worldedit.world.DataFixer;
  32. import com.sk89q.worldedit.world.World;
  33. import com.sk89q.worldedit.world.registry.Registries;
  34. import net.minecraft.SharedConstants;
  35. import net.minecraft.commands.Commands;
  36. import net.minecraft.resources.ResourceLocation;
  37. import net.minecraft.server.MinecraftServer;
  38. import net.minecraft.server.dedicated.DedicatedServer;
  39. import net.minecraft.server.level.ServerLevel;
  40. import net.minecraft.server.level.ServerPlayer;
  41. import net.minecraft.server.players.PlayerList;
  42. import net.minecraft.world.level.storage.ServerLevelData;
  43. import net.minecraftforge.fmllegacy.server.ServerLifecycleHooks;
  44. import org.enginehub.piston.Command;
  45. import org.enginehub.piston.CommandManager;
  46. import java.util.ArrayList;
  47. import java.util.Collection;
  48. import java.util.Collections;
  49. import java.util.EnumMap;
  50. import java.util.List;
  51. import java.util.Map;
  52. import java.util.Set;
  53. import javax.annotation.Nullable;
  54. import static java.util.stream.Collectors.toList;
  55. class ForgePlatform extends AbstractPlatform implements MultiUserPlatform {
  56. private final ForgeWorldEdit mod;
  57. private final MinecraftServer server;
  58. private final ForgeDataFixer dataFixer;
  59. private final @Nullable ForgeWatchdog watchdog;
  60. private boolean hookingEvents = false;
  61. private final ResourceLoader resourceLoader = new ForgeResourceLoader(WorldEdit.getInstance());
  62. ForgePlatform(ForgeWorldEdit mod) {
  63. this.mod = mod;
  64. this.server = ServerLifecycleHooks.getCurrentServer();
  65. this.dataFixer = new ForgeDataFixer(getDataVersion());
  66. this.watchdog = server instanceof DedicatedServer
  67. ? new ForgeWatchdog((DedicatedServer) server) : null;
  68. }
  69. boolean isHookingEvents() {
  70. return hookingEvents;
  71. }
  72. @Override
  73. public ResourceLoader getResourceLoader() {
  74. return resourceLoader;
  75. }
  76. @Override
  77. public Registries getRegistries() {
  78. return ForgeRegistries.getInstance();
  79. }
  80. @Override
  81. public int getDataVersion() {
  82. return SharedConstants.getCurrentVersion().getWorldVersion();
  83. }
  84. @Override
  85. public DataFixer getDataFixer() {
  86. return dataFixer;
  87. }
  88. @Override
  89. public boolean isValidMobType(String type) {
  90. return net.minecraftforge.registries.ForgeRegistries.ENTITIES.containsKey(new ResourceLocation(type));
  91. }
  92. @Override
  93. public void reload() {
  94. getConfiguration().load();
  95. super.reload();
  96. }
  97. @Override
  98. public int schedule(long delay, long period, Runnable task) {
  99. return -1;
  100. }
  101. @Override
  102. @Nullable
  103. public ForgeWatchdog getWatchdog() {
  104. return watchdog;
  105. }
  106. @Override
  107. public List<? extends World> getWorlds() {
  108. Iterable<ServerLevel> worlds = server.getAllLevels();
  109. List<World> ret = new ArrayList<>();
  110. for (ServerLevel world : worlds) {
  111. ret.add(new ForgeWorld(world));
  112. }
  113. return ret;
  114. }
  115. @Nullable
  116. @Override
  117. public Player matchPlayer(Player player) {
  118. if (player instanceof ForgePlayer) {
  119. return player;
  120. } else {
  121. ServerPlayer entity = server.getPlayerList().getPlayerByName(player.getName());
  122. return entity != null ? new ForgePlayer(entity) : null;
  123. }
  124. }
  125. @Nullable
  126. @Override
  127. public World matchWorld(World world) {
  128. if (world instanceof ForgeWorld) {
  129. return world;
  130. } else {
  131. for (ServerLevel ws : server.getAllLevels()) {
  132. if (((ServerLevelData) ws.getLevelData()).getLevelName().equals(world.getName())) {
  133. return new ForgeWorld(ws);
  134. }
  135. }
  136. return null;
  137. }
  138. }
  139. @Override
  140. public void registerCommands(CommandManager manager) {
  141. if (server == null) {
  142. return;
  143. }
  144. Commands mcMan = server.getCommands();
  145. for (Command command : manager.getAllCommands().collect(toList())) {
  146. CommandWrapper.register(mcMan.getDispatcher(), command);
  147. Set<String> perms = command.getCondition().as(PermissionCondition.class)
  148. .map(PermissionCondition::getPermissions)
  149. .orElseGet(Collections::emptySet);
  150. if (!perms.isEmpty()) {
  151. perms.forEach(ForgeWorldEdit.inst.getPermissionsProvider()::registerPermission);
  152. }
  153. }
  154. }
  155. @Override
  156. public void setGameHooksEnabled(boolean enabled) {
  157. this.hookingEvents = enabled;
  158. }
  159. @Override
  160. public ForgeConfiguration getConfiguration() {
  161. return mod.getConfig();
  162. }
  163. @Override
  164. public String getVersion() {
  165. return mod.getInternalVersion();
  166. }
  167. @Override
  168. public String getPlatformName() {
  169. return "Forge-Official";
  170. }
  171. @Override
  172. public String getPlatformVersion() {
  173. return mod.getInternalVersion();
  174. }
  175. @Override
  176. public String getId() {
  177. return "enginehub:forge";
  178. }
  179. @Override
  180. public Map<Capability, Preference> getCapabilities() {
  181. Map<Capability, Preference> capabilities = new EnumMap<>(Capability.class);
  182. capabilities.put(Capability.CONFIGURATION, Preference.PREFER_OTHERS);
  183. capabilities.put(Capability.WORLDEDIT_CUI, Preference.NORMAL);
  184. capabilities.put(Capability.GAME_HOOKS, Preference.NORMAL);
  185. capabilities.put(Capability.PERMISSIONS, Preference.NORMAL);
  186. capabilities.put(Capability.USER_COMMANDS, Preference.NORMAL);
  187. capabilities.put(Capability.WORLD_EDITING, Preference.PREFERRED);
  188. return capabilities;
  189. }
  190. private static final Set<SideEffect> SUPPORTED_SIDE_EFFECTS = Sets.immutableEnumSet(
  191. SideEffect.VALIDATION,
  192. SideEffect.ENTITY_AI,
  193. SideEffect.LIGHTING,
  194. SideEffect.NEIGHBORS,
  195. SideEffect.EVENTS
  196. );
  197. @Override
  198. public Set<SideEffect> getSupportedSideEffects() {
  199. return SUPPORTED_SIDE_EFFECTS;
  200. }
  201. @Override
  202. public Collection<Actor> getConnectedUsers() {
  203. List<Actor> users = new ArrayList<>();
  204. PlayerList scm = server.getPlayerList();
  205. for (ServerPlayer entity : scm.getPlayers()) {
  206. if (entity != null) {
  207. users.add(new ForgePlayer(entity));
  208. }
  209. }
  210. return users;
  211. }
  212. }