Шара. Pain-Team 14

а ты в своих исходах норм пакетку реализовал?не так как у региона и паина?и не думал поделиться своим трудом раз дальше не сливаешь?
 

Окей, я специально скачал данный хлам опять:
data/spawn - это что? А вот то что данный рукожоп не сделал весь спавн а в некоторых локациях то это уже проблема данного рукожопа. Наверное круто личить с овера в свой хлам
спавн он берет из таблицы spawnlist но по какой то причине грузится он не хочет, почему мне не ясно например (даже с теми таблицами не грузит)
 
спавн он берет из таблицы spawnlist но по какой то причине грузится он не хочет, почему мне не ясно например (даже с теми таблицами не грузит)
Да не берет он из таблицы, а из xml файлов, это одноклеточное сличило с оверов вот и всё
 
Да не берет он из таблицы, а из xml файлов, это одноклеточное сличило с оверов вот и всё
package l2p.gameserver.tables;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import l2p.commons.dbcp.DbUtils;
import l2p.commons.util.GArray;
import l2p.commons.util.Rnd;
import l2p.gameserver.Config;
import l2p.gameserver.database.DatabaseFactory;
import l2p.gameserver.instancemanager.CatacombSpawnManager;
import l2p.gameserver.instancemanager.DayNightSpawnManager;
import l2p.gameserver.instancemanager.RaidBossSpawnManager;
import l2p.gameserver.instancemanager.SpawnManager;
import l2p.gameserver.model.AutoSpawnHandler;
import l2p.gameserver.model.L2ObjectsStorage;
import l2p.gameserver.model.L2Spawn;
import l2p.gameserver.model.L2World;
import l2p.gameserver.model.instances.L2ItemInstance;
import l2p.gameserver.model.instances.L2MonsterInstance;
import l2p.gameserver.model.instances.L2NpcInstance;
import l2p.gameserver.model.instances.L2SiegeGuardInstance;
import l2p.gameserver.tables.NpcTable;
import l2p.gameserver.templates.L2NpcTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SpawnTable {
private static final Logger _log = LoggerFactory.getLogger((Class)SpawnTable.class);
private static SpawnTable _instance;
private GArray<L2Spawn> _spawntable;
private int _npcSpawnCount;
private int _spawnCount;

private SpawnTable() {
_instance = this;
}

public static SpawnTable getInstance() {
if (_instance == null) {
new SpawnTable();
}
return _instance;
}

public static void unload() {
if (_instance != null) {
_instance = null;
}
}

public void loadSpawn() {
SpawnManager.retardation = true;
_log.info("Spawn loading...");
this.fillSpawnTable();
SpawnManager.getInstance().spawnAll();
RaidBossSpawnManager.getInstance();
AutoSpawnHandler.getInstance();
_log.info("Spawn loading is completed.");
SpawnManager.retardation = false;
SpawnManager.completed = true;
}

public GArray<L2Spawn> getSpawnTable() {
return this._spawntable;
}

public void deleteSpawn(L2Spawn l2Spawn) {
this._spawntable.remove((Object)l2Spawn);
}

public void reloadAll() {
L2World.deleteVisibleNpcSpawns();
this.fillSpawnTable();
RaidBossSpawnManager.getInstance().reloadBosses();
}

private void fillSpawnTable() {
this._spawntable = new GArray();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
boolean bl;
connection = DatabaseFactory.getInstance().getConnection();
preparedStatement = connection.prepareStatement("SELECT * FROM spawnlist ORDER by npc_templateid");
resultSet = preparedStatement.executeQuery();
this._npcSpawnCount = 0;
this._spawnCount = 0;
boolean bl2 = bl = SpawnManager.retardation && Config.DELAY_SPAWN_NPC > 0;
while (resultSet.next()) {
L2NpcTemplate l2NpcTemplate = NpcTable.getTemplate(resultSet.getInt("npc_templateid"));
if (l2NpcTemplate != null) {
if (l2NpcTemplate.isInstanceOf(L2SiegeGuardInstance.class) || !Config.SPAWN_CLASS_MASTERS && l2NpcTemplate.type.equalsIgnoreCase("L2ClassMaster") || !Config.HITMAN_ENABLE && l2NpcTemplate.type.equalsIgnoreCase("L2Hitman")) continue;
L2Spawn l2Spawn = new L2Spawn(l2NpcTemplate);
l2Spawn.setAmount(resultSet.getInt("count") * (Config.ALT_DOUBLE_SPAWN && !l2NpcTemplate.isRaid ? 2 : 1));
l2Spawn.setLocx(resultSet.getInt("locx"));
l2Spawn.setLocy(resultSet.getInt("locy"));
l2Spawn.setLocz(resultSet.getInt("locz"));
l2Spawn.setHeading(resultSet.getInt("heading"));
l2Spawn.setRespawnDelay(resultSet.getInt("respawn_delay"), resultSet.getInt("respawn_delay_rnd"));
l2Spawn.setLocation(resultSet.getInt("loc_id"));
l2Spawn.setRespawnTime(0);
if (l2NpcTemplate.isInstanceOf(L2MonsterInstance.class)) {
if (l2NpcTemplate.name.contains("Lilim") || l2NpcTemplate.name.contains("Lith")) {
CatacombSpawnManager.getInstance().addDawnMob(l2Spawn);
} else if (l2NpcTemplate.name.contains("Nephilim") || l2NpcTemplate.name.contains("Gigant")) {
CatacombSpawnManager.getInstance().addDuskMob(l2Spawn);
}
}
if (l2NpcTemplate.isRaid) {
RaidBossSpawnManager.getInstance().addNewSpawn(l2Spawn);
}
switch (resultSet.getInt("periodOfDay")) {
case 0: {
this._npcSpawnCount += l2Spawn.init();
this._spawntable.add((Object)l2Spawn);
break;
}
case 1: {
DayNightSpawnManager.getInstance().addDayMob(l2Spawn);
break;
}
case 2: {
DayNightSpawnManager.getInstance().addNightMob(l2Spawn);
}
}
++this._spawnCount;
if (!bl) continue;
Thread.sleep(Config.DELAY_SPAWN_NPC);
continue;
}
_log.warn("mob data for id:" + resultSet.getInt("npc_templateid") + " missing in npc table");
}
DayNightSpawnManager.getInstance().notifyChangeMode();
CatacombSpawnManager.getInstance().notifyChangeMode();
}
catch (Exception var4_6) {
_log.error("spawn couldn't be initialized: ", (Throwable)var4_6);
}
finally {
DbUtils.closeQuietly((Connection)connection, (Statement)preparedStatement, (ResultSet)resultSet);
}
_log.info("SpawnTable: Loaded " + this._spawnCount + " Npc Spawn Locs. Total NPCs: " + this._npcSpawnCount);
if (Config.MOBSLOOTERS) {
this.loadInventory();
}
}

