
07.08.2015, 13:53
|
|
Флудер
Регистрация: 20.01.2015
Сообщений: 7,201
С нами:
5952720
Репутация:
6527
|
|
Как я говорил про аугментацию в том посте? Так а что там изменилось, ничего осталось на том же уровне.
[QUOTE="Спойлер"]
[COLOR="#363940"]
package core.gameserver.tables;
import gnu.trove.list.array.TDoubleArrayList;
import gnu.trove.map.hash.TIntObjectHashMap;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
import javax.xml.parsers.DocumentBuilderFactory;
import core.commons.crypt.CryptUtil;
import core.commons.util.Rnd;
import core.gameserver.Config;
import core.gameserver.stats.Stats;
import core.gameserver.stats.funcs.Func;
import core.gameserver.stats.funcs.FuncAdd;
import core.gameserver.stats.triggers.TriggerInfo;
import core.gameserver.stats.triggers.TriggerType;
import core.gameserver.templates.item.ItemTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
public class AugmentationData
{
private static final Logger _log = LoggerFactory.getLogger(AugmentationData.class);
private static AugmentationData _Instance;
public static AugmentationData getInstance()
{
if(_Instance == null)
_Instance = new AugmentationData();
return _Instance;
}
// stats
private static final int STAT_START = 1;
private static final int STAT_END = 14560;
private static final int STAT_BLOCKSIZE = 3640;
//private static final int STAT_NUMBEROF_BLOCKS = 4;
private static final int STAT_SUBBLOCKSIZE = 91;
//private static final int STAT_NUMBEROF_SUBBLOCKS = 40;
private static final int STAT_NUM = 13;
private static final byte[] STATS1_MAP = new byte[STAT_SUBBLOCKSIZE];
private static final byte[] STATS2_MAP = new byte[STAT_SUBBLOCKSIZE];
// skills
private static final int BLUE_START = 14561;
// private static final int PURPLE_START = 14578;
// private static final int RED_START = 14685;
private static final int SKILLS_BLOCKSIZE = 178;
// basestats
private static final int BASESTAT_STR = 16341;
private static final int BASESTAT_CON = 16342;
private static final int BASESTAT_INT = 16343;
private static final int BASESTAT_MEN = 16344;
// accessory
private static final int ACC_START = 16669;
private static final int ACC_BLOCKS_NUM = 10;
private static final int ACC_STAT_SUBBLOCKSIZE = 21;
private static final int ACC_STAT_NUM = 6;
private static final int ACC_RING_START = ACC_START;
private static final int ACC_RING_SKILLS = 18;
private static final int ACC_RING_BLOCKSIZE = ACC_RING_SKILLS + 4 * ACC_STAT_SUBBLOCKSIZE;
private static final int ACC_RING_END = ACC_RING_START + ACC_BLOCKS_NUM * ACC_RING_BLOCKSIZE - 1;
private static final int ACC_EAR_START = ACC_RING_END + 1;
private static final int ACC_EAR_SKILLS = 18;
private static final int ACC_EAR_BLOCKSIZE = ACC_EAR_SKILLS + 4 * ACC_STAT_SUBBLOCKSIZE;
private static final int ACC_EAR_END = ACC_EAR_START + ACC_BLOCKS_NUM * ACC_EAR_BLOCKSIZE - 1;
private static final int ACC_NECK_START = ACC_EAR_END + 1;
private static final int ACC_NECK_SKILLS = 24;
private static final int ACC_NECK_BLOCKSIZE = ACC_NECK_SKILLS + 4 * ACC_STAT_SUBBLOCKSIZE;
private static final int ACC_END = ACC_NECK_START + ACC_BLOCKS_NUM * ACC_NECK_BLOCKSIZE;
private static final byte[] ACC_STATS1_MAP = new byte[ACC_STAT_SUBBLOCKSIZE];
private static final byte[] ACC_STATS2_MAP = new byte[ACC_STAT_SUBBLOCKSIZE];
private List[] _augStats = new ArrayList[4];
private List[] _augAccStats = new ArrayList[4];
private List[] _blueSkills = new ArrayList[10];
private List[] _purpleSkills = new ArrayList[10];
private List[] _redSkills = new ArrayList[10];
private List[] _yellowSkills = new ArrayList[10];
private TIntObjectHashMap _allSkills = new TIntObjectHashMap();
public AugmentationData()
{
_log.info("Initializing AugmentationData.");
_augStats[0] = new ArrayList();
_augStats[1] = new ArrayList();
_augStats[2] = new ArrayList();
_augStats[3] = new ArrayList();
_augAccStats[0] = new ArrayList();
_augAccStats[1] = new ArrayList();
_augAccStats[2] = new ArrayList();
_augAccStats[3] = new ArrayList();
// Lookup tables structure: STAT1 represent first stat, STAT2 - second.
// If both values are the same - use solo stat, if different - combined.
int idx;
// weapon augmentation block: solo values first
// 00-00, 01-01 ... 11-11,12-12
for(idx = 0; idx ();
_purpleSkills[I]= new ArrayList();
_redSkills[I]= new ArrayList();
_yellowSkills[I]= new ArrayList();
}
load();
// Use size*4: since theres 4 blocks of stat-data with equivalent size
_log.info("AugmentationData: Loaded: " + _augStats[0].size() * 4 + " augmentation stats.");
_log.info("AugmentationData: Loaded: " + _augAccStats[0].size() * 4 + " accessory augmentation stats.");
for(int i = 0; i = _singleSize || i = _combinedSize || i ) _blueSkills[k]).add(augmentationId);
else if(type.equalsIgnoreCase("purple"))
((List) _purpleSkills[k]).add(augmentationId);
else if(type.equalsIgnoreCase("red"))
((List) _redSkills[k]).add(augmentationId);
_allSkills.put(augmentationId, new TriggerInfo(skillId, skillLvL, t, chance));
}
if(badAugmantData != 0)
_log.info("AugmentationData: " + badAugmantData + " bad skill(s) were skipped.");
}
catch(Exception e)
{
_log.error("Error parsing augmentation_skillmap.xml.", e);
return;
}
// Load the stats from xml
for(int i = 1; i ) _augStats[(i - 1)]).add(new augmentationStat(Stats.valueOfXml(statName), soloValues, combinedValues));
}
}
catch(Exception e)
{
_log.error("Error parsing augmentation_stats" + i + ".xml.", e);
return;
}
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setIgnoringComments(true);
File file = new File(Config.DATAPACK_ROOT, "data/xml/augmentation/augmentation_jewel_stats" + i + ".xml");
FileInputStream stream = new FileInputStream(file);
InputStream output;
if((byte)stream.read() == 0x00)
{
byte[] bytes = new byte[0];
output = new ByteArrayInputStream(bytes);
output = CryptUtil.decrypt(stream, output);
}
else
output = new FileInputStream(file);
Document doc = factory.newDocumentBuilder().parse(output);
for(Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
if("list".equalsIgnoreCase(n.getNodeName()))
for(Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
if("stat".equalsIgnoreCase(d.getNodeName()))
{
NamedNodeMap attrs = d.getAttributes();
String statName = attrs.getNamedItem("name").getNodeValue();
double soloValues[] = null, combinedValues[] = null;
for(Node cd = d.getFirstChild(); cd != null; cd = cd.getNextSibling())
if("table".equalsIgnoreCase(cd.getNodeName()))
{
attrs = cd.getAttributes();
String tableName = attrs.getNamedItem("name").getNodeValue();
StringTokenizer data = new StringTokenizer(cd.getFirstChild().getNodeValue()) ;
TDoubleArrayList array = new TDoubleArrayList();
while(data.hasMoreTokens())
array.add(Double.parseDouble(data.nextToken()));
if(tableName.equalsIgnoreCase("#soloValues"))
{
soloValues = new double[array.size()];
int x = 0;
for(double value : array.toArray())
soloValues[x++] = value;
}
else
{
combinedValues = new double[array.size()];
int x = 0;
for(double value : array.toArray())
combinedValues[x++] = value;
}
}
// store this stat
((List) _augAccStats[(i - 1)]).add(new augmentationStat(Stats.valueOfXml(statName), soloValues, combinedValues));
}
}
catch(Exception e)
{
_log.error("Error parsing jewel augmentation_stats" + i + ".xml.", e);
return;
}
}
}
public int generateRandomAugmentation(int lifeStoneLevel, int lifeStoneGrade, int bodyPart)
{
switch(bodyPart)
{
case ItemTemplate.SLOT_L_FINGER:
case ItemTemplate.SLOT_R_FINGER:
case ItemTemplate.SLOT_L_FINGER | ItemTemplate.SLOT_R_FINGER:
case ItemTemplate.SLOT_L_EAR:
case ItemTemplate.SLOT_R_EAR:
case ItemTemplate.SLOT_L_EAR | ItemTemplate.SLOT_R_EAR:
case ItemTemplate.SLOT_NECK:
return generateRandomAccessoryAugmentation(lifeStoneLevel , bodyPart);
default:
return generateRandomWeaponAugmentation(lifeStoneLevel, lifeStoneGrade);
}
}
private int generateRandomWeaponAugmentation(int lifeStoneLevel, int lifeStoneGrade)
{
// Note that stat12 stands for stat 1 AND 2 (same for stat34 ;p )
// this is because a value can contain up to 2 stat modifications
// (there are two int values packed in one integer value, meaning 4 stat modifications at max)
// for more info take a look at getAugStatsById(...)
// Note: lifeStoneGrade: (0 means low grade, 3 top grade)
// First: determine whether we will add a skill/baseStatModifier or not
// because this determine which color could be the result
int stat12 = 0;
int stat34 = 0;
boolean generateSkill = false;
boolean generateGlow = false;
//lifestonelevel is used for stat Id and skill level, but here the max level is 9
lifeStoneLevel = Math.min(lifeStoneLevel, 9);
switch(lifeStoneGrade)
{
case 0:
generateSkill = Rnd.chance(Config.AUGMENTATION_NG_SKILL_CHANCE);
generateGlow = Rnd.chance(Config.AUGMENTATION_NG_GLOW_CHANCE);
break;
case 1:
generateSkill = Rnd.chance(Config.AUGMENTATION_MID_SKILL_CHANCE);
generateGlow = Rnd.chance(Config.AUGMENTATION_MID_GLOW_CHANCE);
break;
case 2:
generateSkill = Rnd.chance(Config.AUGMENTATION_HIGH_SKILL_CHANCE);
generateGlow = Rnd.chance(Config.AUGMENTATION_HIGH_GLOW_CHANCE);
break;
case 3:
generateSkill = Rnd.chance(Config.AUGMENTATION_TOP_SKILL_CHANCE);
generateGlow = Rnd.chance(Config.AUGMENTATION_TOP_GLOW_CHANCE);
break;
}
if(!generateSkill && Rnd.get(1, 100) = 2)
offset = lifeStoneLevel * STAT_SUBBLOCKSIZE + (temp - 2) * STAT_BLOCKSIZE + lifeStoneGrade * 10 * STAT_SUBBLOCKSIZE + 1;
else
offset = lifeStoneLevel * STAT_SUBBLOCKSIZE + (temp - 2) * STAT_BLOCKSIZE + Rnd.get(0, 1) * 10 * STAT_SUBBLOCKSIZE + 1;
}
else if(!generateGlow)
offset = lifeStoneLevel * STAT_SUBBLOCKSIZE + Rnd.get(0, 1) * STAT_BLOCKSIZE + 1;
else
offset = lifeStoneLevel * STAT_SUBBLOCKSIZE + Rnd.get(0, 1) * STAT_BLOCKSIZE + (lifeStoneGrade + resultColor) / 2 * 10 * STAT_SUBBLOCKSIZE + 1;
stat12 = Rnd.get(offset, offset + STAT_SUBBLOCKSIZE - 1);
return ((stat34
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|