package dex3r.main.factions;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import cpw.mods.fml.common.ITickHandler;
import cpw.mods.fml.common.TickType;
import dex3r.main.DexMain;
import dex3r.main.factions.skills.FactionSkill;
import dex3r.main.factions.skills.Skill;
public class Faction implements ITickHandler
{
public static List<Faction> factions;
public static HashMap<String, FactionMember> allMembers;
public static final HashMap<Integer, FactionLevel> STATS;
public int lvl;
public int maxMembers;
public String owner;
public List<FactionMember> members;
public List<Faction> enemies;
public List<Faction> allies;
private int xp;
public String name;
public FactionSkill[] skills;
public int activeSkills;
public Faction(String owner, String name)
{
this.owner = owner;
lvl = 1;
maxMembers = 5;
this.name = name;
members = new ArrayList<FactionMember>();
members.add(new FactionMember(this, owner, FactionMemberRank.Owner));
enemies = new ArrayList<Faction>();
allies = new ArrayList<Faction>();
skills = new FactionSkill[4];
activeSkills = 0;
}
public static void init()
{
}
public static Faction getFaction(String name)
{
for (Faction f : factions)
{
if (f.name.equals(name))
{
return f;
}
}
return null;
}
public void tick()
{
if(activeSkills > 0)
{
for(int i = 0; i < skills.length; i++)
{
skills[i].tick();
if(skills[i].timeLeft > 0)
{
skills[i].timeLeft--;
if(skills[i].timeLeft == 0)
{
activeSkills--;
}
}
}
FactionSkill rk = getSkill(Skill.Regeneration);
if(rk.isActive())
{
if(rk.ticks == 0)
{
for (FactionMember member : members)
{
if (member.onWar && member.getPlayer() != null)
{
member.getPlayer().heal(1);
}
}
}
rk.ticks = rk.getPower();
}
}
}
public boolean addAlly(Faction newF)
{
if(allies.contains(newF))
{
return false;
}
else if(enemies.contains(newF))
{
enemies.remove(newF);
}
allies.add(newF);
return true;
}
public boolean addEnemy(Faction newF)
{
if(enemies.contains(newF))
{
return false;
}
else if(allies.contains(newF))
{
allies.remove(newF);
}
enemies.add(newF);
return true;
}
public boolean addNeutral(Faction newF)
{
if(!enemies.contains(newF) && !allies.contains(newF))
{
return false;
}
enemies.remove(newF);
allies.remove(newF);
return true;
}
public FactionSkill getSkill(Skill skill)
{
for (int i = 0; i < skills.length; i++)
{
if (skills[i].getName().equals(skill.getName()))
{
return skills[i];
}
}
throw new IllegalArgumentException("Nie ma takiego skilla!");
}
public void castSkill(String caller, Skill skill)
{
if (!getMember(caller).rank.canCastSkills)
{
return;
}
FactionSkill s = getSkill(skill);
if (s.cooldown > 0)
{
return;
}
for (FactionMember member : members)
{
if (member.onWar)
{
if (skill == Skill.HealthRestore)
{
member.getPlayer().heal(s.getPower());
}
}
}
activeSkills++;
s.cooldown = s.getCooldown();
}
public boolean addMember(String caller, String target)
{
if (!DexMain.isPlayerOnline(caller) || !DexMain.isPlayerOnline(target) || getMember(caller) == null || getMember(target) != null || !getMember(caller).rank.canInvite)
{
return false;
}
FactionMember n = new FactionMember(this, target, FactionMemberRank.Warrior);
members.add(n);
allMembers.put(target, n);
return true;
}
public boolean removeMember(String caller, String target)
{
FactionMember mTarget = getMember(target);
FactionMember mCaller = getMember(caller);
if(!DexMain.isPlayerOnline(caller) || mCaller == null || mCaller.rank.isOwner || mTarget == null || (!getMember(caller).rank.isDeputy || target == caller) || mTarget.faction != this)
{
return false;
}
members.remove(mTarget);
allMembers.remove(target);
return true;
}
public void editRank(String caller, String target, FactionMemberRank rank)
{
FactionMember mCaller = getMember(caller);
FactionMember mTarget = getMember(target);
if (mCaller == null || mTarget == null || !mTarget.rank.isDeputy)
return;
if (rank == FactionMemberRank.Owner)
{
if (mCaller.rank == FactionMemberRank.Owner)
{
FactionMember fm = getMember(FactionMemberRank.Deputy);
if (fm != null)
{
fm.rank = FactionMemberRank.Diplomat;
}
mCaller.rank = FactionMemberRank.Deputy;
mTarget.rank = FactionMemberRank.Owner;
}
else
{
return;
}
}
else if (rank == FactionMemberRank.Deputy)
{
if (mCaller.rank == FactionMemberRank.Owner)
{
FactionMember fm = getMember(FactionMemberRank.Deputy);
if (fm != null)
{
fm.rank = FactionMemberRank.Diplomat;
}
mTarget.rank = FactionMemberRank.Deputy;
}
else
{
return;
}
}
else
{
mTarget.rank = rank;
}
}
private FactionMember getMember(String nickname)
{
FactionMember fm = null;
for (FactionMember member : members)
{
if (member.nickname.equals(nickname))
{
fm = member;
break;
}
}
return fm;
}
private FactionMember getMember(FactionMemberRank rank)
{
FactionMember fm = null;
for (FactionMember member : members)
{
if (member.rank == rank)
{
fm = member;
break;
}
}
return fm;
}
public int addXp(int xp)
{
if(lvl == 30)
{
return xp;
}
xp += xp;
if (STATS.get(lvl).xpToLvl <= xp)
{
lvl++;
int t = xp;
xp = 0;
addXp(t);
}
return 0;
}
public int getXp()
{
return xp;
}
public String getState(String factionName)
{
if (enemies.contains(factionName))
{
return "enemy";
}
else if (allies.contains(factionName))
{
return "ally";
}
return "neutral";
}
@Override
public void tickStart(EnumSet<TickType> type, Object... tickData)
{
tick();
}
@Override
public void tickEnd(EnumSet<TickType> type, Object... tickData)
{
// TODO Auto-generated method stub
}
@Override
public EnumSet<TickType> ticks()
{
EnumSet<TickType> tickTypes = EnumSet.of(TickType.SERVER);
return tickTypes;
}
@Override
public String getLabel()
{
return "FactionsTick";
}
static
{
allMembers = new HashMap<String, FactionMember>();
STATS = new HashMap<Integer, FactionLevel>();
FactionLevel lvl;
int xpToLvl;
double maxChunks = 0;
for (int i = 1; i <= 30; i++)
{
if (i == 1)
{
xpToLvl = 0;
}
else if (i == 2)
{
xpToLvl = 825;
}
else
{
xpToLvl = 825 + ((i * i / 25) * 825);
}
if (i == 1)
{
maxChunks = 4;
}
else
{
maxChunks = maxChunks + 1.22D;
}
lvl = new FactionLevel(i + 4, xpToLvl, (int) Math.ceil(maxChunks));
}
}
}