/*******************************************************************************
* 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.arrow;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.TraitHolderCombinder;
import de.tobiyas.racesandclasses.eventprocessing.eventresolvage.resolvers.WorldResolver;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.Trait;
import de.tobiyas.racesandclasses.traitcontainer.traits.arrows.AbstractArrow;
import de.tobiyas.racesandclasses.traitcontainer.traits.statictraits.NormalArrow;
public class ArrowManager {
private ArrayList<AbstractArrow> arrows;
private int currentPointer;
private RaCPlayer player;
private long eventTime;
public ArrowManager(RaCPlayer player){
this.player = player;
arrows = new ArrayList<AbstractArrow>();
currentPointer = 0;
eventTime = 0;
}
public void rescanPlayer(){
arrows.clear();
Set<Trait> traits = TraitHolderCombinder.getSkillTreeReducedTraitsOfPlayer(player);
for(Trait arrow : traits){
if(arrow instanceof AbstractArrow && !arrow.isBindable()){
arrows.add((AbstractArrow) arrow);
}
}
Collections.sort(arrows);
if(arrows.size() < currentPointer) currentPointer = 0;
}
public AbstractArrow nextArrow(){
if(System.currentTimeMillis() - eventTime < 100) return null;
if(arrows.size() <= 0) return null;
if(WorldResolver.isOnDisabledWorld(player)) return null;
currentPointer ++;
if(currentPointer >= arrows.size()) currentPointer = 0;
AbstractArrow arrow = arrows.get(currentPointer);
eventTime = System.currentTimeMillis();
return arrow;
}
public AbstractArrow previousArrow() {
if(System.currentTimeMillis() - eventTime < 100) return null;
if(WorldResolver.isOnDisabledWorld(player)) return null;
if(arrows.size() <= 0) return null;
currentPointer --;
if(currentPointer < 0) currentPointer = arrows.size() - 1;
AbstractArrow arrow = arrows.get(currentPointer);
eventTime = System.currentTimeMillis();
return arrow;
}
public AbstractArrow getCurrentArrow(){
if(WorldResolver.isOnDisabledWorld(player)) return null;
if(arrows.size() <= 0) rescanPlayer();
if(arrows.size() <= 0) return null;
AbstractArrow arrow = arrows.get(currentPointer);
return arrow;
}
/**
* Returns the amounts of Arrows Types the Player has.
* <br>This EXCLUDES the NormalArrow!
*
* @return number of different arrow types
*/
public int getNumberOfArrowTypes(){
return WorldResolver.isOnDisabledWorld(player) ? 0 : arrows.size() - 1;
}
/**
* If the player has any arrow (except for default arrow).
* @return true if has any.
*/
public boolean hasAnyArrow(){
int size = arrows.size();
switch(size){
case 0 : return false;
case 1 : return !(arrows.get(0) instanceof NormalArrow);
default : return true;
}
}
/**
* Returns all available Arrows.
* @return arrows.
*/
public List<AbstractArrow> getAllArrows() {
if(WorldResolver.isOnDisabledWorld(player)) return new ArrayList<AbstractArrow>();
else return new ArrayList<AbstractArrow>(this.arrows);
}
}