001/* 002 * Trident - A Multithreaded Server Alternative 003 * Copyright 2014 The TridentSDK Team 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package net.tridentsdk.server.service; 018 019import com.google.common.collect.ForwardingCollection; 020import com.google.common.collect.ImmutableMap; 021import net.tridentsdk.concurrent.Scheduler; 022import net.tridentsdk.concurrent.SelectableThreadPool; 023import net.tridentsdk.entity.living.Player; 024import net.tridentsdk.event.Events; 025import net.tridentsdk.inventory.Inventories; 026import net.tridentsdk.inventory.crafting.RecipeManager; 027import net.tridentsdk.meta.component.MetaProvider; 028import net.tridentsdk.plugin.Plugins; 029import net.tridentsdk.plugin.channel.PluginChannels; 030import net.tridentsdk.plugin.cmd.Commands; 031import net.tridentsdk.registry.Implementation; 032import net.tridentsdk.registry.PlayerStatus; 033import net.tridentsdk.registry.Players; 034import net.tridentsdk.server.concurrent.ConcurrentTaskExecutor; 035import net.tridentsdk.server.concurrent.TridentTaskScheduler; 036import net.tridentsdk.server.crafting.TridentRecipeManager; 037import net.tridentsdk.server.data.MetaProviderFactory; 038import net.tridentsdk.server.event.EventHandler; 039import net.tridentsdk.server.inventory.TridentInventories; 040import net.tridentsdk.server.packets.play.out.PacketPlayOutPluginMessage; 041import net.tridentsdk.server.player.OfflinePlayer; 042import net.tridentsdk.server.player.TridentPlayer; 043import net.tridentsdk.server.plugin.CommandHandler; 044import net.tridentsdk.server.plugin.PluginHandler; 045import net.tridentsdk.server.world.TridentWorldLoader; 046import net.tridentsdk.server.world.change.DefaultMassChange; 047import net.tridentsdk.service.ChatFormatter; 048import net.tridentsdk.service.Transactions; 049import net.tridentsdk.world.MassChange; 050import net.tridentsdk.world.World; 051import net.tridentsdk.world.WorldLoader; 052import net.tridentsdk.world.gen.ChunkGenerator; 053import net.tridentsdk.world.settings.WorldCreateOptions; 054 055import java.util.Collection; 056import java.util.Map; 057import java.util.UUID; 058 059/** 060 * Entry point for plugin API implementations 061 * 062 * @author The TridentSDK Team 063 */ 064public class TridentImpl implements Implementation { 065 private final Scheduler scheduler = TridentTaskScheduler.create(); 066 private final PluginChannels channelHandler = new PluginChannels() { 067 @Override 068 public void sendPluginMessage(String channel, byte... data) { 069 TridentPlayer.sendAll(new PacketPlayOutPluginMessage().set("channel", channel).set("data", data)); 070 } 071 }; 072 private final Inventories windowHandler = new TridentInventories(); 073 private final Events events = EventHandler.create(); 074 private final PlayerStatus status = new Statuses(); 075 private final Plugins plugins = new PluginHandler(); 076 private final Commands commands = new CommandHandler(); 077 private final ChatFormatter formatter = new ChatHandler(); 078 private final Transactions trasacts = new TransactionHandler(); 079 private final MetaProvider metaProviderFactory = new MetaProviderFactory(); 080 private final TridentRecipeManager recipes = new TridentRecipeManager(); 081 082 class PlayersImpl extends ForwardingCollection<Player> implements Players { 083 @Override 084 protected Collection<Player> delegate() { 085 return TridentPlayer.players(); 086 } 087 088 @Override 089 public Player fromUuid(UUID uuid) { 090 return TridentPlayer.getPlayer(uuid); 091 } 092 093 @Override 094 public Player offline(UUID uuid) { 095 return OfflinePlayer.getOfflinePlayer(uuid); 096 } 097 } 098 099 private final Players players = new PlayersImpl(); 100 101 @Override 102 public SelectableThreadPool newPool(int i, String s) { 103 return ConcurrentTaskExecutor.create(i, s); 104 } 105 106 @Override 107 public WorldLoader newLoader(Class<? extends ChunkGenerator> g) { 108 if (g == null) { 109 return new TridentWorldLoader(); 110 } 111 112 return new TridentWorldLoader(new WorldCreateOptions().generator(g)); 113 } 114 115 @Override 116 public MassChange newMc(World world) { 117 return new DefaultMassChange(world); 118 } 119 120 @Override 121 public Map<String, World> worlds() { 122 return ImmutableMap.copyOf(TridentWorldLoader.WORLDS); 123 } 124 125 @Override 126 public MetaProvider meta() { 127 return metaProviderFactory; 128 } 129 130 @Override 131 public Transactions trasacts() { 132 return trasacts; 133 } 134 135 @Override 136 public ChatFormatter format() { 137 return formatter; 138 } 139 140 @Override 141 public Players players() { 142 return players; 143 } 144 145 @Override 146 public PlayerStatus statuses() { 147 return status; 148 } 149 150 @Override 151 public Events events() { 152 return events; 153 } 154 155 @Override 156 public Plugins plugins() { 157 return plugins; 158 } 159 160 @Override 161 public Scheduler scheduler() { 162 return scheduler; 163 } 164 165 @Override 166 public PluginChannels channels() { 167 return channelHandler; 168 } 169 170 @Override 171 public Commands cmds() { 172 return commands; 173 } 174 175 @Override 176 public Inventories inventories() { 177 return windowHandler; 178 } 179 180 @Override 181 public RecipeManager recipe() { 182 return recipes; 183 } 184}