private void loadInventory() {
int n = 0;
GArray<L2NpcInstance> gArray = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = DatabaseFactory.getInstance().getConnection();
preparedStatement = connection.prepareStatement("SELECT owner_id, object_id, item_id, count, enchant_level FROM items WHERE loc = 'MONSTER'");
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
++n;
gArray = L2ObjectsStorage.getAllByNpcId(resultSet.getInt("owner_id"), false);
try {
L2ItemInstance l2ItemInstance = L2ItemInstance.restoreFromDb(resultSet.getInt("object_id"), true);
if (gArray.size() > 0) {
L2MonsterInstance l2MonsterInstance = (L2MonsterInstance)gArray.toArray()[Rnd.get((int)gArray.size())];
l2MonsterInstance.giveItem(l2ItemInstance, false);
continue;
}
NpcTable.getTemplate(resultSet.getInt("owner_id")).giveItem(l2ItemInstance, false);
}
catch (Exception var6_7) {
_log.error("Unable to restore monsters inventory for " + ((L2NpcInstance)gArray.get(0)).getNpcId(), (Throwable)var6_7);
}
}
}
catch (Exception var6_8) {
_log.error("Can't load monsters inventory: ", (Throwable)var6_8);
}
finally {
DbUtils.closeQuietly((Connection)connection, (Statement)preparedStatement, (ResultSet)resultSet);
}
}
}
что на это скажете? чтобы он брал спавн из файла я не нашел, из геймсервера только этот метод вызывается в частности loadspawn
 
