Replaced Henna CSV data with aCis free version XML data.
This commit is contained in:
@@ -172,4 +172,57 @@ public class Util
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param <T>
|
||||
* @param array - the array to look into
|
||||
* @param obj - the object to search for
|
||||
* @return {@code true} if the {@code array} contains the {@code obj}, {@code false} otherwise.
|
||||
*/
|
||||
public static <T> boolean contains(T[] array, T obj)
|
||||
{
|
||||
for (T element : array)
|
||||
{
|
||||
if (element.equals(obj))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array - the array to look into
|
||||
* @param obj - the integer to search for
|
||||
* @return {@code true} if the {@code array} contains the {@code obj}, {@code false} otherwise
|
||||
*/
|
||||
public static boolean contains(int[] array, int obj)
|
||||
{
|
||||
for (int element : array)
|
||||
{
|
||||
if (element == obj)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array - the array to look into
|
||||
* @param obj - the object to search for
|
||||
* @param ignoreCase
|
||||
* @return {@code true} if the {@code array} contains the {@code obj}, {@code false} otherwise.
|
||||
*/
|
||||
public static boolean contains(String[] array, String obj, boolean ignoreCase)
|
||||
{
|
||||
for (String element : array)
|
||||
{
|
||||
if (element.equals(obj) || (ignoreCase && element.equalsIgnoreCase(obj)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@@ -48,7 +48,6 @@ import org.l2jmobius.gameserver.datatables.OfflineTradeTable;
|
||||
import org.l2jmobius.gameserver.datatables.SchemeBufferTable;
|
||||
import org.l2jmobius.gameserver.datatables.SkillTable;
|
||||
import org.l2jmobius.gameserver.datatables.csv.ExtractableItemsData;
|
||||
import org.l2jmobius.gameserver.datatables.csv.HennaTable;
|
||||
import org.l2jmobius.gameserver.datatables.csv.MapRegionTable;
|
||||
import org.l2jmobius.gameserver.datatables.csv.NpcWalkerRoutesTable;
|
||||
import org.l2jmobius.gameserver.datatables.csv.RecipeTable;
|
||||
@@ -60,7 +59,6 @@ import org.l2jmobius.gameserver.datatables.sql.CharTemplateTable;
|
||||
import org.l2jmobius.gameserver.datatables.sql.ClanTable;
|
||||
import org.l2jmobius.gameserver.datatables.sql.CustomArmorSetsTable;
|
||||
import org.l2jmobius.gameserver.datatables.sql.HelperBuffTable;
|
||||
import org.l2jmobius.gameserver.datatables.sql.HennaTreeTable;
|
||||
import org.l2jmobius.gameserver.datatables.sql.LevelUpData;
|
||||
import org.l2jmobius.gameserver.datatables.sql.NpcTable;
|
||||
import org.l2jmobius.gameserver.datatables.sql.PetDataTable;
|
||||
@@ -74,6 +72,7 @@ import org.l2jmobius.gameserver.datatables.xml.DoorData;
|
||||
import org.l2jmobius.gameserver.datatables.xml.ExperienceData;
|
||||
import org.l2jmobius.gameserver.datatables.xml.FenceData;
|
||||
import org.l2jmobius.gameserver.datatables.xml.FishData;
|
||||
import org.l2jmobius.gameserver.datatables.xml.HennaData;
|
||||
import org.l2jmobius.gameserver.datatables.xml.ZoneData;
|
||||
import org.l2jmobius.gameserver.geoengine.GeoEngine;
|
||||
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
|
||||
@@ -274,15 +273,7 @@ public class GameServer
|
||||
ClanTable.getInstance();
|
||||
CharTemplateTable.getInstance();
|
||||
LevelUpData.getInstance();
|
||||
if (!HennaTable.getInstance().isInitialized())
|
||||
{
|
||||
throw new Exception("Could not initialize the Henna Table");
|
||||
}
|
||||
|
||||
if (!HennaTreeTable.getInstance().isInitialized())
|
||||
{
|
||||
throw new Exception("Could not initialize the Henna Tree Table");
|
||||
}
|
||||
HennaData.getInstance();
|
||||
|
||||
if (!HelperBuffTable.getInstance().isInitialized())
|
||||
{
|
||||
|
@@ -1,160 +0,0 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* 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 org.l2jmobius.gameserver.datatables.csv;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.io.LineNumberReader;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
|
||||
public class HennaTable
|
||||
{
|
||||
private static final Logger LOGGER = Logger.getLogger(HennaTable.class.getName());
|
||||
|
||||
private final Map<Integer, Henna> _henna;
|
||||
private final boolean _initialized = true;
|
||||
|
||||
private HennaTable()
|
||||
{
|
||||
_henna = new HashMap<>();
|
||||
restoreHennaData();
|
||||
}
|
||||
|
||||
private void restoreHennaData()
|
||||
{
|
||||
FileReader reader = null;
|
||||
BufferedReader buff = null;
|
||||
LineNumberReader lnr = null;
|
||||
|
||||
try
|
||||
{
|
||||
final File fileData = new File(Config.DATAPACK_ROOT + "/data/csv/henna.csv");
|
||||
|
||||
reader = new FileReader(fileData);
|
||||
buff = new BufferedReader(reader);
|
||||
lnr = new LineNumberReader(buff);
|
||||
|
||||
String line = null;
|
||||
|
||||
while ((line = lnr.readLine()) != null)
|
||||
{
|
||||
// ignore comments
|
||||
if ((line.trim().length() == 0) || line.startsWith("#"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
final StringTokenizer st = new StringTokenizer(line, ";");
|
||||
|
||||
final StatsSet hennaDat = new StatsSet();
|
||||
final int id = Integer.parseInt(st.nextToken());
|
||||
hennaDat.set("symbol_id", id);
|
||||
st.nextToken(); // next token...ignore name
|
||||
hennaDat.set("dye", Integer.parseInt(st.nextToken()));
|
||||
hennaDat.set("amount", Integer.parseInt(st.nextToken()));
|
||||
hennaDat.set("price", Integer.parseInt(st.nextToken()));
|
||||
hennaDat.set("stat_INT", Integer.parseInt(st.nextToken()));
|
||||
hennaDat.set("stat_STR", Integer.parseInt(st.nextToken()));
|
||||
hennaDat.set("stat_CON", Integer.parseInt(st.nextToken()));
|
||||
hennaDat.set("stat_MEM", Integer.parseInt(st.nextToken()));
|
||||
hennaDat.set("stat_DEX", Integer.parseInt(st.nextToken()));
|
||||
hennaDat.set("stat_WIT", Integer.parseInt(st.nextToken()));
|
||||
|
||||
final Henna template = new Henna(hennaDat);
|
||||
_henna.put(id, template);
|
||||
}
|
||||
|
||||
LOGGER.info("HennaTable: Loaded " + _henna.size() + " Templates.");
|
||||
}
|
||||
catch (FileNotFoundException e)
|
||||
{
|
||||
LOGGER.warning(Config.DATAPACK_ROOT + "/data/csv/henna.csv is missing in data folder");
|
||||
}
|
||||
catch (IOException e0)
|
||||
{
|
||||
LOGGER.warning("Error while creating table: " + e0.getMessage() + "\n" + e0);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (lnr != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
lnr.close();
|
||||
}
|
||||
catch (Exception e1)
|
||||
{
|
||||
LOGGER.warning("Problem with HennaTable: " + e1.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
if (buff != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
buff.close();
|
||||
}
|
||||
catch (Exception e1)
|
||||
{
|
||||
LOGGER.warning("Problem with HennaTable: " + e1.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
if (reader != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
reader.close();
|
||||
}
|
||||
catch (Exception e1)
|
||||
{
|
||||
LOGGER.warning("Problem with HennaTable: " + e1.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isInitialized()
|
||||
{
|
||||
return _initialized;
|
||||
}
|
||||
|
||||
public Henna getTemplate(int id)
|
||||
{
|
||||
return _henna.get(id);
|
||||
}
|
||||
|
||||
public static HennaTable getInstance()
|
||||
{
|
||||
return SingletonHolder.INSTANCE;
|
||||
}
|
||||
|
||||
private static class SingletonHolder
|
||||
{
|
||||
protected static final HennaTable INSTANCE = new HennaTable();
|
||||
}
|
||||
}
|
@@ -1,136 +0,0 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* 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 org.l2jmobius.gameserver.datatables.sql;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.l2jmobius.commons.database.DatabaseFactory;
|
||||
import org.l2jmobius.gameserver.datatables.csv.HennaTable;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.HennaInstance;
|
||||
import org.l2jmobius.gameserver.model.base.ClassId;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
|
||||
public class HennaTreeTable
|
||||
{
|
||||
private static final Logger LOGGER = Logger.getLogger(HennaTreeTable.class.getName());
|
||||
|
||||
private final Map<ClassId, List<HennaInstance>> _hennaTrees;
|
||||
private final boolean _initialized = true;
|
||||
|
||||
private HennaTreeTable()
|
||||
{
|
||||
_hennaTrees = new EnumMap<>(ClassId.class);
|
||||
int classId = 0;
|
||||
int count = 0;
|
||||
|
||||
try (Connection con = DatabaseFactory.getConnection())
|
||||
{
|
||||
final PreparedStatement statement = con.prepareStatement("SELECT class_name, id, parent_id FROM class_list ORDER BY id");
|
||||
final ResultSet classlist = statement.executeQuery();
|
||||
List<HennaInstance> list;
|
||||
|
||||
CLASSLIST: while (classlist.next())
|
||||
{
|
||||
list = new ArrayList<>();
|
||||
classId = classlist.getInt("id");
|
||||
final PreparedStatement statement2 = con.prepareStatement("SELECT class_id, symbol_id FROM henna_trees where class_id=? ORDER BY symbol_id");
|
||||
statement2.setInt(1, classId);
|
||||
final ResultSet hennatree = statement2.executeQuery();
|
||||
|
||||
while (hennatree.next())
|
||||
{
|
||||
final int id = hennatree.getInt("symbol_id");
|
||||
// String name = hennatree.getString("name");
|
||||
final Henna template = HennaTable.getInstance().getTemplate(id);
|
||||
|
||||
if (template == null)
|
||||
{
|
||||
hennatree.close();
|
||||
statement2.close();
|
||||
classlist.close();
|
||||
statement.close();
|
||||
continue CLASSLIST;
|
||||
}
|
||||
|
||||
final HennaInstance temp = new HennaInstance(template);
|
||||
temp.setSymbolId(id);
|
||||
temp.setItemIdDye(template.getDyeId());
|
||||
temp.setAmountDyeRequire(template.getAmountDyeRequire());
|
||||
temp.setPrice(template.getPrice());
|
||||
temp.setStatINT(template.getStatINT());
|
||||
temp.setStatSTR(template.getStatSTR());
|
||||
temp.setStatCON(template.getStatCON());
|
||||
temp.setStatMEM(template.getStatMEM());
|
||||
temp.setStatDEX(template.getStatDEX());
|
||||
temp.setStatWIT(template.getStatWIT());
|
||||
|
||||
list.add(temp);
|
||||
}
|
||||
_hennaTrees.put(ClassId.getClassId(classId), list);
|
||||
|
||||
hennatree.close();
|
||||
statement2.close();
|
||||
|
||||
count += list.size();
|
||||
}
|
||||
|
||||
classlist.close();
|
||||
statement.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LOGGER.warning("Error while creating henna tree for classId " + classId + " " + e);
|
||||
}
|
||||
|
||||
LOGGER.info("HennaTreeTable: Loaded " + count + " Henna Tree Templates.");
|
||||
}
|
||||
|
||||
public HennaInstance[] getAvailableHenna(ClassId classId)
|
||||
{
|
||||
final List<HennaInstance> henna = _hennaTrees.get(classId);
|
||||
if (henna == null)
|
||||
{
|
||||
// the hennatree for this class is undefined, so we give an empty list
|
||||
LOGGER.warning("Hennatree for class " + classId + " is not defined!");
|
||||
return new HennaInstance[0];
|
||||
}
|
||||
|
||||
return henna.toArray(new HennaInstance[henna.size()]);
|
||||
}
|
||||
|
||||
public boolean isInitialized()
|
||||
{
|
||||
return _initialized;
|
||||
}
|
||||
|
||||
public static HennaTreeTable getInstance()
|
||||
{
|
||||
return SingletonHolder.INSTANCE;
|
||||
}
|
||||
|
||||
private static class SingletonHolder
|
||||
{
|
||||
protected static final HennaTreeTable INSTANCE = new HennaTreeTable();
|
||||
}
|
||||
}
|
@@ -52,7 +52,7 @@ public class FishData implements IXmlReader
|
||||
@Override
|
||||
public void parseDocument(Document doc, File f)
|
||||
{
|
||||
// StatsSet used to feed informations.
|
||||
// StatsSet used to feed informations. Cleaned on every entry.
|
||||
final StatsSet set = new StatsSet();
|
||||
|
||||
// First element is never read.
|
||||
|
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* 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 org.l2jmobius.gameserver.datatables.xml;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import org.l2jmobius.commons.util.IXmlReader;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
|
||||
/**
|
||||
* This class loads and stores {@link Henna}s infos. Hennas are called "dye" ingame.
|
||||
*/
|
||||
public class HennaData implements IXmlReader
|
||||
{
|
||||
private final Map<Integer, Henna> _hennas = new HashMap<>();
|
||||
|
||||
protected HennaData()
|
||||
{
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load()
|
||||
{
|
||||
_hennas.clear();
|
||||
parseDatapackFile("data/Hennas.xml");
|
||||
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _hennas.size() + " hennas.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parseDocument(Document doc, File f)
|
||||
{
|
||||
// StatsSet used to feed informations. Cleaned on every entry.
|
||||
final StatsSet set = new StatsSet();
|
||||
|
||||
// First element is never read.
|
||||
final Node n = doc.getFirstChild();
|
||||
|
||||
for (Node node = n.getFirstChild(); node != null; node = node.getNextSibling())
|
||||
{
|
||||
if (!"henna".equalsIgnoreCase(node.getNodeName()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Parse and feed content.
|
||||
final NamedNodeMap attrs = node.getAttributes();
|
||||
for (int i = 0; i < attrs.getLength(); i++)
|
||||
{
|
||||
final Node attr = attrs.item(i);
|
||||
set.set(attr.getNodeName(), attr.getNodeValue());
|
||||
}
|
||||
|
||||
// Feed the map with new data.
|
||||
_hennas.put(set.getInt("symbolId"), new Henna(set));
|
||||
}
|
||||
}
|
||||
|
||||
public Henna getHenna(int id)
|
||||
{
|
||||
return _hennas.get(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all {@link Henna}s available for a {@link PlayerInstance} class.
|
||||
* @param player : The Player used as class parameter.
|
||||
* @return a List of all available Hennas for this Player.
|
||||
*/
|
||||
public List<Henna> getAvailableHennasFor(PlayerInstance player)
|
||||
{
|
||||
return _hennas.values().stream().filter(h -> h.canBeUsedBy(player)).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static HennaData getInstance()
|
||||
{
|
||||
return SingletonHolder.INSTANCE;
|
||||
}
|
||||
|
||||
private static class SingletonHolder
|
||||
{
|
||||
protected static final HennaData INSTANCE = new HennaData();
|
||||
}
|
||||
}
|
@@ -1,214 +0,0 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* 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 org.l2jmobius.gameserver.model.actor.instance;
|
||||
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
|
||||
/**
|
||||
* This class represents a Non-Player-Creature in the world. it can be a monster or a friendly creature. it also uses a template to fetch some static values. the templates are hardcoded in the client, so we can rely on them.
|
||||
*/
|
||||
|
||||
public class HennaInstance
|
||||
{
|
||||
private final Henna _template;
|
||||
private int _symbolId;
|
||||
private int _itemIdDye;
|
||||
private int _price;
|
||||
private int _statINT;
|
||||
private int _statSTR;
|
||||
private int _statCON;
|
||||
private int _statMEM;
|
||||
private int _statDEX;
|
||||
private int _statWIT;
|
||||
private int _amountDyeRequire;
|
||||
|
||||
public HennaInstance(Henna template)
|
||||
{
|
||||
_template = template;
|
||||
_symbolId = _template.symbolId;
|
||||
_itemIdDye = _template.dye;
|
||||
_amountDyeRequire = _template.amount;
|
||||
_price = _template.price;
|
||||
_statINT = _template.statINT;
|
||||
_statSTR = _template.statSTR;
|
||||
_statCON = _template.statCON;
|
||||
_statMEM = _template.statMEM;
|
||||
_statDEX = _template.statDEX;
|
||||
_statWIT = _template.statWIT;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
String res = "";
|
||||
if (_statINT > 0)
|
||||
{
|
||||
res = res + "INT +" + _statINT;
|
||||
}
|
||||
else if (_statSTR > 0)
|
||||
{
|
||||
res = res + "STR +" + _statSTR;
|
||||
}
|
||||
else if (_statCON > 0)
|
||||
{
|
||||
res = res + "CON +" + _statCON;
|
||||
}
|
||||
else if (_statMEM > 0)
|
||||
{
|
||||
res = res + "MEN +" + _statMEM;
|
||||
}
|
||||
else if (_statDEX > 0)
|
||||
{
|
||||
res = res + "DEX +" + _statDEX;
|
||||
}
|
||||
else if (_statWIT > 0)
|
||||
{
|
||||
res = res + "WIT +" + _statWIT;
|
||||
}
|
||||
|
||||
if (_statINT < 0)
|
||||
{
|
||||
res = res + ", INT " + _statINT;
|
||||
}
|
||||
else if (_statSTR < 0)
|
||||
{
|
||||
res = res + ", STR " + _statSTR;
|
||||
}
|
||||
else if (_statCON < 0)
|
||||
{
|
||||
res = res + ", CON " + _statCON;
|
||||
}
|
||||
else if (_statMEM < 0)
|
||||
{
|
||||
res = res + ", MEN " + _statMEM;
|
||||
}
|
||||
else if (_statDEX < 0)
|
||||
{
|
||||
res = res + ", DEX " + _statDEX;
|
||||
}
|
||||
else if (_statWIT < 0)
|
||||
{
|
||||
res = res + ", WIT " + _statWIT;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public Henna getTemplate()
|
||||
{
|
||||
return _template;
|
||||
}
|
||||
|
||||
public int getSymbolId()
|
||||
{
|
||||
return _symbolId;
|
||||
}
|
||||
|
||||
public void setSymbolId(int symbolId)
|
||||
{
|
||||
_symbolId = symbolId;
|
||||
}
|
||||
|
||||
public int getItemIdDye()
|
||||
{
|
||||
return _itemIdDye;
|
||||
}
|
||||
|
||||
public void setItemIdDye(int itemIdDye)
|
||||
{
|
||||
_itemIdDye = itemIdDye;
|
||||
}
|
||||
|
||||
public int getAmountDyeRequire()
|
||||
{
|
||||
return _amountDyeRequire;
|
||||
}
|
||||
|
||||
public void setAmountDyeRequire(int amountDyeRequire)
|
||||
{
|
||||
_amountDyeRequire = amountDyeRequire;
|
||||
}
|
||||
|
||||
public int getPrice()
|
||||
{
|
||||
return _price;
|
||||
}
|
||||
|
||||
public void setPrice(int price)
|
||||
{
|
||||
_price = price;
|
||||
}
|
||||
|
||||
public int getStatINT()
|
||||
{
|
||||
return _statINT;
|
||||
}
|
||||
|
||||
public void setStatINT(int statINT)
|
||||
{
|
||||
_statINT = statINT;
|
||||
}
|
||||
|
||||
public int getStatSTR()
|
||||
{
|
||||
return _statSTR;
|
||||
}
|
||||
|
||||
public void setStatSTR(int statSTR)
|
||||
{
|
||||
_statSTR = statSTR;
|
||||
}
|
||||
|
||||
public int getStatCON()
|
||||
{
|
||||
return _statCON;
|
||||
}
|
||||
|
||||
public void setStatCON(int statCON)
|
||||
{
|
||||
_statCON = statCON;
|
||||
}
|
||||
|
||||
public int getStatMEM()
|
||||
{
|
||||
return _statMEM;
|
||||
}
|
||||
|
||||
public void setStatMEM(int statMEM)
|
||||
{
|
||||
_statMEM = statMEM;
|
||||
}
|
||||
|
||||
public int getStatDEX()
|
||||
{
|
||||
return _statDEX;
|
||||
}
|
||||
|
||||
public void setStatDEX(int statDEX)
|
||||
{
|
||||
_statDEX = statDEX;
|
||||
}
|
||||
|
||||
public int getStatWIT()
|
||||
{
|
||||
return _statWIT;
|
||||
}
|
||||
|
||||
public void setStatWIT(int statWIT)
|
||||
{
|
||||
_statWIT = statWIT;
|
||||
}
|
||||
}
|
@@ -35,7 +35,6 @@ import java.util.concurrent.Future;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
@@ -57,7 +56,6 @@ import org.l2jmobius.gameserver.datatables.HeroSkillTable;
|
||||
import org.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import org.l2jmobius.gameserver.datatables.NobleSkillTable;
|
||||
import org.l2jmobius.gameserver.datatables.SkillTable;
|
||||
import org.l2jmobius.gameserver.datatables.csv.HennaTable;
|
||||
import org.l2jmobius.gameserver.datatables.csv.MapRegionTable;
|
||||
import org.l2jmobius.gameserver.datatables.csv.RecipeTable;
|
||||
import org.l2jmobius.gameserver.datatables.sql.CharTemplateTable;
|
||||
@@ -67,6 +65,7 @@ import org.l2jmobius.gameserver.datatables.sql.SkillTreeTable;
|
||||
import org.l2jmobius.gameserver.datatables.xml.AdminData;
|
||||
import org.l2jmobius.gameserver.datatables.xml.ExperienceData;
|
||||
import org.l2jmobius.gameserver.datatables.xml.FishData;
|
||||
import org.l2jmobius.gameserver.datatables.xml.HennaData;
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
import org.l2jmobius.gameserver.geoengine.GeoEngine;
|
||||
import org.l2jmobius.gameserver.handler.IItemHandler;
|
||||
@@ -413,13 +412,15 @@ public class PlayerInstance extends Playable
|
||||
private final List<PlayerInstance> _snoopListener = new ArrayList<>();
|
||||
private final List<PlayerInstance> _snoopedPlayer = new ArrayList<>();
|
||||
private ClassId _skillLearningClassId;
|
||||
private final HennaInstance[] _henna = new HennaInstance[3];
|
||||
|
||||
private final Henna[] _henna = new Henna[3];
|
||||
private int _hennaSTR;
|
||||
private int _hennaINT;
|
||||
private int _hennaDEX;
|
||||
private int _hennaMEN;
|
||||
private int _hennaWIT;
|
||||
private int _hennaCON;
|
||||
|
||||
private Summon _summon = null;
|
||||
private TamedBeastInstance _tamedBeast = null;
|
||||
private Radar _radar;
|
||||
@@ -9962,61 +9963,6 @@ public class PlayerInstance extends Playable
|
||||
updateEffectIcons();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve from the database all Henna of this PlayerInstance, add them to _henna and calculate stats of the PlayerInstance.<BR>
|
||||
* <BR>
|
||||
*/
|
||||
private void restoreHenna()
|
||||
{
|
||||
try (Connection con = DatabaseFactory.getConnection())
|
||||
{
|
||||
final PreparedStatement statement = con.prepareStatement(RESTORE_CHAR_HENNAS);
|
||||
statement.setInt(1, getObjectId());
|
||||
statement.setInt(2, getClassIndex());
|
||||
final ResultSet rset = statement.executeQuery();
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
_henna[i] = null;
|
||||
}
|
||||
|
||||
while (rset.next())
|
||||
{
|
||||
final int slot = rset.getInt("slot");
|
||||
|
||||
if ((slot < 1) || (slot > 3))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
final int symbol_id = rset.getInt("symbol_id");
|
||||
|
||||
HennaInstance sym = null;
|
||||
|
||||
if (symbol_id != 0)
|
||||
{
|
||||
final Henna tpl = HennaTable.getInstance().getTemplate(symbol_id);
|
||||
|
||||
if (tpl != null)
|
||||
{
|
||||
sym = new HennaInstance(tpl);
|
||||
_henna[slot - 1] = sym;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rset.close();
|
||||
statement.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LOGGER.warning("could not restore henna: " + e);
|
||||
}
|
||||
|
||||
// Calculate Henna modifiers of this PlayerInstance
|
||||
recalcHennaStats();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve from the database all Recommendation data of this PlayerInstance, add to _recomChars and calculate stats of the PlayerInstance.<BR>
|
||||
* <BR>
|
||||
@@ -10043,13 +9989,68 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of Henna empty slot of the PlayerInstance.<BR>
|
||||
* <BR>
|
||||
* @return the henna empty slots
|
||||
* Retrieve from the database all Henna of this Player, add them to _henna and calculate stats of the Player.
|
||||
*/
|
||||
private void restoreHenna()
|
||||
{
|
||||
try (Connection con = DatabaseFactory.getConnection())
|
||||
{
|
||||
PreparedStatement statement = con.prepareStatement(RESTORE_CHAR_HENNAS);
|
||||
statement.setInt(1, getObjectId());
|
||||
statement.setInt(2, getClassIndex());
|
||||
ResultSet rset = statement.executeQuery();
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
_henna[i] = null;
|
||||
}
|
||||
|
||||
while (rset.next())
|
||||
{
|
||||
int slot = rset.getInt("slot");
|
||||
|
||||
if ((slot < 1) || (slot > 3))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
int symbolId = rset.getInt("symbol_id");
|
||||
if (symbolId != 0)
|
||||
{
|
||||
Henna tpl = HennaData.getInstance().getHenna(symbolId);
|
||||
if (tpl != null)
|
||||
{
|
||||
_henna[slot - 1] = tpl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rset.close();
|
||||
statement.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LOGGER.warning("Could not restore henna: " + e);
|
||||
}
|
||||
|
||||
// Calculate Henna modifiers of this Player
|
||||
recalcHennaStats();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the number of Henna empty slot of the Player.
|
||||
*/
|
||||
public int getHennaEmptySlots()
|
||||
{
|
||||
int totalSlots = 1 + getClassId().level();
|
||||
int totalSlots = 0;
|
||||
if (getClassId().level() == 1)
|
||||
{
|
||||
totalSlots = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
totalSlots = 3;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
@@ -10068,10 +10069,9 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a Henna of the PlayerInstance, save update in the character_hennas table of the database and send Server->Client HennaInfo/UserInfo packet to this PlayerInstance.<BR>
|
||||
* <BR>
|
||||
* @param slot the slot
|
||||
* @return true, if successful
|
||||
* Remove a Henna of the Player, save update in the character_hennas table of the database and send HennaInfo/UserInfo packet to this Player.
|
||||
* @param slot The slot number to make checks on.
|
||||
* @return true if successful.
|
||||
*/
|
||||
public boolean removeHenna(int slot)
|
||||
{
|
||||
@@ -10082,106 +10082,89 @@ public class PlayerInstance extends Playable
|
||||
|
||||
slot--;
|
||||
|
||||
final HennaInstance henna = _henna[slot];
|
||||
if (henna == null)
|
||||
if (_henna[slot] == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Henna henna = _henna[slot];
|
||||
_henna[slot] = null;
|
||||
|
||||
try (Connection con = DatabaseFactory.getConnection();
|
||||
PreparedStatement ps = con.prepareStatement(DELETE_CHAR_HENNA))
|
||||
try (Connection con = DatabaseFactory.getConnection())
|
||||
{
|
||||
ps.setInt(1, getObjectId());
|
||||
ps.setInt(2, slot + 1);
|
||||
ps.setInt(3, _classIndex);
|
||||
ps.execute();
|
||||
PreparedStatement statement = con.prepareStatement(DELETE_CHAR_HENNA);
|
||||
|
||||
statement.setInt(1, getObjectId());
|
||||
statement.setInt(2, slot + 1);
|
||||
statement.setInt(3, getClassIndex());
|
||||
|
||||
statement.execute();
|
||||
statement.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LOGGER.log(Level.SEVERE, "Failed removing character henna.", e);
|
||||
LOGGER.warning("Could not remove char henna: " + e);
|
||||
}
|
||||
|
||||
// Calculate Henna modifiers of this PlayerInstance
|
||||
// Calculate Henna modifiers of this Player
|
||||
recalcHennaStats();
|
||||
|
||||
// Send Server->Client HennaInfo packet to this PlayerInstance
|
||||
// Send HennaInfo packet to this Player
|
||||
sendPacket(new HennaInfo(this));
|
||||
|
||||
// Send Server->Client UserInfo packet to this PlayerInstance
|
||||
// Send UserInfo packet to this Player
|
||||
sendPacket(new UserInfo(this));
|
||||
|
||||
reduceAdena("Henna", henna.getPrice() / 5, this, false);
|
||||
|
||||
// Add the recovered dyes to the player's inventory and notify them.
|
||||
_inventory.addItem("Henna", henna.getItemIdDye(), henna.getAmountDyeRequire() / 2, this, null);
|
||||
|
||||
final SystemMessage sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S);
|
||||
sm.addItemName(henna.getItemIdDye());
|
||||
sm.addNumber(henna.getAmountDyeRequire() / 2);
|
||||
sendPacket(sm);
|
||||
|
||||
addItem("Henna", henna.getDyeId(), Henna.getRequiredDyeAmount() / 2, this, true);
|
||||
sendPacket(SystemMessageId.SYMBOL_DELETED);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a Henna to the PlayerInstance, save update in the character_hennas table of the database and send Server->Client HennaInfo/UserInfo packet to this PlayerInstance.<BR>
|
||||
* <BR>
|
||||
* @param henna the henna
|
||||
* @return true, if successful
|
||||
* Add a Henna to the Player, save update in the character_hennas table of the database and send Server->Client HennaInfo/UserInfo packet to this Player.
|
||||
* @param henna The Henna template to add.
|
||||
*/
|
||||
public boolean addHenna(HennaInstance henna)
|
||||
public void addHenna(Henna henna)
|
||||
{
|
||||
if (getHennaEmptySlots() == 0)
|
||||
{
|
||||
sendMessage("You may not have more than three equipped symbols at a time.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// int slot = 0;
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
if (_henna[i] == null)
|
||||
{
|
||||
_henna[i] = henna;
|
||||
|
||||
// Calculate Henna modifiers of this PlayerInstance
|
||||
// Calculate Henna modifiers of this Player
|
||||
recalcHennaStats();
|
||||
|
||||
try (Connection con = DatabaseFactory.getConnection())
|
||||
{
|
||||
final PreparedStatement statement = con.prepareStatement(ADD_CHAR_HENNA);
|
||||
PreparedStatement statement = con.prepareStatement(ADD_CHAR_HENNA);
|
||||
|
||||
statement.setInt(1, getObjectId());
|
||||
statement.setInt(2, henna.getSymbolId());
|
||||
statement.setInt(3, i + 1);
|
||||
statement.setInt(4, getClassIndex());
|
||||
|
||||
statement.execute();
|
||||
statement.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
LOGGER.warning("could not save char henna: " + e);
|
||||
LOGGER.warning("Could not save char henna: " + e);
|
||||
}
|
||||
|
||||
// Send Server->Client HennaInfo packet to this PlayerInstance
|
||||
final HennaInfo hi = new HennaInfo(this);
|
||||
sendPacket(hi);
|
||||
|
||||
// Send Server->Client UserInfo packet to this PlayerInstance
|
||||
final UserInfo ui = new UserInfo(this);
|
||||
sendPacket(ui);
|
||||
|
||||
getInventory().refreshWeight();
|
||||
|
||||
return true;
|
||||
sendPacket(new HennaInfo(this));
|
||||
sendPacket(new UserInfo(this));
|
||||
sendPacket(SystemMessageId.SYMBOL_ADDED);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate Henna modifiers of this PlayerInstance.<BR>
|
||||
* <BR>
|
||||
* Calculate Henna modifiers of this Player.
|
||||
*/
|
||||
private void recalcHennaStats()
|
||||
{
|
||||
@@ -10198,12 +10181,13 @@ public class PlayerInstance extends Playable
|
||||
{
|
||||
continue;
|
||||
}
|
||||
_hennaINT += _henna[i].getStatINT();
|
||||
_hennaSTR += _henna[i].getStatSTR();
|
||||
_hennaMEN += _henna[i].getStatMEM();
|
||||
_hennaCON += _henna[i].getStatCON();
|
||||
_hennaWIT += _henna[i].getStatWIT();
|
||||
_hennaDEX += _henna[i].getStatDEX();
|
||||
|
||||
_hennaINT += _henna[i].getINT();
|
||||
_hennaSTR += _henna[i].getSTR();
|
||||
_hennaMEN += _henna[i].getMEN();
|
||||
_hennaCON += _henna[i].getCON();
|
||||
_hennaWIT += _henna[i].getWIT();
|
||||
_hennaDEX += _henna[i].getDEX();
|
||||
}
|
||||
|
||||
if (_hennaINT > 5)
|
||||
@@ -10238,12 +10222,10 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the Henna of this PlayerInstance corresponding to the selected slot.<BR>
|
||||
* <BR>
|
||||
* @param slot the slot
|
||||
* @return the hennas
|
||||
* @param slot A slot to check.
|
||||
* @return the Henna of this Player corresponding to the selected slot.
|
||||
*/
|
||||
public HennaInstance getHennas(int slot)
|
||||
public Henna getHenna(int slot)
|
||||
{
|
||||
if ((slot < 1) || (slot > 3))
|
||||
{
|
||||
@@ -10253,61 +10235,31 @@ public class PlayerInstance extends Playable
|
||||
return _henna[slot - 1];
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the INT Henna modifier of this PlayerInstance.<BR>
|
||||
* <BR>
|
||||
* @return the henna stat int
|
||||
*/
|
||||
public int getHennaStatINT()
|
||||
{
|
||||
return _hennaINT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the STR Henna modifier of this PlayerInstance.<BR>
|
||||
* <BR>
|
||||
* @return the henna stat str
|
||||
*/
|
||||
public int getHennaStatSTR()
|
||||
{
|
||||
return _hennaSTR;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the CON Henna modifier of this PlayerInstance.<BR>
|
||||
* <BR>
|
||||
* @return the henna stat con
|
||||
*/
|
||||
public int getHennaStatCON()
|
||||
{
|
||||
return _hennaCON;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the MEN Henna modifier of this PlayerInstance.<BR>
|
||||
* <BR>
|
||||
* @return the henna stat men
|
||||
*/
|
||||
public int getHennaStatMEN()
|
||||
{
|
||||
return _hennaMEN;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the WIT Henna modifier of this PlayerInstance.<BR>
|
||||
* <BR>
|
||||
* @return the henna stat wit
|
||||
*/
|
||||
public int getHennaStatWIT()
|
||||
{
|
||||
return _hennaWIT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the DEX Henna modifier of this PlayerInstance.<BR>
|
||||
* <BR>
|
||||
* @return the henna stat dex
|
||||
*/
|
||||
public int getHennaStatDEX()
|
||||
{
|
||||
return _hennaDEX;
|
||||
|
@@ -16,40 +16,46 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.model.actor.instance;
|
||||
|
||||
import org.l2jmobius.gameserver.datatables.sql.HennaTreeTable;
|
||||
import org.l2jmobius.gameserver.datatables.xml.HennaData;
|
||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
|
||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.HennaEquipList;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ItemList;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.HennaRemoveList;
|
||||
|
||||
public class SymbolMakerInstance extends FolkInstance
|
||||
{
|
||||
public SymbolMakerInstance(int objectID, NpcTemplate template)
|
||||
{
|
||||
super(objectID, template);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBypassFeedback(PlayerInstance player, String command)
|
||||
{
|
||||
if (command.equals("Draw"))
|
||||
{
|
||||
final HennaInstance[] henna = HennaTreeTable.getInstance().getAvailableHenna(player.getClassId());
|
||||
final HennaEquipList hel = new HennaEquipList(player, henna);
|
||||
player.sendPacket(hel);
|
||||
|
||||
player.sendPacket(new ItemList(player, false));
|
||||
player.sendPacket(new HennaEquipList(player, HennaData.getInstance().getAvailableHennasFor(player)));
|
||||
}
|
||||
else if (command.equals("RemoveList"))
|
||||
{
|
||||
showRemoveChat(player);
|
||||
}
|
||||
else if (command.startsWith("Remove "))
|
||||
{
|
||||
if (!player.getClient().getFloodProtectors().getTransaction().tryPerformAction("HennaRemove"))
|
||||
boolean hasHennas = false;
|
||||
for (int i = 1; i <= 3; i++)
|
||||
{
|
||||
return;
|
||||
if (player.getHenna(i) != null)
|
||||
{
|
||||
hasHennas = true;
|
||||
}
|
||||
}
|
||||
|
||||
final int slot = Integer.parseInt(command.substring(7));
|
||||
player.removeHenna(slot);
|
||||
|
||||
player.sendPacket(new ItemList(player, false));
|
||||
if (hasHennas)
|
||||
{
|
||||
player.sendPacket(new HennaRemoveList(player));
|
||||
}
|
||||
else
|
||||
{
|
||||
player.sendPacket(SystemMessageId.SYMBOL_NOT_FOUND);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -57,36 +63,6 @@ public class SymbolMakerInstance extends FolkInstance
|
||||
}
|
||||
}
|
||||
|
||||
private void showRemoveChat(PlayerInstance player)
|
||||
{
|
||||
final StringBuilder html1 = new StringBuilder("<html><body>");
|
||||
html1.append("Select symbol you would like to remove:<br><br>");
|
||||
boolean hasHennas = false;
|
||||
|
||||
for (int i = 1; i <= 3; i++)
|
||||
{
|
||||
final HennaInstance henna = player.getHennas(i);
|
||||
|
||||
if (henna != null)
|
||||
{
|
||||
hasHennas = true;
|
||||
html1.append("<a action=\"bypass -h npc_%objectId%_Remove " + i + "\">" + henna.getName() + "</a><br>");
|
||||
}
|
||||
}
|
||||
if (!hasHennas)
|
||||
{
|
||||
html1.append("You don't have any symbol to remove!");
|
||||
}
|
||||
|
||||
html1.append("</body></html>");
|
||||
insertObjectIdAndShowChatWindow(player, html1.toString());
|
||||
}
|
||||
|
||||
public SymbolMakerInstance(int objectID, NpcTemplate template)
|
||||
{
|
||||
super(objectID, template);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHtmlPath(int npcId, int val)
|
||||
{
|
||||
|
@@ -16,84 +16,98 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.model.items;
|
||||
|
||||
import org.l2jmobius.commons.util.Util;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
|
||||
/**
|
||||
* A datatype used to retain Henna infos. Hennas are called "dye" ingame, and enhance {@link PlayerInstance} stats for a fee.<br>
|
||||
* You can draw up to 3 hennas (depending about your current class rank), but accumulated boni for a stat can't be higher than +5. There is no limit in reduction.
|
||||
*/
|
||||
public class Henna
|
||||
{
|
||||
public int symbolId;
|
||||
public String symbolName;
|
||||
public int dye;
|
||||
public int price;
|
||||
public int amount;
|
||||
public int statINT;
|
||||
public int statSTR;
|
||||
public int statCON;
|
||||
public int statMEM;
|
||||
public int statDEX;
|
||||
public int statWIT;
|
||||
private final int _symbolId;
|
||||
private final int _dyeId;
|
||||
private final int _price;
|
||||
private final int _INT;
|
||||
private final int _STR;
|
||||
private final int _CON;
|
||||
private final int _MEN;
|
||||
private final int _DEX;
|
||||
private final int _WIT;
|
||||
private final int[] _classes;
|
||||
|
||||
public Henna(StatsSet set)
|
||||
{
|
||||
symbolId = set.getInt("symbol_id");
|
||||
symbolName = ""; // set.getString("symbol_name");
|
||||
dye = set.getInt("dye");
|
||||
price = set.getInt("price");
|
||||
amount = set.getInt("amount");
|
||||
statINT = set.getInt("stat_INT");
|
||||
statSTR = set.getInt("stat_STR");
|
||||
statCON = set.getInt("stat_CON");
|
||||
statMEM = set.getInt("stat_MEM");
|
||||
statDEX = set.getInt("stat_DEX");
|
||||
statWIT = set.getInt("stat_WIT");
|
||||
_symbolId = set.getInt("symbolId");
|
||||
_dyeId = set.getInt("dyeId");
|
||||
_price = set.getInt("price");
|
||||
_INT = set.getInt("INT");
|
||||
_STR = set.getInt("STR");
|
||||
_CON = set.getInt("CON");
|
||||
_MEN = set.getInt("MEN");
|
||||
_DEX = set.getInt("DEX");
|
||||
_WIT = set.getInt("WIT");
|
||||
_classes = set.getIntArray("classes", ";");
|
||||
}
|
||||
|
||||
public int getSymbolId()
|
||||
{
|
||||
return symbolId;
|
||||
return _symbolId;
|
||||
}
|
||||
|
||||
public int getDyeId()
|
||||
{
|
||||
return dye;
|
||||
return _dyeId;
|
||||
}
|
||||
|
||||
public int getPrice()
|
||||
{
|
||||
return price;
|
||||
return _price;
|
||||
}
|
||||
|
||||
public int getAmountDyeRequire()
|
||||
public static final int getRequiredDyeAmount()
|
||||
{
|
||||
return amount;
|
||||
return 10;
|
||||
}
|
||||
|
||||
public int getStatINT()
|
||||
public int getINT()
|
||||
{
|
||||
return statINT;
|
||||
return _INT;
|
||||
}
|
||||
|
||||
public int getStatSTR()
|
||||
public int getSTR()
|
||||
{
|
||||
return statSTR;
|
||||
return _STR;
|
||||
}
|
||||
|
||||
public int getStatCON()
|
||||
public int getCON()
|
||||
{
|
||||
return statCON;
|
||||
return _CON;
|
||||
}
|
||||
|
||||
public int getStatMEM()
|
||||
public int getMEN()
|
||||
{
|
||||
return statMEM;
|
||||
return _MEN;
|
||||
}
|
||||
|
||||
public int getStatDEX()
|
||||
public int getDEX()
|
||||
{
|
||||
return statDEX;
|
||||
return _DEX;
|
||||
}
|
||||
|
||||
public int getStatWIT()
|
||||
public int getWIT()
|
||||
{
|
||||
return statWIT;
|
||||
return _WIT;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Seek if this {@link Henna} can be used by a {@link PlayerInstance}, based on his classId.
|
||||
* @param player : The Player to check.
|
||||
* @return true if this Henna owns the Player classId.
|
||||
*/
|
||||
public boolean canBeUsedBy(PlayerInstance player)
|
||||
{
|
||||
return Util.contains(_classes, player.getClassId().getId());
|
||||
}
|
||||
}
|
@@ -973,6 +973,21 @@ public class GamePacketHandler implements IPacketHandler<GameClient>, IClientFac
|
||||
msg = new RequestHennaEquip();
|
||||
break;
|
||||
}
|
||||
case 0xbd:
|
||||
{
|
||||
msg = new RequestHennaRemoveList();
|
||||
break;
|
||||
}
|
||||
case 0xbe:
|
||||
{
|
||||
msg = new RequestHennaItemRemoveInfo();
|
||||
break;
|
||||
}
|
||||
case 0xbf:
|
||||
{
|
||||
msg = new RequestHennaRemove();
|
||||
break;
|
||||
}
|
||||
case 0xc0:
|
||||
{
|
||||
// Clan Privileges
|
||||
|
@@ -2328,6 +2328,12 @@ public enum SystemMessageId
|
||||
*/
|
||||
SYMBOL_ADDED(877),
|
||||
|
||||
/**
|
||||
* ID: 878<br>
|
||||
* Message: The symbol has been deleted.
|
||||
*/
|
||||
SYMBOL_DELETED(878),
|
||||
|
||||
/**
|
||||
* ID: 879<br>
|
||||
* Message: The manor system is currently under maintenance.
|
||||
@@ -2436,6 +2442,18 @@ public enum SystemMessageId
|
||||
*/
|
||||
CANT_DRAW_SYMBOL(899),
|
||||
|
||||
/**
|
||||
* ID: 900<br>
|
||||
* Message: No slot exists to draw the symbol
|
||||
*/
|
||||
SYMBOLS_FULL(900),
|
||||
|
||||
/**
|
||||
* ID: 901<br>
|
||||
* Message: The symbol information cannot be found.
|
||||
*/
|
||||
SYMBOL_NOT_FOUND(901),
|
||||
|
||||
/**
|
||||
* ID: 910<br>
|
||||
* Message: Current location : $s1, $s2, $s3 (Near Talking Island Village)
|
||||
|
@@ -21,6 +21,7 @@ import java.util.logging.Logger;
|
||||
import org.l2jmobius.gameserver.model.World;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.GMViewCharacterInfo;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.GMViewHennaInfo;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.GMViewItemList;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.GMViewPledgeInfo;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.GMViewQuestList;
|
||||
@@ -58,6 +59,7 @@ public class RequestGMCommand extends GameClientPacket
|
||||
case 1: // player status
|
||||
{
|
||||
sendPacket(new GMViewCharacterInfo(player));
|
||||
sendPacket(new GMViewHennaInfo(player));
|
||||
break;
|
||||
}
|
||||
case 2: // player clan
|
||||
@@ -81,6 +83,7 @@ public class RequestGMCommand extends GameClientPacket
|
||||
case 5: // player inventory
|
||||
{
|
||||
sendPacket(new GMViewItemList(player));
|
||||
sendPacket(new GMViewHennaInfo(player));
|
||||
break;
|
||||
}
|
||||
case 6: // player warehouse
|
||||
|
@@ -16,18 +16,11 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.clientpackets;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.datatables.csv.HennaTable;
|
||||
import org.l2jmobius.gameserver.datatables.sql.HennaTreeTable;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.HennaInstance;
|
||||
import org.l2jmobius.gameserver.datatables.xml.HennaData;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
|
||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.InventoryUpdate;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ItemList;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||
import org.l2jmobius.gameserver.util.Util;
|
||||
|
||||
public class RequestHennaEquip extends GameClientPacket
|
||||
{
|
||||
@@ -43,74 +36,50 @@ public class RequestHennaEquip extends GameClientPacket
|
||||
protected void runImpl()
|
||||
{
|
||||
final PlayerInstance player = getClient().getPlayer();
|
||||
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!getClient().getFloodProtectors().getTransaction().tryPerformAction("HennaEquip"))
|
||||
final Henna henna = HennaData.getInstance().getHenna(_symbolId);
|
||||
if (henna == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Henna template = HennaTable.getInstance().getTemplate(_symbolId);
|
||||
|
||||
if (template == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final HennaInstance temp = new HennaInstance(template);
|
||||
|
||||
// Prevents henna drawing exploit:
|
||||
// 1) talk to SymbolMakerInstance
|
||||
// 2) RequestHennaList
|
||||
// 3) Don't close the window and go to a GrandMaster and change your subclass
|
||||
// 4) Get SymbolMaker range again and press draw You could draw any kind of henna just having the required subclass...
|
||||
boolean cheater = true;
|
||||
for (HennaInstance h : HennaTreeTable.getInstance().getAvailableHenna(player.getClassId()))
|
||||
{
|
||||
if (h.getSymbolId() == temp.getSymbolId())
|
||||
{
|
||||
cheater = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int count = 0;
|
||||
if ((player.getInventory() != null) && (player.getInventory().getItemByItemId(temp.getItemIdDye()) != null))
|
||||
{
|
||||
count = player.getInventory().getItemByItemId(temp.getItemIdDye()).getCount();
|
||||
}
|
||||
|
||||
if (!cheater && (count >= temp.getAmountDyeRequire()) && (player.getAdena() >= temp.getPrice()) && player.addHenna(temp))
|
||||
{
|
||||
final SystemMessage sm = new SystemMessage(SystemMessageId.S1_DISAPPEARED);
|
||||
sm.addItemName(temp.getItemIdDye());
|
||||
player.sendPacket(sm);
|
||||
player.sendPacket(SystemMessageId.SYMBOL_ADDED);
|
||||
|
||||
player.getInventory().reduceAdena("Henna", temp.getPrice(), player, player.getLastFolkNPC());
|
||||
final ItemInstance dyeToUpdate = player.getInventory().destroyItemByItemId("Henna", temp.getItemIdDye(), temp.getAmountDyeRequire(), player, player.getLastFolkNPC());
|
||||
|
||||
// update inventory
|
||||
final InventoryUpdate iu = new InventoryUpdate();
|
||||
iu.addModifiedItem(player.getInventory().getAdenaInstance());
|
||||
iu.addModifiedItem(dyeToUpdate);
|
||||
player.sendPacket(iu);
|
||||
|
||||
final ItemList il = new ItemList(getClient().getPlayer(), true);
|
||||
sendPacket(il);
|
||||
}
|
||||
else
|
||||
if (!henna.canBeUsedBy(player))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.CANT_DRAW_SYMBOL);
|
||||
|
||||
if (!player.isGM() && cheater)
|
||||
{
|
||||
Util.handleIllegalPlayerAction(player, "Exploit attempt: Character " + player.getName() + " of account " + player.getAccountName() + " tryed to add a forbidden henna.", Config.DEFAULT_PUNISH);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (player.getHennaEmptySlots() == 0)
|
||||
{
|
||||
player.sendPacket(SystemMessageId.SYMBOLS_FULL);
|
||||
return;
|
||||
}
|
||||
|
||||
final ItemInstance ownedDyes = player.getInventory().getItemByItemId(henna.getDyeId());
|
||||
final int count = (ownedDyes == null) ? 0 : ownedDyes.getCount();
|
||||
|
||||
if (count < Henna.getRequiredDyeAmount())
|
||||
{
|
||||
player.sendPacket(SystemMessageId.CANT_DRAW_SYMBOL);
|
||||
return;
|
||||
}
|
||||
|
||||
// reduceAdena sends a message.
|
||||
if (!player.reduceAdena("Henna", henna.getPrice(), player.getLastFolkNPC(), true))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// destroyItemByItemId sends a message.
|
||||
if (!player.destroyItemByItemId("Henna", henna.getDyeId(), Henna.getRequiredDyeAmount(), player, true))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
player.addHenna(henna);
|
||||
}
|
||||
}
|
||||
|
@@ -16,8 +16,7 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.clientpackets;
|
||||
|
||||
import org.l2jmobius.gameserver.datatables.csv.HennaTable;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.HennaInstance;
|
||||
import org.l2jmobius.gameserver.datatables.xml.HennaData;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.HennaItemInfo;
|
||||
@@ -36,22 +35,17 @@ public class RequestHennaItemInfo extends GameClientPacket
|
||||
protected void runImpl()
|
||||
{
|
||||
final PlayerInstance player = getClient().getPlayer();
|
||||
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Henna template = HennaTable.getInstance().getTemplate(_symbolId);
|
||||
|
||||
final Henna template = HennaData.getInstance().getHenna(_symbolId);
|
||||
if (template == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final HennaInstance temp = new HennaInstance(template);
|
||||
|
||||
final HennaItemInfo hii = new HennaItemInfo(temp, player);
|
||||
player.sendPacket(hii);
|
||||
player.sendPacket(new HennaItemInfo(template, player));
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* 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 org.l2jmobius.gameserver.network.clientpackets;
|
||||
|
||||
import org.l2jmobius.gameserver.datatables.xml.HennaData;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.HennaItemRemoveInfo;
|
||||
|
||||
public final class RequestHennaItemRemoveInfo extends GameClientPacket
|
||||
{
|
||||
private int _symbolId;
|
||||
|
||||
@Override
|
||||
protected void readImpl()
|
||||
{
|
||||
_symbolId = readD();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void runImpl()
|
||||
{
|
||||
final PlayerInstance player = getClient().getPlayer();
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Henna template = HennaData.getInstance().getHenna(_symbolId);
|
||||
if (template == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
player.sendPacket(new HennaItemRemoveInfo(template, player));
|
||||
}
|
||||
}
|
@@ -16,18 +16,12 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.clientpackets;
|
||||
|
||||
import org.l2jmobius.gameserver.datatables.sql.HennaTreeTable;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.HennaInstance;
|
||||
import org.l2jmobius.gameserver.datatables.xml.HennaData;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.HennaEquipList;
|
||||
|
||||
/**
|
||||
* RequestHennaList - 0xba
|
||||
* @author Tempy
|
||||
*/
|
||||
public class RequestHennaList extends GameClientPacket
|
||||
{
|
||||
// This is just a trigger packet...
|
||||
@SuppressWarnings("unused")
|
||||
private int _unknown;
|
||||
|
||||
@@ -41,14 +35,11 @@ public class RequestHennaList extends GameClientPacket
|
||||
protected void runImpl()
|
||||
{
|
||||
final PlayerInstance player = getClient().getPlayer();
|
||||
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final HennaInstance[] henna = HennaTreeTable.getInstance().getAvailableHenna(player.getClassId());
|
||||
final HennaEquipList he = new HennaEquipList(player, henna);
|
||||
player.sendPacket(he);
|
||||
player.sendPacket(new HennaEquipList(player, HennaData.getInstance().getAvailableHennasFor(player)));
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* 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 org.l2jmobius.gameserver.network.clientpackets;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
|
||||
/**
|
||||
* format cd
|
||||
*/
|
||||
public final class RequestHennaRemove extends GameClientPacket
|
||||
{
|
||||
private int _symbolId;
|
||||
|
||||
@Override
|
||||
protected void readImpl()
|
||||
{
|
||||
_symbolId = readD();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void runImpl()
|
||||
{
|
||||
final PlayerInstance player = getClient().getPlayer();
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 1; i <= 3; i++)
|
||||
{
|
||||
final Henna henna = player.getHenna(i);
|
||||
if ((henna != null) && (henna.getSymbolId() == _symbolId))
|
||||
{
|
||||
if (player.getAdena() >= (henna.getPrice() / 5))
|
||||
{
|
||||
player.removeHenna(i);
|
||||
break;
|
||||
}
|
||||
player.sendPacket(SystemMessageId.YOU_NOT_ENOUGH_ADENA);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* 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 org.l2jmobius.gameserver.network.clientpackets;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.HennaRemoveList;
|
||||
|
||||
/**
|
||||
* @author Tempy
|
||||
*/
|
||||
public final class RequestHennaRemoveList extends GameClientPacket
|
||||
{
|
||||
@SuppressWarnings("unused")
|
||||
private int _unknown;
|
||||
|
||||
@Override
|
||||
protected void readImpl()
|
||||
{
|
||||
_unknown = readD(); // ??
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void runImpl()
|
||||
{
|
||||
final PlayerInstance player = getClient().getPlayer();
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
player.sendPacket(new HennaRemoveList(player));
|
||||
}
|
||||
}
|
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* 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 org.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
|
||||
public class GMViewHennaInfo extends GameServerPacket
|
||||
{
|
||||
private final PlayerInstance _player;
|
||||
private final Henna[] _hennas = new Henna[3];
|
||||
private int _count;
|
||||
|
||||
public GMViewHennaInfo(PlayerInstance player)
|
||||
{
|
||||
_player = player;
|
||||
_count = 0;
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
final Henna h = _player.getHenna(i + 1);
|
||||
if (h != null)
|
||||
{
|
||||
_hennas[_count++] = h;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void writeImpl()
|
||||
{
|
||||
writeC(0xea);
|
||||
|
||||
writeC(_player.getHennaStatINT());
|
||||
writeC(_player.getHennaStatSTR());
|
||||
writeC(_player.getHennaStatCON());
|
||||
writeC(_player.getHennaStatMEN());
|
||||
writeC(_player.getHennaStatDEX());
|
||||
writeC(_player.getHennaStatWIT());
|
||||
|
||||
writeD(3); // slots?
|
||||
|
||||
writeD(_count); // size
|
||||
for (int i = 0; i < _count; i++)
|
||||
{
|
||||
writeD(_hennas[i].getSymbolId());
|
||||
writeD(_hennas[i].canBeUsedBy(_player) ? _hennas[i].getSymbolId() : 0);
|
||||
}
|
||||
}
|
||||
}
|
@@ -16,15 +16,17 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.instance.HennaInstance;
|
||||
import java.util.List;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
|
||||
public class HennaEquipList extends GameServerPacket
|
||||
{
|
||||
private final PlayerInstance _player;
|
||||
private final HennaInstance[] _hennaEquipList;
|
||||
private final List<Henna> _hennaEquipList;
|
||||
|
||||
public HennaEquipList(PlayerInstance player, HennaInstance[] hennaEquipList)
|
||||
public HennaEquipList(PlayerInstance player, List<Henna> hennaEquipList)
|
||||
{
|
||||
_player = player;
|
||||
_hennaEquipList = hennaEquipList;
|
||||
@@ -34,32 +36,21 @@ public class HennaEquipList extends GameServerPacket
|
||||
protected final void writeImpl()
|
||||
{
|
||||
writeC(0xe2);
|
||||
writeD(_player.getAdena()); // activeChar current amount of aden
|
||||
writeD(3); // available equip slot
|
||||
// writeD(10); // total amount of symbol available which depends on difference classes
|
||||
writeD(_hennaEquipList.length);
|
||||
writeD(_player.getAdena());
|
||||
writeD(3);
|
||||
writeD(_hennaEquipList.size());
|
||||
|
||||
for (HennaInstance element : _hennaEquipList)
|
||||
for (Henna temp : _hennaEquipList)
|
||||
{
|
||||
/*
|
||||
* Player must have at least one dye in inventory to be able to see the henna that can be applied with it.
|
||||
*/
|
||||
if (_player.getInventory().getItemByItemId(element.getItemIdDye()) != null)
|
||||
// Player must have at least one dye in inventory to be able to see the henna that can be applied with it.
|
||||
if ((_player.getInventory().getItemByItemId(temp.getDyeId())) != null)
|
||||
{
|
||||
writeD(element.getSymbolId()); // symbolid
|
||||
writeD(element.getItemIdDye()); // itemid of dye
|
||||
writeD(element.getAmountDyeRequire()); // amount of dye require
|
||||
writeD(element.getPrice()); // amount of aden require
|
||||
writeD(temp.getSymbolId()); // symbolid
|
||||
writeD(temp.getDyeId()); // itemid of dye
|
||||
writeD(Henna.getRequiredDyeAmount()); // amount of dyes required
|
||||
writeD(temp.getPrice()); // amount of adenas required
|
||||
writeD(1); // meet the requirement or not
|
||||
}
|
||||
else
|
||||
{
|
||||
writeD(0x00);
|
||||
writeD(0x00);
|
||||
writeD(0x00);
|
||||
writeD(0x00);
|
||||
writeD(0x00);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -16,29 +16,28 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.instance.HennaInstance;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
|
||||
public class HennaInfo extends GameServerPacket
|
||||
{
|
||||
private final PlayerInstance _player;
|
||||
private final HennaInstance[] _hennas = new HennaInstance[3];
|
||||
private final int _count;
|
||||
private final Henna[] _hennas = new Henna[3];
|
||||
private int _count;
|
||||
|
||||
public HennaInfo(PlayerInstance player)
|
||||
{
|
||||
_player = player;
|
||||
_count = 0;
|
||||
|
||||
int j = 0;
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
final HennaInstance h = _player.getHennas(i + 1);
|
||||
if (h != null)
|
||||
Henna henna = _player.getHenna(i + 1);
|
||||
if (henna != null)
|
||||
{
|
||||
_hennas[j++] = h;
|
||||
_hennas[_count++] = henna;
|
||||
}
|
||||
}
|
||||
_count = j;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -53,13 +52,26 @@ public class HennaInfo extends GameServerPacket
|
||||
writeC(_player.getHennaStatDEX()); // equip DEX
|
||||
writeC(_player.getHennaStatWIT()); // equip WIT
|
||||
|
||||
writeD(3); // slots?
|
||||
// Henna slots
|
||||
int classId = _player.getClassId().level();
|
||||
if (classId == 1)
|
||||
{
|
||||
writeD(2);
|
||||
}
|
||||
else if (classId > 1)
|
||||
{
|
||||
writeD(3);
|
||||
}
|
||||
else
|
||||
{
|
||||
writeD(0);
|
||||
}
|
||||
|
||||
writeD(_count); // size
|
||||
for (int i = 0; i < _count; i++)
|
||||
{
|
||||
writeD(_hennas[i].getSymbolId());
|
||||
writeD(0x01);
|
||||
writeD(_hennas[i].canBeUsedBy(_player) ? _hennas[i].getSymbolId() : 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -16,15 +16,15 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.instance.HennaInstance;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
|
||||
public class HennaItemInfo extends GameServerPacket
|
||||
{
|
||||
private final PlayerInstance _player;
|
||||
private final HennaInstance _henna;
|
||||
private final Henna _henna;
|
||||
|
||||
public HennaItemInfo(HennaInstance henna, PlayerInstance player)
|
||||
public HennaItemInfo(Henna henna, PlayerInstance player)
|
||||
{
|
||||
_henna = henna;
|
||||
_player = player;
|
||||
@@ -35,23 +35,23 @@ public class HennaItemInfo extends GameServerPacket
|
||||
{
|
||||
writeC(0xe3);
|
||||
writeD(_henna.getSymbolId()); // symbol Id
|
||||
writeD(_henna.getItemIdDye()); // item id of dye
|
||||
writeD(_henna.getAmountDyeRequire()); // total amount of dye require
|
||||
writeD(_henna.getPrice()); // total amount of aden require to draw symbol
|
||||
writeD(_henna.getDyeId()); // item id of dye
|
||||
writeD(Henna.getRequiredDyeAmount()); // total amount of dye required
|
||||
writeD(_henna.getPrice()); // total amount of adenas required to draw symbol
|
||||
writeD(1); // able to draw or not 0 is false and 1 is true
|
||||
writeD(_player.getAdena());
|
||||
|
||||
writeD(_player.getINT()); // current INT
|
||||
writeC(_player.getINT() + _henna.getStatINT()); // equip INT
|
||||
writeC(_player.getINT() + _henna.getINT()); // equip INT
|
||||
writeD(_player.getSTR()); // current STR
|
||||
writeC(_player.getSTR() + _henna.getStatSTR()); // equip STR
|
||||
writeC(_player.getSTR() + _henna.getSTR()); // equip STR
|
||||
writeD(_player.getCON()); // current CON
|
||||
writeC(_player.getCON() + _henna.getStatCON()); // equip CON
|
||||
writeC(_player.getCON() + _henna.getCON()); // equip CON
|
||||
writeD(_player.getMEN()); // current MEM
|
||||
writeC(_player.getMEN() + _henna.getStatMEM()); // equip MEM
|
||||
writeC(_player.getMEN() + _henna.getMEN()); // equip MEM
|
||||
writeD(_player.getDEX()); // current DEX
|
||||
writeC(_player.getDEX() + _henna.getStatDEX()); // equip DEX
|
||||
writeC(_player.getDEX() + _henna.getDEX()); // equip DEX
|
||||
writeD(_player.getWIT()); // current WIT
|
||||
writeC(_player.getWIT() + _henna.getStatWIT()); // equip WIT
|
||||
writeC(_player.getWIT() + _henna.getWIT()); // equip WIT
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* 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 org.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
|
||||
public class HennaItemRemoveInfo extends GameServerPacket
|
||||
{
|
||||
private final PlayerInstance _player;
|
||||
private final Henna _henna;
|
||||
|
||||
public HennaItemRemoveInfo(Henna henna, PlayerInstance player)
|
||||
{
|
||||
_henna = henna;
|
||||
_player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final void writeImpl()
|
||||
{
|
||||
writeC(0xe6);
|
||||
writeD(_henna.getSymbolId()); // symbol Id
|
||||
writeD(_henna.getDyeId()); // item id of dye
|
||||
writeD(Henna.getRequiredDyeAmount() / 2); // amount of given dyes
|
||||
writeD(_henna.getPrice() / 5); // amount of required adenas
|
||||
writeD(1); // able to remove or not 0 is false and 1 is true
|
||||
writeD(_player.getAdena());
|
||||
|
||||
writeD(_player.getINT()); // current INT
|
||||
writeC(_player.getINT() - _henna.getINT()); // equip INT
|
||||
writeD(_player.getSTR()); // current STR
|
||||
writeC(_player.getSTR() - _henna.getSTR()); // equip STR
|
||||
writeD(_player.getCON()); // current CON
|
||||
writeC(_player.getCON() - _henna.getCON()); // equip CON
|
||||
writeD(_player.getMEN()); // current MEM
|
||||
writeC(_player.getMEN() - _henna.getMEN()); // equip MEM
|
||||
writeD(_player.getDEX()); // current DEX
|
||||
writeC(_player.getDEX() - _henna.getDEX()); // equip DEX
|
||||
writeD(_player.getWIT()); // current WIT
|
||||
writeC(_player.getWIT() - _henna.getWIT()); // equip WIT
|
||||
}
|
||||
}
|
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* 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 org.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.Henna;
|
||||
|
||||
public class HennaRemoveList extends GameServerPacket
|
||||
{
|
||||
private final PlayerInstance _player;
|
||||
|
||||
public HennaRemoveList(PlayerInstance player)
|
||||
{
|
||||
_player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final void writeImpl()
|
||||
{
|
||||
writeC(0xe5);
|
||||
writeD(_player.getAdena());
|
||||
writeD(_player.getHennaEmptySlots());
|
||||
writeD(Math.abs(_player.getHennaEmptySlots() - 3));
|
||||
|
||||
for (int i = 1; i <= 3; i++)
|
||||
{
|
||||
final Henna henna = _player.getHenna(i);
|
||||
if (henna != null)
|
||||
{
|
||||
writeD(henna.getSymbolId());
|
||||
writeD(henna.getDyeId());
|
||||
writeD(Henna.getRequiredDyeAmount() / 2);
|
||||
writeD(henna.getPrice() / 5);
|
||||
writeD(0x01);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user