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}