package l2p.gameserver.tables;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import l2p.commons.dbcp.DbUtils;
import l2p.commons.util.GArray;
import l2p.commons.util.Rnd;
import l2p.gameserver.Config;
import l2p.gameserver.database.DatabaseFactory;
import l2p.gameserver.instancemanager.CatacombSpawnManager;
import l2p.gameserver.instancemanager.DayNightSpawnManager;
import l2p.gameserver.instancemanager.RaidBossSpawnManager;
import l2p.gameserver.instancemanager.SpawnManager;
import l2p.gameserver.model.AutoSpawnHandler;
import l2p.gameserver.model.L2ObjectsStorage;
import l2p.gameserver.model.L2Spawn;
import l2p.gameserver.model.L2World;
import l2p.gameserver.model.instances.L2ItemInstance;
import l2p.gameserver.model.instances.L2MonsterInstance;
import l2p.gameserver.model.instances.L2NpcInstance;
import l2p.gameserver.model.instances.L2SiegeGuardInstance;
import l2p.gameserver.tables.NpcTable;
import l2p.gameserver.templates.L2NpcTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SpawnTable {
private static final Logger _log = LoggerFactory.getLogger((Class)SpawnTable.class);
private static SpawnTable _instance;
private GArray<L2Spawn> _spawntable;
private int _npcSpawnCount;
private int _spawnCount;

private SpawnTable() {
_instance = this;
}

public static SpawnTable getInstance() {
if (_instance == null) {
new SpawnTable();
}
return _instance;
}

public static void unload() {
if (_instance != null) {
_instance = null;
}
}

public void loadSpawn() {
SpawnManager.retardation = true;
_log.info("Spawn loading...");
this.fillSpawnTable();
SpawnManager.getInstance().spawnAll();
RaidBossSpawnManager.getInstance();
AutoSpawnHandler.getInstance();
_log.info("Spawn loading is completed.");
SpawnManager.retardation = false;
SpawnManager.completed = true;
}

public GArray<L2Spawn> getSpawnTable() {
return this._spawntable;
}

public void deleteSpawn(L2Spawn l2Spawn) {
this._spawntable.remove((Object)l2Spawn);
}

public void reloadAll() {
L2World.deleteVisibleNpcSpawns();
this.fillSpawnTable();
RaidBossSpawnManager.getInstance().reloadBosses();
}

private void fillSpawnTable() {
this._spawntable = new GArray();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
boolean bl;
connection = DatabaseFactory.getInstance().getConnection();
preparedStatement = connection.prepareStatement("SELECT * FROM spawnlist ORDER by npc_templateid");
resultSet = preparedStatement.executeQuery();
this._npcSpawnCount = 0;
this._spawnCount = 0;
boolean bl2 = bl = SpawnManager.retardation && Config.DELAY_SPAWN_NPC > 0;
while (resultSet.next()) {
L2NpcTemplate l2NpcTemplate = NpcTable.getTemplate(resultSet.getInt("npc_templateid"));
if (l2NpcTemplate != null) {
if (l2NpcTemplate.isInstanceOf(L2SiegeGuardInstance.class) || !Config.SPAWN_CLASS_MASTERS && l2NpcTemplate.type.equalsIgnoreCase("L2ClassMaster") || !Config.HITMAN_ENABLE && l2NpcTemplate.type.equalsIgnoreCase("L2Hitman")) continue;
L2Spawn l2Spawn = new L2Spawn(l2NpcTemplate);
l2Spawn.setAmount(resultSet.getInt("count") * (Config.ALT_DOUBLE_SPAWN && !l2NpcTemplate.isRaid ? 2 : 1));
l2Spawn.setLocx(resultSet.getInt("locx"));
l2Spawn.setLocy(resultSet.getInt("locy"));
l2Spawn.setLocz(resultSet.getInt("locz"));
l2Spawn.setHeading(resultSet.getInt("heading"));
l2Spawn.setRespawnDelay(resultSet.getInt("respawn_delay"), resultSet.getInt("respawn_delay_rnd"));
l2Spawn.setLocation(resultSet.getInt("loc_id"));
l2Spawn.setRespawnTime(0);
if (l2NpcTemplate.isInstanceOf(L2MonsterInstance.class)) {
if (l2NpcTemplate.name.contains("Lilim") || l2NpcTemplate.name.contains("Lith")) {
CatacombSpawnManager.getInstance().addDawnMob(l2Spawn);
} else if (l2NpcTemplate.name.contains("Nephilim") || l2NpcTemplate.name.contains("Gigant")) {
CatacombSpawnManager.getInstance().addDuskMob(l2Spawn);
}
}
if (l2NpcTemplate.isRaid) {
RaidBossSpawnManager.getInstance().addNewSpawn(l2Spawn);
}
switch (resultSet.getInt("periodOfDay")) {
case 0: {
this._npcSpawnCount += l2Spawn.init();
this._spawntable.add((Object)l2Spawn);
break;
}
case 1: {
DayNightSpawnManager.getInstance().addDayMob(l2Spawn);
break;
}
case 2: {
DayNightSpawnManager.getInstance().addNightMob(l2Spawn);
}
}
++this._spawnCount;
if (!bl) continue;
Thread.sleep(Config.DELAY_SPAWN_NPC);
continue;
}
_log.warn("mob data for id:" + resultSet.getInt("npc_templateid") + " missing in npc table");
}
DayNightSpawnManager.getInstance().notifyChangeMode();
CatacombSpawnManager.getInstance().notifyChangeMode();
}
catch (Exception var4_6) {
_log.error("spawn couldn't be initialized: ", (Throwable)var4_6);
}
finally {
DbUtils.closeQuietly((Connection)connection, (Statement)preparedStatement, (ResultSet)resultSet);
}
_log.info("SpawnTable: Loaded " + this._spawnCount + " Npc Spawn Locs. Total NPCs: " + this._npcSpawnCount);
if (Config.MOBSLOOTERS) {
this.loadInventory();
}
}

