Oliveshka

Ошибка ГС

6 posts in this topic

Posted (edited)

Привет. Прошу помощи, ГС выдаёт ошибку, не могу понять в чем проблема.  
 

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"/>

 

Edited by Oliveshka
Добавил

Share this post


Link to post
Share on other sites

Будет ли правильным если поменять эти значения?
 

Спойлер

        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);
        }

 

Share this post


Link to post
Share on other sites
Posted (edited)
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+ командный канал

Edited by LordWinter

Share this post


Link to post
Share on other sites

Спасибо, понял! Не знаю как тут + ставить. тему можно закрыть. 

Share this post


Link to post
Share on other sites
Posted (edited)

Или сделай как я к примеру сделал когда мне потребовалось что-то подобное - дай возможность задавать несколько типов для инстанса

т.е. к примеру возможность зайти в соло или в пати

вот к примеру так задается и разбирается параметр типа входа

		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 человек

Edited by Gaikotsu
  • Like 1

Share this post


Link to post
Share on other sites
3 часа назад, Gaikotsu сказал:

Или сделай как я к примеру сделал когда мне потребовалось что-то подобное

Интересное решение, спасибо. Возьму на заметку

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.