/*
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
*/
package silentium.gameserver.model;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import silentium.gameserver.data.xml.AccessLevelsData;
/**
* @author FBIagent<br>
*/
public class L2AccessLevel
{
private static Logger _log = LoggerFactory.getLogger(L2AccessLevel.class.getName());
private int _accessLevel = 0;
private String _name = null;
L2AccessLevel[] _childsAccessLevel = null;
private String _childs = null;
private int _nameColor = 0;
private int _titleColor = 0;
private boolean _isGm = false;
private boolean _allowPeaceAttack = false;
private boolean _allowFixedRes = false;
private boolean _allowTransaction = false;
private boolean _allowAltG = false;
private boolean _giveDamage = false;
private boolean _takeAggro = false;
private boolean _gainExp = false;
/**
* Initializes members<br>
* <br>
*
* @param accessLevel
* as int<br>
* @param name
* as String<br>
* @param nameColor
* as int<br>
* @param titleColor
* as int<br>
* @param childs
* as String<br>
* @param isGm
* as boolean<br>
* @param allowPeaceAttack
* as boolean<br>
* @param allowFixedRes
* as boolean<br>
* @param allowTransaction
* as boolean<br>
* @param allowAltG
* as boolean<br>
* @param giveDamage
* as boolean<br>
* @param takeAggro
* as boolean<br>
* @param gainExp
* as boolean<br>
*/
public L2AccessLevel(int accessLevel, String name, int nameColor, int titleColor, String childs, boolean isGm, boolean allowPeaceAttack, boolean allowFixedRes, boolean allowTransaction, boolean allowAltG, boolean giveDamage, boolean takeAggro, boolean gainExp)
{
_accessLevel = accessLevel;
_name = name;
_nameColor = nameColor;
_titleColor = titleColor;
_childs = childs;
_isGm = isGm;
_allowPeaceAttack = allowPeaceAttack;
_allowFixedRes = allowFixedRes;
_allowTransaction = allowTransaction;
_allowAltG = allowAltG;
_giveDamage = giveDamage;
_takeAggro = takeAggro;
_gainExp = gainExp;
}
public int getLevel()
{
return _accessLevel;
}
public String getName()
{
return _name;
}
public int getNameColor()
{
return _nameColor;
}
public int getTitleColor()
{
return _titleColor;
}
public boolean isGm()
{
return _isGm;
}
public boolean allowPeaceAttack()
{
return _allowPeaceAttack;
}
public boolean allowFixedRes()
{
return _allowFixedRes;
}
public boolean allowTransaction()
{
return _allowTransaction;
}
public boolean allowAltG()
{
return _allowAltG;
}
public boolean canGiveDamage()
{
return _giveDamage;
}
public boolean canTakeAggro()
{
return _takeAggro;
}
public boolean canGainExp()
{
return _gainExp;
}
/**
* Returns if the access level contains allowedAccess as child<br>
* <br>
*
* @param accessLevel
* as AccessLevel<br>
* <br>
* @return boolean: true if a child access level is equals to allowedAccess, otherwise false<br>
*/
public boolean hasChildAccess(L2AccessLevel accessLevel)
{
if (_childsAccessLevel == null)
{
if (_childs == null)
return false;
setChildAccess(_childs);
for (L2AccessLevel childAccess : _childsAccessLevel)
{
if (childAccess != null && (childAccess.getLevel() == accessLevel.getLevel() || childAccess.hasChildAccess(accessLevel)))
return true;
}
}
else
{
for (L2AccessLevel childAccess : _childsAccessLevel)
{
if (childAccess != null && (childAccess.getLevel() == accessLevel.getLevel() || childAccess.hasChildAccess(accessLevel)))
return true;
}
}
return false;
}
private void setChildAccess(String childs)
{
String[] childsSplit = childs.split(";");
_childsAccessLevel = new L2AccessLevel[childsSplit.length];
for (int i = 0; i < childsSplit.length; ++i)
{
L2AccessLevel accessLevelInst = AccessLevelsData.getInstance().getAccessLevel(Integer.parseInt(childsSplit[i]));
if (accessLevelInst == null)
{
_log.warn("AccessLevel: Undefined child access level " + childsSplit[i]);
continue;
}
if (accessLevelInst.hasChildAccess(this))
{
_log.warn("AccessLevel: Child access tree overlapping for " + _name + " and " + accessLevelInst.getName());
continue;
}
_childsAccessLevel[i] = accessLevelInst;
}
}
}