private void loadInventory() {
int n = 0;
GArray<L2NpcInstance> gArray = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = DatabaseFactory.getInstance().getConnection();
preparedStatement = connection.prepareStatement("SELECT owner_id, object_id, item_id, count, enchant_level FROM items WHERE loc = 'MONSTER'");
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
++n;
gArray = L2ObjectsStorage.getAllByNpcId(resultSet.getInt("owner_id"), false);
try {
L2ItemInstance l2ItemInstance = L2ItemInstance.restoreFromDb(resultSet.getInt("object_id"), true);
if (gArray.size() > 0) {
L2MonsterInstance l2MonsterInstance = (L2MonsterInstance)gArray.toArray()[Rnd.get((int)gArray.size())];
l2MonsterInstance.giveItem(l2ItemInstance, false);
continue;
}
NpcTable.getTemplate(resultSet.getInt("owner_id")).giveItem(l2ItemInstance, false);
}
catch (Exception var6_7) {
_log.error("Unable to restore monsters inventory for " + ((L2NpcInstance)gArray.get(0)).getNpcId(), (Throwable)var6_7);
}
}
}
catch (Exception var6_8) {
_log.error("Can't load monsters inventory: ", (Throwable)var6_8);
}
finally {
DbUtils.closeQuietly((Connection)connection, (Statement)preparedStatement, (ResultSet)resultSet);
}
}
}
что на это скажете? чтобы он брал спавн из файла я не нашел, из геймсервера только этот метод вызывается в частности loadspawn
Видимо люди кроме гавнокода тру пивипи интерблюдов ничего не видели, окей декомпилю его ворованную работу висталла:
package l2p.gameserver.data.xml.parser;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import l2p.commons.collections.MultiValueSet;
import l2p.commons.data.xml.AbstractDirParser;
import l2p.commons.geometry.Polygon;
import l2p.gameserver.Config;
import l2p.gameserver.data.xml.holder.SpawnHolder;
import l2p.gameserver.model.Territory;
import l2p.gameserver.templates.StatsSet;
import l2p.gameserver.templates.spawn.PeriodOfDay;
import l2p.gameserver.templates.spawn.SpawnNpcInfo;
import l2p.gameserver.templates.spawn.SpawnTemplate;
import l2p.gameserver.utils.Location;
import org.dom4j.Element;

public final class SpawnParser extends AbstractDirParser<SpawnHolder>
{
private static final SpawnParser _instance = new SpawnParser();

protected SpawnParser()
{
super(SpawnHolder.getInstance());
}

public static SpawnParser getInstance()
{
return _instance;
}

public File getXMLDir()
{
return new File(Config.DATAPACK_ROOT, "data/spawn/");
}

public boolean isIgnored(File paramFile)
{
return false;
}

public String getDTDFileName()
{
return "spawn.dtd";
}

protected void readData(Element paramElement)
throws Exception
{
HashMap localHashMap = new HashMap();
for (Iterator localIterator1 = paramElement.elementIterator(); localIterator1.hasNext(); )
{
Element localElement1 = (Element)localIterator1.next();
String str1;
if (localElement1.getName().equalsIgnoreCase("territory"))
{
str1 = localElement1.attributeValue("name");
Territory localTerritory1 = parseTerritory(str1, localElement1);
localHashMap.put(str1, localTerritory1);
}
else if (localElement1.getName().equalsIgnoreCase("spawn"))
{
str1 = localElement1.attributeValue("group");
int i = localElement1.attributeValue("respawn") == null ? 60 : Integer.parseInt(localElement1.attributeValue("respawn"));
int j = localElement1.attributeValue("respawn_random") == null ? 0 : Integer.parseInt(localElement1.attributeValue("respawn_random"));
int k = localElement1.attributeValue("count") == null ? 1 : Integer.parseInt(localElement1.attributeValue("count"));
PeriodOfDay localPeriodOfDay = localElement1.attributeValue("period_of_day") == null ? PeriodOfDay.NONE : PeriodOfDay.valueOf(localElement1.attributeValue("period_of_day").toUpperCase());
if (str1 == null)
str1 = localPeriodOfDay.name();
SpawnTemplate localSpawnTemplate = new SpawnTemplate(localPeriodOfDay, k, i, j);

for (Iterator localIterator2 = localElement1.elementIterator(); localIterator2.hasNext(); )
{
Element localElement2 = (Element)localIterator2.next();
if (localElement2.getName().equalsIgnoreCase("point"))
{
int m = Integer.parseInt(localElement2.attributeValue("x"));
int i1 = Integer.parseInt(localElement2.attributeValue("y"));
int i3 = Integer.parseInt(localElement2.attributeValue("z"));
int i4 = localElement2.attributeValue("h") == null ? -1 : Integer.parseInt(localElement2.attributeValue("h"));

localSpawnTemplate.addSpawnRange(new Location(m, i1, i3, i4));
}
else if (localElement2.getName().equalsIgnoreCase("territory"))
{
String str2 = localElement2.attributeValue("name");
Territory localTerritory2;
if (str2 != null)
{
localTerritory2 = (Territory)localHashMap.get(str2);
if (localTerritory2 == null)
{
error("Invalid territory name: " + str2 + "; " + getCurrentFileName());
continue;
}
localSpawnTemplate.addSpawnRange(localTerritory2);
}
else
{
localTerritory2 = parseTerritory(null, localElement2);

localSpawnTemplate.addSpawnRange(localTerritory2);
}
}
else if (localElement2.getName().equalsIgnoreCase("npc"))
{
int n = Integer.parseInt(localElement2.attributeValue("id"));
int i2 = localElement2.attributeValue("max") == null ? 0 : Integer.parseInt(localElement2.attributeValue("max"));
Object localObject = StatsSet.EMPTY;
for (Element localElement3 : localElement2.elements())
{
if (((MultiValueSet)localObject).isEmpty()) {
localObject = new MultiValueSet();
}
((MultiValueSet)localObject).set(localElement3.attributeValue("name"), localElement3.attributeValue("value"));
}
localSpawnTemplate.addNpc(new SpawnNpcInfo(n, i2, (MultiValueSet)localObject));
}
}

if (localSpawnTemplate.getNpcSize() == 0)
{
warn("Npc id is zero! File: " + getCurrentFileName());
continue;
}

if (localSpawnTemplate.getSpawnRangeSize() == 0)
{
warn("No points to spawn! File: " + getCurrentFileName());
continue;
}

((SpawnHolder)getHolder()).addSpawn(str1, localSpawnTemplate);
}
}
}

private Territory parseTerritory(String paramString, Element paramElement)
{
Territory localTerritory = new Territory();
localTerritory.add(parsePolygon0(paramString, paramElement));

for (Iterator localIterator = paramElement.elementIterator("banned_territory"); localIterator.hasNext(); ) {
localTerritory.addBanned(parsePolygon0(paramString, (Element)localIterator.next()));
}
return localTerritory;
}

private Polygon parsePolygon0(String paramString, Element paramElement)
{
Polygon localPolygon = new Polygon();
for (Iterator localIterator = paramElement.elementIterator("add"); localIterator.hasNext(); )
{
Element localElement = (Element)localIterator.next();
int i = Integer.parseInt(localElement.attributeValue("x"));
int j = Integer.parseInt(localElement.attributeValue("y"));
int k = Integer.parseInt(localElement.attributeValue("zmin"));
int m = Integer.parseInt(localElement.attributeValue("zmax"));
localPolygon.add(i, j).setZmin(k).setZmax(m);
}

if (!localPolygon.validate())
error("Invalid polygon: " + paramString + "{" + localPolygon + "}. File: " + getCurrentFileName());
return localPolygon;
}
}
Ну и хранилище
package l2p.gameserver.data.xml.holder;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import l2p.commons.data.xml.AbstractHolder;
import l2p.gameserver.templates.spawn.SpawnTemplate;

