Oliveshka 0 Опубликовано 12 июня, 2019 (изменено) Привет. Прошу помощи, ГС выдаёт ошибку, не могу понять в чем проблема. INFO parser.InstantZoneParser: InstantZoneParser: Exception: java.lang.IllegalArgumentException: Invalid type?: Seed of Destruction in file: [110] Seed of Destruction.xml java.lang.IllegalArgumentException: Invalid type?: Seed of Destruction at l2p.gameserver.templates.InstantZone.<init>(InstantZone.java:217) at l2p.gameserver.data.xml.parser.InstantZoneParser.readData(InstantZoneParser.java:270) at l2p.commons.data.xml.AbstractParser.parseDocument(AbstractParser.java:37) at l2p.commons.data.xml.AbstractDirParser.parse(AbstractDirParser.java:50) at l2p.commons.data.xml.AbstractParser.load(AbstractParser.java:53) at l2p.gameserver.data.xml.Parsers.parseAll(Parsers.java:70) at l2p.gameserver.GameServer.<init>(GameServer.java:186) at l2p.gameserver.GameServer.main(GameServer.java:379) Спойлер package l2p.gameserver.templates; import java.util.List; import java.util.Map; import l2p.commons.time.cron.SchedulingPattern; import l2p.commons.util.Rnd; import l2p.gameserver.Config; import l2p.gameserver.instancemanager.ReflectionManager; import l2p.gameserver.model.Territory; import l2p.gameserver.templates.spawn.SpawnTemplate; import l2p.gameserver.serverpackets.components.IStaticPacket; import l2p.gameserver.serverpackets.components.SystemMsg; import l2p.gameserver.utils.Location; import org.napile.primitive.maps.IntObjectMap; public class InstantZone { public static class DoorInfo { private final DoorTemplate _template; private final boolean _opened; private final boolean _invul; public DoorInfo(DoorTemplate template, boolean opened, boolean invul) { _template = template; _opened = opened; _invul = invul; } public DoorTemplate getTemplate() { return _template; } public boolean isOpened() { return _opened; } public boolean isInvul() { return _invul; } } public static class ZoneInfo { private final ZoneTemplate _template; private final boolean _active; public ZoneInfo(ZoneTemplate template, boolean opened) { _template = template; _active = opened; } public ZoneTemplate getTemplate() { return _template; } public boolean isActive() { return _active; } } public static class SpawnInfo2 { private List<SpawnTemplate> _template; private boolean _spawned; public SpawnInfo2(List<SpawnTemplate> template, boolean spawned) { _template = template; _spawned = spawned; } public List<SpawnTemplate> getTemplates() { return _template; } public boolean isSpawned() { return _spawned; } } // @Deprecated public static class SpawnInfo { private final int _spawnType; private final int _npcId; private final int _count; private final int _respawn; private final int _respawnRnd; private final List<Location> _coords; private final Territory _territory; public SpawnInfo(int spawnType, int npcId, int count, int respawn, int respawnRnd, Territory territory) { this(spawnType, npcId, count, respawn, respawnRnd, null, territory); } public SpawnInfo(int spawnType, int npcId, int count, int respawn, int respawnRnd, List<Location> coords) { this(spawnType, npcId, count, respawn, respawnRnd, coords, null); } public SpawnInfo(int spawnType, int npcId, int count, int respawn, int respawnRnd, List<Location> coords, Territory territory) { _spawnType = spawnType; _npcId = npcId; _count = count; _respawn = respawn; _respawnRnd = respawnRnd; _coords = coords; _territory = territory; } public int getSpawnType() { return _spawnType; } public int getNpcId() { return _npcId; } public int getCount() { return _count; } public int getRespawnDelay() { return _respawn; } public int getRespawnRnd() { return _respawnRnd; } public List<Location> getCoords() { return _coords; } public Territory getLoc() { return _territory; } } private final int _id; private final String _name; private final SchedulingPattern _resetReuse; private final int _sharedReuseGroup; private final int _timelimit; private boolean _dispelBuffs; private final int _minLevel; private final int _maxLevel; private final int _minParty; private final int _maxParty; private final boolean _onPartyDismiss; private final int _timer; private final List<Location> _teleportCoords; private final Location _returnCoords; private final int _mapx; private final int _mapy; private final IntObjectMap<DoorInfo> _doors; private final Map<String, ZoneInfo> _zones; private final Map<String, SpawnInfo2> _spawns; private final List<SpawnInfo> _spawnsInfo; private final int _collapseIfEmpty; private final int _maxChannels; private final int _removedItemId; private final int _removedItemCount; private final boolean _removedItemNecessity; private final int _giveItemId; private final int _givedItemCount; private final int _requiredQuestId; private final boolean _setReuseUponEntry; private final StatsSet _addParams; private final InstantZoneEntryType _entryType; public InstantZone(int id, String name, SchedulingPattern resetReuse, int sharedReuseGroup, int timelimit, boolean dispelBuffs, int minLevel, int maxLevel, int minParty, int maxParty, int timer, boolean onPartyDismiss, List<Location> tele, Location ret, int mapx, int mapy, IntObjectMap<DoorInfo> doors, Map<String, ZoneInfo> zones, Map<String, SpawnInfo2> spawns, List<SpawnInfo> spawnsInfo, int collapseIfEmpty, int maxChannels, int removedItemId, int removedItemCount, boolean removedItemNecessity, int giveItemId, int givedItemCount, int requiredQuestId, boolean setReuseUponEntry, StatsSet params) { _id = id; _name = name; _resetReuse = resetReuse; _sharedReuseGroup = sharedReuseGroup; _timelimit = timelimit; _dispelBuffs = dispelBuffs; _minLevel = minLevel; _maxLevel = maxLevel; _teleportCoords = tele; _returnCoords = ret; _minParty = minParty; _maxParty = maxParty; _onPartyDismiss = onPartyDismiss; _timer = timer; _mapx = mapx; _mapy = mapy; _doors = doors; _zones = zones; _spawnsInfo = spawnsInfo; _spawns = spawns; _collapseIfEmpty = collapseIfEmpty; _maxChannels = maxChannels; _removedItemId = removedItemId; _removedItemCount = removedItemCount; _removedItemNecessity = removedItemNecessity; _giveItemId = giveItemId; _givedItemCount = givedItemCount; _requiredQuestId = requiredQuestId; _setReuseUponEntry = setReuseUponEntry; _addParams = params; if (getMinParty() == 1 && getMaxParty() <= 9) { _entryType = InstantZoneEntryType.SOLO; } else if (getMinParty() >= 2 && getMaxParty() <= 9) { _entryType = InstantZoneEntryType.PARTY; } else if (getMinParty() >= 9 && getMaxParty() > 9) { _entryType = InstantZoneEntryType.COMMAND_CHANNEL; } else { throw new IllegalArgumentException("Invalid type?: " + _name); } } public int getId() { return _id; } public String getName() { return _name; } public SchedulingPattern getResetReuse() { return _resetReuse; } public boolean isDispelBuffs() { return _dispelBuffs; } public int getTimelimit() { return _timelimit; } public int getMinLevel() { return _minLevel; } public int getMaxLevel() { return _maxLevel; } public int getMinParty() { return _minParty; } public int getMaxParty() { return _maxParty; } public int getTimerOnCollapse() { return _timer; } public boolean isCollapseOnPartyDismiss() { return _onPartyDismiss; } public Location getTeleportCoord() { if (_teleportCoords.size() == 1) // fast hack? { return _teleportCoords.get(0); } return _teleportCoords.get(Rnd.get(_teleportCoords.size())); } public Location getReturnCoords() { return _returnCoords; } public int getMapX() { return _mapx; } public int getMapY() { return _mapy; } public List<SpawnInfo> getSpawnsInfo() { return _spawnsInfo; } public int getSharedReuseGroup() { return _sharedReuseGroup; } public int getCollapseIfEmpty() { return _collapseIfEmpty; } public int getRemovedItemId() { return _removedItemId; } public int getRemovedItemCount() { return _removedItemCount; } public boolean getRemovedItemNecessity() { return _removedItemNecessity; } public int getGiveItemId() { return _giveItemId; } public int getGiveItemCount() { return _givedItemCount; } public int getRequiredQuestId() { return _requiredQuestId; } public boolean getSetReuseUponEntry() { return _setReuseUponEntry; } public int getMaxChannels() { return _maxChannels; } public InstantZoneEntryType getEntryType() { return _entryType; } public IntObjectMap<DoorInfo> getDoors() { return _doors; } public Map<String, ZoneInfo> getZones() { return _zones; } public List<Location> getTeleportCoords() { return _teleportCoords; } public Map<String, SpawnInfo2> getSpawns() { return _spawns; } public StatsSet getAddParams() { return _addParams; } public IStaticPacket canCreate() { if (ReflectionManager.getInstance().size() > Config.MAX_REFLECTIONS_COUNT) { return SystemMsg.THE_MAXIMUM_NUMBER_OF_INSTANCE_ZONES_HAS_BEEN_EXCEEDED; } if (ReflectionManager.getInstance().getCountByIzId(_id) >= _maxChannels) { return SystemMsg.THE_MAXIMUM_NUMBER_OF_INSTANCE_ZONES_HAS_BEEN_EXCEEDED; } return null; } } Поменял только это (хотел от 1 до 45) Спойлер <instance id="110" name="Seed of Destruction" maxChannels="3" collapseIfEmpty="20" timelimit="130" dispelBuffs="false"> <collapse on-party-dismiss="true" timer="60"/> <level min="75" max="85"/> <party min="36" max="45"/> <return loc="-248376 250440 4344"/> <teleport loc="-242738 219995 -9984"/> <remove itemId="0" count="0" necessary="false"/> <give itemId="0" count="0"/> <quest id="0"/> Изменено 12 июня, 2019 пользователем Oliveshka Добавил Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Oliveshka 0 Опубликовано 12 июня, 2019 Будет ли правильным если поменять эти значения? Спойлер if (getMinParty() == 1 && getMaxParty() <= 9) { _entryType = InstantZoneEntryType.SOLO; } else if (getMinParty() >= 2 && getMaxParty() <= 9) { _entryType = InstantZoneEntryType.PARTY; } else if (getMinParty() >= 9 && getMaxParty() > 9) { _entryType = InstantZoneEntryType.COMMAND_CHANNEL; } else { throw new IllegalArgumentException("Invalid type?: " + _name); } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
LordWinter 78 Опубликовано 12 июня, 2019 (изменено) 1 час назад, Oliveshka сказал: Будет ли правильным если поменять эти значения? InstantZone.java (Скрыть контент) if (getMinParty() == 1 && getMaxParty() <= 9) { _entryType = InstantZoneEntryType.SOLO; } else if (getMinParty() >= 2 && getMaxParty() <= 9) { _entryType = InstantZoneEntryType.PARTY; } else if (getMinParty() >= 9 && getMaxParty() > 9) { _entryType = InstantZoneEntryType.COMMAND_CHANNEL; } else { throw new IllegalArgumentException("Invalid type?: " + _name); } ты уже сам нашел проверки на определение типа инсты, соответственно если ты делаешь <party min="1" max="45"/> сервер не может определить тип так как ни один способ не соответствует твоему требованию Вывод: или допиши проверку на минималку 1 до 45 с указанием к какому типу будет определена инста либо меняй по стандарту 1-9 соло 2-9 пати 9-45+ командный канал Изменено 12 июня, 2019 пользователем LordWinter Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Oliveshka 0 Опубликовано 12 июня, 2019 Спасибо, понял! Не знаю как тут + ставить. тему можно закрыть. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 12 июня, 2019 (изменено) Или сделай как я к примеру сделал когда мне потребовалось что-то подобное - дай возможность задавать несколько типов для инстанса т.е. к примеру возможность зайти в соло или в пати вот к примеру так задается и разбирается параметр типа входа String[] entryType = params.getString("entryType", "AUTO").toUpperCase().split(";"); if (entryType[0].equalsIgnoreCase("AUTO")) { if (getMinPlayers() == 1) _entryType = new InstantZoneEntryType[] { InstantZoneEntryType.SOLO }; else if (getMinPlayers() > 1 && getMaxPlayers() <= OtherConfig.PARTY_MAX_SIZE) _entryType = new InstantZoneEntryType[] { InstantZoneEntryType.PARTY }; else if (getMaxPlayers() > OtherConfig.PARTY_MAX_SIZE) _entryType = new InstantZoneEntryType[] { InstantZoneEntryType.COMMAND_CHANNEL }; else throw new IllegalArgumentException("Invalid type?: " + _name); } else { _entryType = new InstantZoneEntryType[entryType.length]; for (int i = 0; i < entryType.length; i++) _entryType[i] = InstantZoneEntryType.valueOf(InstantZoneEntryType.class, entryType[i]); } ну и само собой в проверке canReenterInstance и в enterReflection идет перебор всех разрешенных вариантов входа т.е. к примеру указано "PARTY;SOLO" - сначала проверит, в пати ли игрок и если да, то вернет что инстанс для пати и надо сделать проверки входа как для пати, а если игрок не в пати - сделать проверки как для соло. тогда в итоге к примеру количество игроков 5-9 будет означать что вход для одного игрока без пати или же в пати 5-9 человек Изменено 12 июня, 2019 пользователем Gaikotsu 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Oliveshka 0 Опубликовано 12 июня, 2019 3 часа назад, Gaikotsu сказал: Или сделай как я к примеру сделал когда мне потребовалось что-то подобное Интересное решение, спасибо. Возьму на заметку Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты