package com.flansmod.common;
import java.util.ArrayList;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import com.flansmod.client.FlansModClient;
import com.flansmod.common.guns.EntityGrenade;
import com.flansmod.common.guns.EntityMG;
import com.flansmod.common.guns.GunType;
import com.flansmod.common.guns.ItemGun;
import com.flansmod.common.guns.raytracing.PlayerSnapshot;
import com.flansmod.common.network.PacketSelectOffHandGun;
import com.flansmod.common.teams.IPlayerClass;
import com.flansmod.common.teams.ItemTeamArmour;
import com.flansmod.common.teams.PlayerClass;
import com.flansmod.common.teams.Team;
import com.flansmod.common.vector.Vector3f;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class PlayerData
{
/** Their username */
public String username;
//Movement related fields
/** Roll variables */
public float prevRotationRoll, rotationRoll;
/** Snapshots for bullet hit detection. Array size is set to number of snapshots required. When a new one is taken,
* each snapshot is moved along one place and new one is added at the start, so that when the array fills up, the oldest one is lost */
public PlayerSnapshot[] snapshots;
//Gun related fields
/** The slotID of the gun being used by the off-hand. 0 = no slot. 1 ~ 9 = hotbar slots */
public int offHandGunSlot = 0;
/** The off hand gun stack. For viewing other player's off hand weapons only (since you don't know what is in their inventory and hence just the ID is insufficient) */
@SideOnly(Side.CLIENT)
public ItemStack offHandGunStack;
/** The MG this player is using */
public EntityMG mountingGun;
/** Stops player shooting immediately after swapping weapons */
public int shootClickDelay;
/** The speed of the minigun the player is using */
public float minigunSpeed = 0F;
/** When remote explosives are thrown they are added to this list. When the player uses a remote, the first one from this list detonates */
public ArrayList<EntityGrenade> remoteExplosives = new ArrayList<EntityGrenade>();
/** Sound delay parameters */
public int loopedSoundDelay;
/** Sound delay parameters */
public boolean shouldPlayCooldownSound, shouldPlayWarmupSound;
/** Melee weapon custom hit simulation */
public int meleeProgress, meleeLength;
/** Tickers to stop shooting too fast */
public float shootTimeRight, shootTimeLeft;
/** True if this player is shooting */
public boolean isShootingRight, isShootingLeft;
/** Reloading booleans */
public boolean reloadingRight, reloadingLeft;
/** When the player shoots a burst fire weapon, one shot is fired immediately and this counter keeps track of how many more should be fired */
public int burstRoundsRemainingLeft = 0, burstRoundsRemainingRight = 0;
// Handed getters and setters
public float GetShootTime(boolean bOffHand) { return bOffHand ? shootTimeLeft : shootTimeRight; }
public void SetShootTime(boolean bOffHand, float set) { if(bOffHand) shootTimeLeft = set; else shootTimeRight = set; }
public int GetBurstRoundsRemaining(boolean bOffHand) { return bOffHand ? burstRoundsRemainingLeft : burstRoundsRemainingRight; }
public void SetBurstRoundsRemaining(boolean bOffHand, int set) { if(bOffHand) burstRoundsRemainingLeft = set; else burstRoundsRemainingRight = set; }
public Vector3f[] lastMeleePositions;
//Teams related fields
/** Gametype variables */
public int score, kills, deaths;
/** Zombies variables */
public int zombieScore;
/** Gametype variable for Nerf */
public boolean out;
/** The player's vote for the next round from 1 ~ 5. 0 is not yet voted */
public int vote;
/** The team this player is currently on */
public Team team;
/** The team this player will switch to upon respawning */
public Team newTeam;
/** The class the player is currently using */
public IPlayerClass playerClass;
/** The class the player will switch to upon respawning */
public IPlayerClass newPlayerClass;
/** Keeps the player out of having to rechose their team each round */
public boolean builder;
/** Save the player's skin here, to replace after having done a swap for a certain class override */
@SideOnly(Side.CLIENT)
public ResourceLocation skin;
public PlayerData(String name)
{
username = name;
snapshots = new PlayerSnapshot[FlansMod.numPlayerSnapshots];
}
public void tick(EntityPlayer player)
{
if(player.worldObj.isRemote)
clientTick(player);
if(shootTimeRight > 0)
shootTimeRight--;
if(shootTimeRight == 0)
reloadingRight = false;
if(shootTimeLeft > 0)
shootTimeLeft--;
if(shootTimeLeft == 0)
reloadingLeft = false;
if(shootClickDelay > 0)
shootClickDelay--;
if(loopedSoundDelay > 0)
{
loopedSoundDelay--;
if(loopedSoundDelay == 0 && !isShootingRight)
shouldPlayCooldownSound = true;
}
//Move all snapshots along one place
System.arraycopy(snapshots, 0, snapshots, 1, snapshots.length - 2 + 1);
//Take new snapshot
snapshots[0] = new PlayerSnapshot(player);
}
public void clientTick(EntityPlayer player)
{
if(player.getCurrentEquippedItem() == null
|| !(player.getCurrentEquippedItem().getItem() instanceof ItemGun)
|| ((ItemGun)player.getCurrentEquippedItem().getItem()).GetType().oneHanded
|| player.getCurrentEquippedItem() == offHandGunStack)
{
//offHandGunSlot = 0;
offHandGunStack = null;
}
}
public IPlayerClass getPlayerClass()
{
if(playerClass != newPlayerClass)
playerClass = newPlayerClass;
return playerClass;
}
public void resetScore()
{
score = zombieScore = kills = deaths = 0;
team = newTeam = null;
playerClass = newPlayerClass = null;
}
public void playerKilled()
{
mountingGun = null;
isShootingRight = isShootingLeft = false;
snapshots = new PlayerSnapshot[FlansMod.numPlayerSnapshots];
}
public void selectOffHandWeapon(EntityPlayer player, int slot)
{
if(isValidOffHandWeapon(player, slot))
offHandGunSlot = slot;
}
public boolean isValidOffHandWeapon(EntityPlayer player, int slot)
{
if(slot == 0)
return true;
if(slot - 1 == player.inventory.currentItem)
return false;
ItemStack stackInSlot = player.inventory.getStackInSlot(slot - 1);
if(stackInSlot == null)
return false;
if(stackInSlot.getItem() instanceof ItemGun)
{
ItemGun item = ((ItemGun)stackInSlot.getItem());
if(item.GetType().oneHanded)
return true;
}
return false;
}
public void cycleOffHandItem(EntityPlayer player, int dWheel)
{
if(dWheel < 0)
for(offHandGunSlot = ((offHandGunSlot + 1) % 10); !isValidOffHandWeapon(player, offHandGunSlot); offHandGunSlot = ((offHandGunSlot + 1) % 10)) ;
else if(dWheel > 0)
for(offHandGunSlot = ((offHandGunSlot + 9) % 10); !isValidOffHandWeapon(player, offHandGunSlot); offHandGunSlot = ((offHandGunSlot + 9) % 10)) ;
FlansModClient.currentScope = null;
FlansMod.getPacketHandler().sendToServer(new PacketSelectOffHandGun(offHandGunSlot));
}
public void doMelee(EntityPlayer player, int meleeTime, GunType type)
{
meleeLength = meleeTime;
lastMeleePositions = new Vector3f[type.meleePath.size()];
for(int k = 0; k < type.meleeDamagePoints.size(); k++)
{
Vector3f meleeDamagePoint = type.meleeDamagePoints.get(k);
//Do a raytrace from the prev pos to the current pos and attack anything in the way
Vector3f nextPos = type.meleePath.get(0);
Vector3f nextAngles = type.meleePathAngles.get(0);
RotatedAxes nextAxes = new RotatedAxes(-nextAngles.y, -nextAngles.z, nextAngles.x);
Vector3f nextPosInPlayerCoords = new RotatedAxes(player.rotationYaw + 90F, player.rotationPitch, 0F).findLocalVectorGlobally(nextAxes.findLocalVectorGlobally(meleeDamagePoint));
Vector3f.add(nextPos, nextPosInPlayerCoords, nextPosInPlayerCoords);
if(!FlansMod.proxy.isThePlayer(player))
nextPosInPlayerCoords.y += 1.6F;
lastMeleePositions[k] = new Vector3f(player.posX + nextPosInPlayerCoords.x, player.posY + nextPosInPlayerCoords.y, player.posZ + nextPosInPlayerCoords.z);
}
}
public void WriteToFile()
{
}
public void ReadFromFile()
{
}
}