public final class SpawnHolder extends AbstractHolder
{
private static final SpawnHolder _instance = new SpawnHolder();

private Map<String, List<SpawnTemplate>> _spawns = new HashMap();

public void clear()
{
this._spawns.clear();
}

public int size()
{
int i = 0;
for (List localList : this._spawns.values()) {
i += localList.size();
}
return i;
}

public static SpawnHolder getInstance()
{
return _instance;
}

public List<SpawnTemplate> getSpawn(String paramString)
{
List localList = (List)this._spawns.get(paramString);
return localList == null ? Collections.emptyList() : localList;
}

public void addSpawn(String paramString, SpawnTemplate paramSpawnTemplate)
{
Object localObject = (List)this._spawns.get(paramString);
if (localObject == null)
this._spawns.put(paramString, localObject = new ArrayList());
((List)localObject).add(paramSpawnTemplate);
}

public Map<String, List<SpawnTemplate>> getSpawns()
{
return this._spawns;
}
}
И инициализация:
public abstract class Parsers
{
public static void parseAll()
{
HtmCache.getInstance().reload();
SpawnParser.getInstance().load();
ResidenceParser.getInstance().load();
EventParser.getInstance().load();
CubicParser.getInstance().load();
MultiSellHolder.getInstance();
}
}
Ну если у него ещё и в бд то он одноклеточное существо
 
Поправил загрузку нпц. Косяк разработчика. С такими багами отдают клиентам =)
Ошибка была в DefaultAI ( метод thinkActive() )
 

Вложения

  • core.7z
    2,6 МБ · Просмотры: 335
Поправил загрузку нпц. Косяк разработчика. С такими багами отдают клиентам :)
Ошибка была в DefaultAI ( метод thinkActive() )
Украсть с овера мозгов хватает, а сделать верно не хватает
 
Поправил загрузку нпц. Косяк разработчика. С такими багами отдают клиентам :)
Ошибка была в DefaultAI ( метод thinkActive() )
В оригинальной клиентке косяков таких нет и не было :)
Скорее всего из-за декомпила/компила.

Видимо люди кроме гавнокода тру пивипи интерблюдов ничего не видели, окей декомпилю его ворованную работу висталла:
package l2p.gameserver.data.xml.parser;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import l2p.commons.collections.MultiValueSet;
import l2p.commons.data.xml.AbstractDirParser;
import l2p.commons.geometry.Polygon;
import l2p.gameserver.Config;
import l2p.gameserver.data.xml.holder.SpawnHolder;
import l2p.gameserver.model.Territory;
import l2p.gameserver.templates.StatsSet;
import l2p.gameserver.templates.spawn.PeriodOfDay;
import l2p.gameserver.templates.spawn.SpawnNpcInfo;
import l2p.gameserver.templates.spawn.SpawnTemplate;
import l2p.gameserver.utils.Location;
import org.dom4j.Element;

