/*******************************************************************************
* Copyright 2014 Tobias Welther
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.race;
import java.util.Collection;
import org.bukkit.entity.Player;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.AbstractHolderManager;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.AbstractTraitHolder;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.DefaultContainer;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.PlayerHolderAssociation;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.permissionsettings.PermissionRegisterer;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.race.reminder.RaceReminder;
import de.tobiyas.racesandclasses.eventprocessing.events.holderevent.HolderSelectedEvent;
import de.tobiyas.racesandclasses.eventprocessing.events.holderevent.raceevent.AfterRaceChangedEvent;
import de.tobiyas.racesandclasses.eventprocessing.events.holderevent.raceevent.AfterRaceSelectedEvent;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayerManager;
import de.tobiyas.racesandclasses.saving.PlayerSavingData;
import de.tobiyas.racesandclasses.util.consts.Consts;
import de.tobiyas.util.config.YAMLConfigExtended;
import de.tobiyas.util.player.PlayerUtils;
public class RaceManager extends AbstractHolderManager {
public RaceManager() {
super(Consts.racesYML, "races");
new RaceReminder();
}
@Override
public void init() {
DefaultContainer.createSTDRaces();
super.init();
checkForPossiblyWrongInitialized();
}
/**
* This is needed to check if players are online on reloads or inits.
* They would not be affected by join events.
*/
private void checkForPossiblyWrongInitialized() {
Collection<? extends Player> players = PlayerUtils.getOnlinePlayers();
for (Player bPlayer : players) {
RaCPlayer player = RaCPlayerManager.get().getPlayer(bPlayer);
RaceContainer container = player.getRace();
if (container == null) {
addPlayerToHolder(player, Consts.defaultRace, false);
container = player.getRace();
}
container.editTABListEntry(player);
}
for (RaCPlayer player : memberList.keySet())
if (memberList.get(player) == null) {
addPlayerToHolder(player, Consts.defaultRace, false);
}
}
@Override
protected AbstractTraitHolder generateTraitHolder(
YAMLConfigExtended traitHolderConfig, String holderName) {
return RaceContainer.loadRace(traitHolderConfig, holderName);
}
@Override
protected String getConfigPrefix() {
return "race";
}
@Override
public AbstractTraitHolder getDefaultHolder() {
return getHolderByName(Consts.defaultRace);
}
@Override
protected void initDefaultHolder() {
traitHolderList.add(RaceContainer.generateSTDRace());
}
@Override
public boolean changePlayerHolder(RaCPlayer player, String newHolderName, boolean callEvent){
if(getHolderByName(newHolderName) == null) return false;
String oldRace = getHolderOfPlayer(player).getDisplayName();
PermissionRegisterer.removePlayer(player, getContainerTypeAsString());
memberList.remove(player);
if(plugin.getConfigManager().getGeneralConfig().isConfig_channels_enable()){
plugin.getChannelManager().playerLeaveRace(oldRace, player);
}
return addPlayerToHolder(player, newHolderName, callEvent);
}
@Override
public boolean addPlayerToHolder(RaCPlayer player, String newHolderName, boolean callEvent){
boolean worked = super.addPlayerToHolder(player, newHolderName, callEvent);
if(worked){
AbstractTraitHolder holder = getHolderOfPlayer(player);
if(holder instanceof RaceContainer){
((RaceContainer)holder).editTABListEntry(player);
}
if(plugin.getConfigManager().getGeneralConfig().isConfig_channels_enable()){
plugin.getChannelManager().playerJoinRace(holder.getDisplayName(), player);
}
}
return worked;
}
@Override
public String getContainerTypeAsString() {
return "race";
}
@Override
protected String getCorrectFieldFromDBHolder(
PlayerHolderAssociation container) {
return container.getRaceName();
}
@Override
protected void saveContainerToDBField(PlayerHolderAssociation container,
String name) {
container.setRaceName(name);
}
@Override
protected HolderSelectedEvent generateAfterSelectEvent(RaCPlayer player,
AbstractTraitHolder newHolder) {
return new AfterRaceSelectedEvent(player.getPlayer(), (RaceContainer)newHolder);
}
@Override
protected AbstractTraitHolder getStartingHolder() {
String race = plugin.getConfigManager().getGeneralConfig().getConfig_takeRaceWhenNoRace();
if(race == null || "".equals(race)){
return getDefaultHolder();
}
AbstractTraitHolder holder = getHolderByName(race);
return holder != null ? holder : getDefaultHolder();
}
@Override
protected HolderSelectedEvent generateAfterChangeEvent(RaCPlayer player, AbstractTraitHolder newHolder, AbstractTraitHolder oldHolder) {
return new AfterRaceChangedEvent(player.getPlayer(), (RaceContainer) newHolder, (RaceContainer) oldHolder);
}
@Override
protected AbstractTraitHolder getHolder(PlayerSavingData data) {
return getHolderByName(data.getRaceName());
}
@Override
protected void saveToContainer(PlayerSavingData data, AbstractTraitHolder holder) {
data.setRaceName(holder.getDisplayName());
}
}