Package com.l2jfrozen.gameserver.model

Source Code of com.l2jfrozen.gameserver.model.L2Augmentation$augmentationStatBoni

/* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/

package com.l2jfrozen.gameserver.model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.logging.Level;
import java.util.logging.Logger;

import javolution.util.FastList;

import com.l2jfrozen.Config;
import com.l2jfrozen.gameserver.datatables.SkillTable;
import com.l2jfrozen.gameserver.datatables.xml.AugmentationData;
import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
import com.l2jfrozen.gameserver.skills.Stats;
import com.l2jfrozen.gameserver.skills.funcs.FuncAdd;
import com.l2jfrozen.gameserver.skills.funcs.LambdaConst;
import com.l2jfrozen.util.CloseUtil;
import com.l2jfrozen.util.database.L2DatabaseFactory;

/**
* Used to store an augmentation and its boni
*
* @author durgus
*/
public final class L2Augmentation
{
  private static final Logger _log = Logger.getLogger(L2Augmentation.class.getName());

  private L2ItemInstance _item;
  private int _effectsId = 0;
  private augmentationStatBoni _boni = null;
  private L2Skill _skill = null;

  public L2Augmentation(L2ItemInstance item, int effects, L2Skill skill, boolean save)
  {
    _item = item;
    _effectsId = effects;
    _boni = new augmentationStatBoni(_effectsId);
    _skill = skill;

    // write to DB if save is true
    if(save)
    {
      saveAugmentationData();
    }
  }

  public L2Augmentation(L2ItemInstance item, int effects, int skill, int skillLevel, boolean save)
  {
    this(item, effects, SkillTable.getInstance().getInfo(skill, skillLevel), save);
  }

  // =========================================================
  // Nested Class

  public class augmentationStatBoni
  {
    private Stats _stats[];
    private float _values[];
    private boolean _active;

    public augmentationStatBoni(int augmentationId)
    {
      _active = false;
      FastList<AugmentationData.AugStat> as = AugmentationData.getInstance().getAugStatsById(augmentationId);

      _stats = new Stats[as.size()];
      _values = new float[as.size()];

      int i = 0;
      for(AugmentationData.AugStat aStat : as)
      {
        _stats[i] = aStat.getStat();
        _values[i] = aStat.getValue();
        i++;
      }

      as = null;
    }

    public void applyBoni(L2PcInstance player)
    {
      // make sure the boni are not applyed twice..
      if(_active)
        return;

      for(int i = 0; i < _stats.length; i++)
      {
        player.addStatFunc(new FuncAdd(_stats[i], 0x40, this, new LambdaConst(_values[i])));
      }

      _active = true;
    }

    public void removeBoni(L2PcInstance player)
    {
      // make sure the boni is not removed twice
      if(!_active)
        return;

      player.removeStatsOwner(this);

      _active = false;
    }
  }

  private void saveAugmentationData()
  {
    Connection con = null;
    try
    {
      con = L2DatabaseFactory.getInstance().getConnection(false);

      PreparedStatement statement = con.prepareStatement("INSERT INTO augmentations (item_id,attributes,skill,level) VALUES (?,?,?,?)");
      statement.setInt(1, _item.getObjectId());
      statement.setInt(2, _effectsId);

      if(_skill != null)
      {
        statement.setInt(3, _skill.getId());
        statement.setInt(4, _skill.getLevel());
      }
      else
      {
        statement.setInt(3, 0);
        statement.setInt(4, 0);
      }

      statement.executeUpdate();
      statement.close();
      statement = null;
    }
    catch(Exception e)
    {
      _log.log(Level.SEVERE, "Could not save augmentation for item: " + _item.getObjectId() + " from DB:", e);
    }
    finally
    {
      CloseUtil.close(con);
      con = null;
    }
  }

  public void deleteAugmentationData()
  {
    if(!_item.isAugmented())
      return;

    // delete the augmentation from the database
    Connection con = null;
    try
    {
      con = L2DatabaseFactory.getInstance().getConnection(false);
      PreparedStatement statement = con.prepareStatement("DELETE FROM augmentations WHERE item_id=?");
      statement.setInt(1, _item.getObjectId());
      statement.executeUpdate();
      statement.close();
      statement = null;
    }
    catch(Exception e)
    {
      _log.log(Level.SEVERE, "Could not delete augmentation for item: " + _item.getObjectId() + " from DB:", e);
    }
    finally
    {
      CloseUtil.close(con);
      con = null;
    }
  }

  /**
   * Get the augmentation "id" used in serverpackets.
   *
   * @return augmentationId
   */
  public int getAugmentationId()
  {
    return _effectsId;
  }

  public L2Skill getSkill()
  {
    return _skill;
  }

  /**
   * Applys the boni to the player.
   *
   * @param player
   */
  public void applyBoni(L2PcInstance player)
  {
    _boni.applyBoni(player);

    // add the skill if any
    if(_skill != null)
    {
     
      player.addSkill(_skill);
     
      if(_skill.isActive() && Config.ACTIVE_AUGMENTS_START_REUSE_TIME>0){
        player.disableSkill(_skill.getId(), Config.ACTIVE_AUGMENTS_START_REUSE_TIME);
        player.addTimeStamp(_skill.getId(), Config.ACTIVE_AUGMENTS_START_REUSE_TIME);
      }
     
      player.sendSkillList();
    }
  }

  /**
   * Removes the augmentation boni from the player.
   *
   * @param player
   */
  public void removeBoni(L2PcInstance player)
  {
    _boni.removeBoni(player);

    // remove the skill if any
    if(_skill != null)
    {
      if(_skill.isPassive())
      {
        player.removeSkill(_skill);
      }
      else
      {
        player.removeSkill(_skill, false);
      }
     
      if((_skill.isPassive() && Config.DELETE_AUGM_PASSIVE_ON_CHANGE) || (_skill.isActive() && Config.DELETE_AUGM_ACTIVE_ON_CHANGE)){
       
        // Iterate through all effects currently on the character.
        final L2Effect[] effects = player.getAllEffects();
       
        for(L2Effect currenteffect : effects)
        {
          L2Skill effectSkill = currenteffect.getSkill();

          if(effectSkill.getId() == _skill.getId())
          {
            player.sendMessage("You feel the power of " + effectSkill.getName() + " leaving yourself.");
            currenteffect.exit(false);
          }
        }
       
      }

      player.sendSkillList();

     
    }
  }
}
TOP

Related Classes of com.l2jfrozen.gameserver.model.L2Augmentation$augmentationStatBoni

TOP
Copyright © 2018 www.massapi.com. 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.