public final class SpawnParser extends AbstractDirParser<SpawnHolder>
{
private static final SpawnParser _instance = new SpawnParser();

protected SpawnParser()
{
super(SpawnHolder.getInstance());
}

public static SpawnParser getInstance()
{
return _instance;
}

public File getXMLDir()
{
return new File(Config.DATAPACK_ROOT, "data/spawn/");
}

public boolean isIgnored(File paramFile)
{
return false;
}

public String getDTDFileName()
{
return "spawn.dtd";
}

protected void readData(Element paramElement)
throws Exception
{
HashMap localHashMap = new HashMap();
for (Iterator localIterator1 = paramElement.elementIterator(); localIterator1.hasNext(); )
{
Element localElement1 = (Element)localIterator1.next();
String str1;
if (localElement1.getName().equalsIgnoreCase("territory"))
{
str1 = localElement1.attributeValue("name");
Territory localTerritory1 = parseTerritory(str1, localElement1);
localHashMap.put(str1, localTerritory1);
}
else if (localElement1.getName().equalsIgnoreCase("spawn"))
{
str1 = localElement1.attributeValue("group");
int i = localElement1.attributeValue("respawn") == null ? 60 : Integer.parseInt(localElement1.attributeValue("respawn"));
int j = localElement1.attributeValue("respawn_random") == null ? 0 : Integer.parseInt(localElement1.attributeValue("respawn_random"));
int k = localElement1.attributeValue("count") == null ? 1 : Integer.parseInt(localElement1.attributeValue("count"));
PeriodOfDay localPeriodOfDay = localElement1.attributeValue("period_of_day") == null ? PeriodOfDay.NONE : PeriodOfDay.valueOf(localElement1.attributeValue("period_of_day").toUpperCase());
if (str1 == null)
str1 = localPeriodOfDay.name();
SpawnTemplate localSpawnTemplate = new SpawnTemplate(localPeriodOfDay, k, i, j);

for (Iterator localIterator2 = localElement1.elementIterator(); localIterator2.hasNext(); )
{
Element localElement2 = (Element)localIterator2.next();
if (localElement2.getName().equalsIgnoreCase("point"))
{
int m = Integer.parseInt(localElement2.attributeValue("x"));
int i1 = Integer.parseInt(localElement2.attributeValue("y"));
int i3 = Integer.parseInt(localElement2.attributeValue("z"));
int i4 = localElement2.attributeValue("h") == null ? -1 : Integer.parseInt(localElement2.attributeValue("h"));

localSpawnTemplate.addSpawnRange(new Location(m, i1, i3, i4));
}
else if (localElement2.getName().equalsIgnoreCase("territory"))
{
String str2 = localElement2.attributeValue("name");
Territory localTerritory2;
if (str2 != null)
{
localTerritory2 = (Territory)localHashMap.get(str2);
if (localTerritory2 == null)
{
error("Invalid territory name: " + str2 + "; " + getCurrentFileName());
continue;
}
localSpawnTemplate.addSpawnRange(localTerritory2);
}
else
{
localTerritory2 = parseTerritory(null, localElement2);

localSpawnTemplate.addSpawnRange(localTerritory2);
}
}
else if (localElement2.getName().equalsIgnoreCase("npc"))
{
int n = Integer.parseInt(localElement2.attributeValue("id"));
int i2 = localElement2.attributeValue("max") == null ? 0 : Integer.parseInt(localElement2.attributeValue("max"));
Object localObject = StatsSet.EMPTY;
for (Element localElement3 : localElement2.elements())
{
if (((MultiValueSet)localObject).isEmpty()) {
localObject = new MultiValueSet();
}
((MultiValueSet)localObject).set(localElement3.attributeValue("name"), localElement3.attributeValue("value"));
}
localSpawnTemplate.addNpc(new SpawnNpcInfo(n, i2, (MultiValueSet)localObject));
}
}

if (localSpawnTemplate.getNpcSize() == 0)
{
warn("Npc id is zero! File: " + getCurrentFileName());
continue;
}

if (localSpawnTemplate.getSpawnRangeSize() == 0)
{
warn("No points to spawn! File: " + getCurrentFileName());
continue;
}

((SpawnHolder)getHolder()).addSpawn(str1, localSpawnTemplate);
}
}
}

private Territory parseTerritory(String paramString, Element paramElement)
{
Territory localTerritory = new Territory();
localTerritory.add(parsePolygon0(paramString, paramElement));

for (Iterator localIterator = paramElement.elementIterator("banned_territory"); localIterator.hasNext(); ) {
localTerritory.addBanned(parsePolygon0(paramString, (Element)localIterator.next()));
}
return localTerritory;
}

private Polygon parsePolygon0(String paramString, Element paramElement)
{
Polygon localPolygon = new Polygon();
for (Iterator localIterator = paramElement.elementIterator("add"); localIterator.hasNext(); )
{
Element localElement = (Element)localIterator.next();
int i = Integer.parseInt(localElement.attributeValue("x"));
int j = Integer.parseInt(localElement.attributeValue("y"));
int k = Integer.parseInt(localElement.attributeValue("zmin"));
int m = Integer.parseInt(localElement.attributeValue("zmax"));
localPolygon.add(i, j).setZmin(k).setZmax(m);
}

if (!localPolygon.validate())
error("Invalid polygon: " + paramString + "{" + localPolygon + "}. File: " + getCurrentFileName());
return localPolygon;
}
}
Ну и хранилище
package l2p.gameserver.data.xml.holder;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import l2p.commons.data.xml.AbstractHolder;
import l2p.gameserver.templates.spawn.SpawnTemplate;

