Package com.flansmod.common.vector

Examples of com.flansmod.common.vector.Vector3f


    part = p;
  }

  public DriveablePosition(String[] split)
  {
    this(new Vector3f(Float.parseFloat(split[1]) / 16F, Float.parseFloat(split[2]) / 16F, Float.parseFloat(split[3]) / 16F), EnumDriveablePart.getPart(split[4]));
  }
View Full Code Here


    itemType = type;
  }
 
  public Vector3f getPosition()
  {
    return new Vector3f(x / 16F, y / 16F, z / 16F);
  }
View Full Code Here

  /** Find the entity nearest to the missile's trajectory, anglewise */
  private void getLockOnTarget()
  {
    if(type.lockOnToPlanes || type.lockOnToVehicles || type.lockOnToMechas || type.lockOnToLivings || type.lockOnToPlayers)
    {
      Vector3f motionVec = new Vector3f(motionX, motionY, motionZ);
      Entity closestEntity = null;
      float closestAngle = type.maxLockOnAngle * 3.14159265F / 180F;
     
      for(Object obj : worldObj.loadedEntityList)
      {
        Entity entity = (Entity)obj;
        if((type.lockOnToMechas && entity instanceof EntityMecha) || (type.lockOnToVehicles && entity instanceof EntityVehicle) || (type.lockOnToPlanes && entity instanceof EntityPlane) || (type.lockOnToPlayers && entity instanceof EntityPlayer) || (type.lockOnToLivings && entity instanceof EntityLivingBase))
        {
          Vector3f relPosVec = new Vector3f(entity.posX - posX, entity.posY - posY, entity.posZ - posZ);
          float angle = Math.abs(Vector3f.angle(motionVec, relPosVec));
          if(angle < closestAngle)
          {
            closestEntity = entity;
            closestAngle = angle;
View Full Code Here

      return;
   
    //Create a list for all bullet hits
    ArrayList<BulletHit> hits = new ArrayList<BulletHit>();
   
    Vector3f origin = new Vector3f(posX, posY, posZ);
    Vector3f motion = new Vector3f(motionX, motionY, motionZ);
   
    float speed = motion.length();
   
    //Iterate over all entities
    for(int i = 0; i < worldObj.loadedEntityList.size(); i++)
    {
      Object obj = worldObj.loadedEntityList.get(i);
      //Get driveables
      if(obj instanceof EntityDriveable)
      {
        EntityDriveable driveable = (EntityDriveable)obj;
       
        if(driveable.isDead() || driveable.isPartOfThis(owner))
          continue;
       
        //If this bullet is within the driveable's detection range
        if(getDistanceToEntity(driveable) <= driveable.getDriveableType().bulletDetectionRadius + speed)
        {
          //Raytrace the bullet
          ArrayList<BulletHit> driveableHits = driveable.attackFromBullet(origin, motion);
          hits.addAll(driveableHits);
        }
      }
      //Get players
      else if(obj instanceof EntityPlayer)
      {
        EntityPlayer player = (EntityPlayer)obj;
        PlayerData data = PlayerHandler.getPlayerData(player);
        boolean shouldDoNormalHitDetect = false;
        if(data != null)
        {
          if(player.isDead || data.team == Team.spectators)
          {
            continue;
          }
          if(player == owner && ticksInAir < 20)
            continue;
          int snapshotToTry = pingOfShooter / 50;
          if(snapshotToTry >= data.snapshots.length)
            snapshotToTry = data.snapshots.length - 1;
         
          PlayerSnapshot snapshot = data.snapshots[snapshotToTry];
          if(snapshot == null)
            snapshot = data.snapshots[0];
         
          //DEBUG
          //snapshot = new PlayerSnapshot(player);
         
          //Check one last time for a null snapshot. If this is the case, fall back to normal hit detection
          if(snapshot == null)
            shouldDoNormalHitDetect = true;
          else
          {
            //Raytrace
            ArrayList<BulletHit> playerHits = snapshot.raytrace(origin, motion);
            hits.addAll(playerHits);
          }
        }
       
        //If we couldn't get a snapshot, use normal entity hitbox calculations
        if(data == null || shouldDoNormalHitDetect)
        {
          MovingObjectPosition mop = player.boundingBox.calculateIntercept(origin.toVec3(), Vec3.createVectorHelper(posX + motionX, posY + motionY, posZ + motionZ));
          if(mop != null)
          {
            Vector3f hitPoint = new Vector3f(mop.hitVec.xCoord - posX, mop.hitVec.yCoord - posY, mop.hitVec.zCoord - posZ);
            float hitLambda = 1F;
            if(motion.x != 0F)
              hitLambda = hitPoint.x / motion.x;
            else if(motion.y != 0F)
              hitLambda = hitPoint.y / motion.y;
            else if(motion.z != 0F)
              hitLambda = hitPoint.z / motion.z;
            if(hitLambda < 0)
              hitLambda = -hitLambda;
           
            hits.add(new PlayerBulletHit(new PlayerHitbox(player, new RotatedAxes(), new Vector3f(), new Vector3f(), new Vector3f(), EnumHitboxType.BODY), hitLambda));
          }
        }
      }
      else
      {
        Entity entity = (Entity)obj;
        if(entity != this && entity != owner && !entity.isDead && (entity instanceof EntityLivingBase || entity instanceof EntityAAGun || entity instanceof EntityGrenade))
        {
          MovingObjectPosition mop = entity.boundingBox.calculateIntercept(origin.toVec3(), Vec3.createVectorHelper(posX + motionX, posY + motionY, posZ + motionZ));
          if(mop != null)
          {
            Vector3f hitPoint = new Vector3f(mop.hitVec.xCoord - posX, mop.hitVec.yCoord - posY, mop.hitVec.zCoord - posZ);
            float hitLambda = 1F;
            if(motion.x != 0F)
              hitLambda = hitPoint.x / motion.x;
            else if(motion.y != 0F)
              hitLambda = hitPoint.y / motion.y;
            else if(motion.z != 0F)
              hitLambda = hitPoint.z / motion.z;
            if(hitLambda < 0)
              hitLambda = -hitLambda;
           
            hits.add(new EntityHit(entity, hitLambda));
          }
        }
      }
    }
   
    //Ray trace the bullet by comparing its next position to its current position
    Vec3 posVec = Vec3.createVectorHelper(posX, posY, posZ);
    Vec3 nextPosVec = Vec3.createVectorHelper(posX + motionX, posY + motionY, posZ + motionZ);
    MovingObjectPosition hit = worldObj.func_147447_a(posVec, nextPosVec, false, true, true);
   
    posVec = Vec3.createVectorHelper(posX, posY, posZ);
   
    if(hit != null)
    {
      //Calculate the lambda value of the intercept
      Vec3 hitVec = posVec.subtract(hit.hitVec);
      float lambda = 1;
      //Try each co-ordinate one at a time.
      if(motionX != 0)
        lambda = (float)(hitVec.xCoord / motionX);
      else if(motionY != 0)
        lambda = (float)(hitVec.yCoord / motionY);
      else if(motionZ != 0)
        lambda = (float)(hitVec.zCoord / motionZ);
     
      if(lambda < 0)
        lambda = -lambda;
      hits.add(new BlockHit(hit, lambda));
    }
       
    //We hit something
    if(!hits.isEmpty())
    {
      //Sort the hits according to the intercept position
      Collections.sort(hits);
     
      for(BulletHit bulletHit : hits)
      {
        if(bulletHit instanceof DriveableHit)
        {
          DriveableHit driveableHit = (DriveableHit)bulletHit;
          penetratingPower = driveableHit.driveable.bulletHit(this, driveableHit, penetratingPower);
          if(FlansMod.DEBUG)
            worldObj.spawnEntityInWorld(new EntityDebugDot(worldObj, new Vector3f(posX + motionX * driveableHit.intersectTime, posY + motionY * driveableHit.intersectTime, posZ + motionZ * driveableHit.intersectTime), 1000, 0F, 0F, 1F));

        }
        else if(bulletHit instanceof PlayerBulletHit)
        {
          PlayerBulletHit playerHit = (PlayerBulletHit)bulletHit;
          penetratingPower = playerHit.hitbox.hitByBullet(this, penetratingPower);
          if(FlansMod.DEBUG)
            worldObj.spawnEntityInWorld(new EntityDebugDot(worldObj, new Vector3f(posX + motionX * playerHit.intersectTime, posY + motionY * playerHit.intersectTime, posZ + motionZ * playerHit.intersectTime), 1000, 1F, 0F, 0F));
        }
        else if(bulletHit instanceof EntityHit)
        {
          EntityHit entityHit = (EntityHit)bulletHit;
          if(entityHit.entity.attackEntityFrom(getBulletDamage(false), damage * type.damageVsLiving) && entityHit.entity instanceof EntityLivingBase)
          {
            EntityLivingBase living = (EntityLivingBase)entityHit.entity;
            for(PotionEffect effect : type.hitEffects)
            {
              living.addPotionEffect(new PotionEffect(effect));
            }
            //If the attack was allowed, we should remove their immortality cooldown so we can shoot them again. Without this, any rapid fire gun become useless
            living.arrowHitTimer++;
            living.hurtResistantTime = living.maxHurtResistantTime / 2;
          }
          if(type.setEntitiesOnFire)
            entityHit.entity.setFire(20);
          penetratingPower -= 1F;
          if(FlansMod.DEBUG)
            worldObj.spawnEntityInWorld(new EntityDebugDot(worldObj, new Vector3f(posX + motionX * entityHit.intersectTime, posY + motionY * entityHit.intersectTime, posZ + motionZ * entityHit.intersectTime), 1000, 1F, 1F, 0F));
        }
        else if(bulletHit instanceof BlockHit)
        {
          BlockHit blockHit = (BlockHit)bulletHit;
          MovingObjectPosition raytraceResult = blockHit.raytraceResult;
          //If the hit wasn't an entity hit, then it must've been a block hit
          int xTile = raytraceResult.blockX;
          int yTile = raytraceResult.blockY;
          int zTile = raytraceResult.blockZ;
          if(FlansMod.DEBUG)
            worldObj.spawnEntityInWorld(new EntityDebugDot(worldObj, new Vector3f(raytraceResult.hitVec.xCoord, raytraceResult.hitVec.yCoord, raytraceResult.hitVec.zCoord), 1000, 0F, 1F, 0F));

          Block block = worldObj.getBlock(xTile, yTile, zTile);
          Material mat = block.getMaterial();
          //If the bullet breaks glass, and can do so according to FlansMod, do so.
          if(type.breaksGlass && mat == Material.glass)
          {
            if(TeamsManager.canBreakGlass)
                        {
                            worldObj.setBlockToAir(xTile, yTile, zTile);
                            FlansMod.proxy.playBlockBreakSound(xTile, yTile, zTile, block);
                        }
          }
         
          //penetratingPower -= block.getBlockHardness(worldObj, zTile, zTile, zTile);
          setPosition(hit.hitVec.xCoord, hit.hitVec.yCoord, hit.hitVec.zCoord);
          setDead();
          break;
        }
        if(penetratingPower <= 0F || (type.explodeOnImpact && ticksInAir > 1))
        {
          setPosition(posX + motionX * bulletHit.intersectTime, posY + motionY * bulletHit.intersectTime, posZ + motionZ * bulletHit.intersectTime);
          setDead();
          break;
        }

      }
     
    }
    //Otherwise, do a standard check for uninteresting entities
    /*
    else
    {
      //Iterate over entities close to the bullet to see if any of them have been hit and hit them
      List list = worldObj.getEntitiesWithinAABBExcludingEntity(this, boundingBox.addCoord(motionX, motionY, motionZ).expand(type.hitBoxSize, type.hitBoxSize, type.hitBoxSize));
      for (int l = 0; l < list.size(); l++)
      {
        Entity checkEntity = (Entity) list.get(l);
        //Driveable collisions are handled earlier
        if(checkEntity instanceof EntityDriveable)
          continue;
       
        if(checkEntity instanceof EntityPlayer)
          continue;
       
        //Stop the bullet hitting stuff that can't be collided with or the person shooting immediately after firing it
        if((!checkEntity.canBeCollidedWith() || isPartOfOwner(checkEntity)) && ticksInAir < 20)
        {
          continue;
        }
       
       
        //Calculate the hit damage
        float hitDamage = damage * type.damageVsLiving;
        //Create a damage source object
        DamageSource damagesource = owner == null ? DamageSource.generic : getBulletDamage(false);
 
        //When the damage is 0 (such as with Nerf guns) the entityHurt Forge hook is not called, so this hacky thing is here
        if(hitDamage == 0 && checkEntity instanceof EntityPlayerMP && TeamsManager.getInstance().currentRound != null)
          TeamsManager.getInstance().currentRound.gametype.playerAttacked((EntityPlayerMP)checkEntity, damagesource);
       
        //Attack the entity!
        if(checkEntity.attackEntityFrom(damagesource, hitDamage))
        {
          //If the attack was allowed and the entity is alive, we should remove their immortality cooldown so we can shoot them again. Without this, any rapid fire gun become useless
          if (checkEntity instanceof EntityLivingBase)
          {
            ((EntityLivingBase) checkEntity).arrowHitTimer++;
            ((EntityLivingBase) checkEntity).hurtResistantTime = ((EntityLivingBase) checkEntity).maxHurtResistantTime / 2;
          }
          //Yuck.
          //PacketDispatcher.sendPacketToAllAround(posX, posY, posZ, 50, dimension, PacketPlaySound.buildSoundPacket(posX, posY, posZ, type.hitSound, true));
        }
        //Unless the bullet penetrates, kill it
        if(type.penetratingPower > 0)
        {
          setPosition(checkEntity.posX, checkEntity.posY, checkEntity.posZ);
          setDead();
          break;
        }
      }
    }
    */
 
    //Movement dampening variables
    float drag = 0.99F;
    float gravity = 0.02F;
    //If the bullet is in water, spawn particles and increase the drag
    if (isInWater())
    {
      for(int i = 0; i < 4; i++)
      {
        float bubbleMotion = 0.25F;
        worldObj.spawnParticle("bubble", posX - motionX * bubbleMotion, posY - motionY * bubbleMotion, posZ - motionZ * bubbleMotion, motionX, motionY, motionZ);
      }
      drag = 0.8F;
    }
    motionX *= drag;
    motionY *= drag;
    motionZ *= drag;
    motionY -= gravity * type.fallSpeed;
   
    //Apply homing action
    if(lockedOnTo != null)
    {
      double dX = lockedOnTo.posX - posX;
      double dY = lockedOnTo.posY - posY;
      double dZ = lockedOnTo.posZ - posZ;
      double dXYZ = Math.sqrt(dX * dX + dY * dY + dZ * dZ)
     
      Vector3f relPosVec = new Vector3f(lockedOnTo.posX - posX, lockedOnTo.posY - posY, lockedOnTo.posZ - posZ);
      float angle = Math.abs(Vector3f.angle(motion, relPosVec));
     
      double lockOnPull = angle / 2F * type.lockOnForce;
     
      motionX += lockOnPull * dX / dXYZ;
View Full Code Here

  /** The gun type used by this pilot gun */
  public GunType type;
 
  public PilotGun(String[] split)
  {
    super(new Vector3f(Float.parseFloat(split[1]) / 16F, Float.parseFloat(split[2]) / 16F, Float.parseFloat(split[3]) / 16F), EnumDriveablePart.getPart(split[4]));
    type = GunType.getGun(split[5]);
  }
View Full Code Here

    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);
    }
  }
View Full Code Here

          Vec3 posVec = Vec3.createVectorHelper(entityplayer.posX, entityplayer.posY + 1.62D - entityplayer.yOffset, entityplayer.posZ);       
          Vec3 lookVec = posVec.addVector(sinYaw * cosPitch * length, sinPitch * length, cosYaw * cosPitch * length);
         
          if(world.isRemote && FlansMod.DEBUG)
          {
            world.spawnEntityInWorld(new EntityDebugVector(world, new Vector3f(posVec), new Vector3f(posVec.subtract(lookVec)), 100));
          }
         
          if(type.healDriveables)
          {
        //Iterate over all EntityDriveables
        for(int i = 0; i < world.loadedEntityList.size(); i++)
        {
          Object obj = world.loadedEntityList.get(i);
          if(obj instanceof EntityDriveable)
          {
            EntityDriveable driveable = (EntityDriveable)obj;
            //Raytrace
            DriveablePart part = driveable.raytraceParts(new Vector3f(posVec), Vector3f.sub(new Vector3f(lookVec), new Vector3f(posVec), null));
            //If we hit something that is healable
            if(part != null && part.maxHealth > 0)
            {
              //If its broken and the tool is inifinite or has durability left
              if(part.health < part.maxHealth && (type.toolLife == 0 || itemstack.getItemDamage() < itemstack.getMaxDamage()))
View Full Code Here

    }
    //Set the motions regardless of side.
        motionX = motX;
        motionY = motY;
        motionZ = motZ;
        angularVelocity = new Vector3f(velYaw, velPitch, velRoll);
        throttle = throt;
  }
View Full Code Here

  }
 
  private void shootEach(DriveableType type, DriveablePosition shootPoint, int currentGun, boolean secondary, EnumWeaponType weaponType)
  {
    //Rotate the gun vector to global axes
    Vector3f gunVec = getOrigin(shootPoint);
    Vector3f lookVector = getLookVector(shootPoint);
   
    //If its a pilot gun, then it is using a gun type, so do the following
    if(shootPoint instanceof PilotGun)
    {
      PilotGun pilotGun = (PilotGun)shootPoint;
      //Get the gun from the plane type and the ammo from the data
      GunType gunType = pilotGun.type;
      ItemStack bulletItemStack = driveableData.ammo[getDriveableType().numPassengerGunners + currentGun];
      //Check that neither is null and that the bullet item is actually a bullet
      if(gunType != null && bulletItemStack != null && bulletItemStack.getItem() instanceof ItemShootable && TeamsManager.bulletsEnabled)
      {
        ShootableType bullet = ((ItemShootable)bulletItemStack.getItem()).type;
        if(gunType.isAmmo(bullet))
        {
          //Spawn a new bullet item
          worldObj.spawnEntityInWorld(((ItemShootable)bulletItemStack.getItem()).getEntity(worldObj, Vector3f.add(gunVec, new Vector3f((float)posX, (float)posY, (float)posZ), null), lookVector, (EntityLivingBase)seats[0].riddenByEntity, gunType.bulletSpread / 2, gunType.damage, 2.0F,bulletItemStack.getItemDamage(), type));
          //Play the shoot sound
          PacketPlaySound.sendSoundPacket(posX, posY, posZ, FlansMod.soundRange, dimension, type.shootSound(secondary), false);
          //Get the bullet item damage and increment it
          int damage = bulletItemStack.getItemDamage();
          bulletItemStack.setItemDamage(damage + 1)
          //If the bullet item is completely damaged (empty)
          if(damage + 1 == bulletItemStack.getMaxDamage())
          {
            //Set the damage to 0 and consume one ammo item (unless in creative)
            bulletItemStack.setItemDamage(0);
            if(seats[0].riddenByEntity instanceof EntityPlayer && !((EntityPlayer)seats[0].riddenByEntity).capabilities.isCreativeMode)
            {
              bulletItemStack.stackSize--;
              if(bulletItemStack.stackSize <= 0)
                bulletItemStack = null;
              driveableData.setInventorySlotContents(getDriveableType().numPassengerGunners + currentGun, bulletItemStack);
            }
          }
          //Reset the shoot delay
          setShootDelay(type.shootDelay(secondary), secondary);
        }
      }
    }
    else //One of the other modes
    {
     
     
      switch(weaponType)
      {   
      case BOMB :
      {
        if(TeamsManager.bombsEnabled)
        {
          int slot = -1;
          for(int i = driveableData.getBombInventoryStart(); i < driveableData.getBombInventoryStart() + type.numBombSlots; i++)
          {
            ItemStack bomb = driveableData.getStackInSlot(i);
            if(bomb != null && bomb.getItem() instanceof ItemBullet && type.isValidAmmo(((ItemBullet)bomb.getItem()).type, weaponType))
            {
              slot = i;
            }
          }
         
          if(slot != -1)
          {
            int spread = 0;
            int damageMultiplier = 1;
            float shellSpeed = 0F;

            ItemStack bulletStack = driveableData.getStackInSlot(slot);
            ItemBullet bulletItem = (ItemBullet)bulletStack.getItem();
            EntityShootable bulletEntity = bulletItem.getEntity(worldObj, Vec3.createVectorHelper(posX + gunVec.x, posY + gunVec.y, posZ + gunVec.z), axes.getYaw(), axes.getPitch(), motionX, motionY, motionZ, (EntityLivingBase)seats[0].riddenByEntity, damageMultiplier, driveableData.getStackInSlot(slot).getItemDamage(), type);
            worldObj.spawnEntityInWorld(bulletEntity);
           
            if(type.shootSound(secondary) != null)
              PacketPlaySound.sendSoundPacket(posX, posY, posZ, FlansMod.soundRange, dimension, type.shootSound(secondary), false);         
            if(seats[0].riddenByEntity instanceof EntityPlayer && !((EntityPlayer)seats[0].riddenByEntity).capabilities.isCreativeMode)
            {
              bulletStack.setItemDamage(bulletStack.getItemDamage() + 1);
              if(bulletStack.getItemDamage() == bulletStack.getMaxDamage())
              {
                bulletStack.setItemDamage(0);
                bulletStack.stackSize--;
                if(bulletStack.stackSize == 0)
                  bulletStack = null;
              }
              driveableData.setInventorySlotContents(slot, bulletStack);
            }
            setShootDelay(type.shootDelay(secondary), secondary);
          }
        }
        break;
      }   
      case MISSILE : //These two are actually almost identical
      case SHELL :
      {
        if(TeamsManager.shellsEnabled)
        {
          int slot = -1;
          for(int i = driveableData.getMissileInventoryStart(); i < driveableData.getMissileInventoryStart() + type.numMissileSlots; i++)
          {
            ItemStack shell = driveableData.getStackInSlot(i);
            if(shell != null && shell.getItem() instanceof ItemBullet && type.isValidAmmo(((ItemBullet)shell.getItem()).type, weaponType))
            {
              slot = i;
            }
          }
         
          if(slot != -1)
          {
            int spread = 0;
            int damageMultiplier = 1;
            float shellSpeed = 3F;

            ItemStack bulletStack = driveableData.getStackInSlot(slot);
            ItemBullet bulletItem = (ItemBullet)bulletStack.getItem();
            EntityShootable bulletEntity = bulletItem.getEntity(worldObj, Vector3f.add(new Vector3f(posX, posY, posZ), gunVec, null), lookVector, (EntityLivingBase)seats[0].riddenByEntity, spread, damageMultiplier, shellSpeed, driveableData.getStackInSlot(slot).getItemDamage(), type);
            worldObj.spawnEntityInWorld(bulletEntity);
           
            if(type.shootSound(secondary) != null)
              PacketPlaySound.sendSoundPacket(posX, posY, posZ, FlansMod.soundRange, dimension, type.shootSound(secondary), false);         
            if(seats[0].riddenByEntity instanceof EntityPlayer && !((EntityPlayer)seats[0].riddenByEntity).capabilities.isCreativeMode)
View Full Code Here

  }
 
  public Vector3f getOrigin(DriveablePosition dp)
  {
    //Rotate the gun vector to global axes
    Vector3f localGunVec = new Vector3f(dp.position);
       
    if(dp.part == EnumDriveablePart.turret)
    {
      //Untranslate by the turret origin, to get the rotation about the right point
      Vector3f.sub(localGunVec, getDriveableType().turretOrigin, localGunVec);
View Full Code Here

TOP

Related Classes of com.flansmod.common.vector.Vector3f

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.