public final class SpawnHolder extends AbstractHolder
{
private static final SpawnHolder _instance = new SpawnHolder();

private Map<String, List<SpawnTemplate>> _spawns = new HashMap();

public void clear()
{
this._spawns.clear();
}

public int size()
{
int i = 0;
for (List localList : this._spawns.values()) {
i += localList.size();
}
return i;
}

public static SpawnHolder getInstance()
{
return _instance;
}

public List<SpawnTemplate> getSpawn(String paramString)
{
List localList = (List)this._spawns.get(paramString);
return localList == null ? Collections.emptyList() : localList;
}

public void addSpawn(String paramString, SpawnTemplate paramSpawnTemplate)
{
Object localObject = (List)this._spawns.get(paramString);
if (localObject == null)
this._spawns.put(paramString, localObject = new ArrayList());
((List)localObject).add(paramSpawnTemplate);
}

public Map<String, List<SpawnTemplate>> getSpawns()
{
return this._spawns;
}
}
И инициализация:
public abstract class Parsers
{
public static void parseAll()
{
HtmCache.getInstance().reload();
SpawnParser.getInstance().load();
ResidenceParser.getInstance().load();
EventParser.getInstance().load();
CubicParser.getInstance().load();
MultiSellHolder.getInstance();
}
}
Ну если у него ещё и в бд то он одноклеточное существо
Судя по последней клиентке - спаун берётся из таблицы и хмл :)
 
В оригинальной клиентке косяков таких нет и не было :)
Скорее всего из-за декомпила/компила.
Нет там ошибка именно разработчика. Декомплила не было же. Ошибка есть и в сборке с привязкой.
Классы я не пересобирал а изменил байткод.
 
Нет там ошибка именно разработчика. Декомплила не было же. Ошибка есть и в сборке с привязкой.
Классы я не пересобирал а изменил байткод.
по такой сборка не может стоять на проектах без НПС
 
скинули же фикс ядра
Test пишет что это ошибка разработчика, по логике на клиентке тоже мобов нет, а по твоей логике, когда тут выложили фикс, клиенты Пайн тим могут скачать крякнутое рабочее ядро и играть с мобами?)
 
Таблицы нужны кому то ещё ?
 
фикс ядра вроде как дали, а вот от патча думаю никто бы не отказался:)
ссылку кидали она один сайт где стоит сборка пейнов ) только не помню название
там можно патчик скачать
 
кто за денюжку поставит сборку?

или в идеале отвяжет мою
 
Последнее редактирование модератором:
сделал сам
халявные 500р пролетели мимо)
 
Последнее редактирование:
Назад
Сверху Снизу