Предметы петов на персе

BadStealth

Величайший
Местный
Сообщения
309
Розыгрыши
0
Репутация
429
Реакции
595
Баллы
1 573
Итак ребят создал новую тему- так как по правилам 1 вопрос 1 тема.
Вопрос у меня к ГУРУ -вобщем у меня насервере если призвать пета (например фенрира)- а после не выходя с клиента перезагрузить сервер, то броня и оружие пета после релога одеваются на перса.
В окне выбора перса смотрится просто как пустое место -вместо брони на месте корпуса прозрачное место- тоже и с оружием.

Подскажите где смотреть? Я так понимаю что это записывается в БД сразу после вызова пета и одевая на него бронь и оружие оно тоже пишется в БД.
Как сделать чтобы при чтении после релога с БД- орудие и броня петов не надевалась на перса а оставалась его броня и оружие.
В инвентаре исправил теперь после перезахода в саму игру оружие и броня пета снимаются- но на экране выбора перса- все также.
Да и после перезахода с перса снимается та броня которая на нем была одета и оружие. А хотелось бы чтобы его броня и оружие оставались одетыми.
В каком файле смотреть- где может отправляться запрос на запись данных состояний в БД и как там можно подправить? Ато уже неделю сижу и понять не могу.
Сборка Эпилог от Voron Dev на основе Фениксов.
 
Последнее редактирование модератором:
При заходе на сервер(меню выбора персонажа) сервер шлет пакет
/* 0x9:0x0 */ CharacterSelectionInfoPacket
в нем идет считывание надетых предметов на персонажа непосредственно с БД, видимо у вас при перетаскивании предмета в инвентарь пета, ему не присваивается objectId питомца, и по этому сервер считает что он надет на вас(по базе).
Или же у вас не тот Location стоит, все зависит от эмулятора.

П.С. Выкиньте это убожество и возьмите любой шарный сурс(и то будет лучше "этого").
 
Последнее редактирование модератором:
Я этот люблю- просто мне он по душе и много уже исправил.
А в каком файле смотреть? Чтобы при одевании на пета предмету присваивался objectId питомца?
Вот что нашел в L2PetInstance
Код:
    public boolean tryEquipItem(L2ItemInstance item, boolean broadcast)
    {
        if(!item.isEquipable())
        {
            return false;
        }
        int petId = ((L2NpcTemplate) _template).npcId;
        if(item.getItem().isPendant() //
            || PetDataTable.isWolf(petId) && item.getItem().isForWolf() //
            || PetDataTable.isHatchling(petId) && item.getItem().isForHatchling() //
            || PetDataTable.isStrider(petId) && item.getItem().isForStrider() //
            || PetDataTable.isGWolf(petId) && item.getItem().isForGWolf() //
            || PetDataTable.isBabyPet(petId) && item.getItem().isForPetBaby() //
            || PetDataTable.isImprovedBabyPet(petId) && item.getItem().isForPetBaby() //
            )
        {
            if(item.isEquipped())
            {
                _inventory.unEquipItemInSlot(item.getEquipSlot());
            }
            else
            {
                _inventory.equipItem(item, true);
            }
            if(broadcast)
            {
                sendItemList();
                broadcastPetInfo();
            }
            return true;
        }
        return false;
    }
 
вобще по уму вещи одетые на пета должны иметь отдельный тип месторасположения.
к примеру в овере если тушка перса это PAPERDOLL, то для пета это PET_PAPERDOLL и друг с другом они банально не пересекаются. т.е. просто не может возникнуть ситуация что внезапно то что было одето на пета оказалось одетым на самого персонажа.
 
тушка перса это PAPERDOLL, то для пета это PET_PAPERDOLL
Спасибо Gaikotsu все теперь нормально все предметы пета теперь идут только пету. А перс теперь нормально со своими вещами.
Вот столько парился а теперь исправил. Посмотрел как в овере и переделал для себя теперь все нормально работает.
Просто не знал где смотреть!
Блин новая проблема.
Теперь если у пета были броня и оружие экипированы- то его предметы после релога сервера- не восстанавливаются в инвентаре.
Хотя в самой базе они есть и запись стоит
Код:
268485614    268484372    9661    Enchanted Fenril Fang    1    0    EQUIPMENT    PET_PAPERDOLL    7    0    0    -1    1024
Вот код восстановления инвентаря. Что там нужно исправить чтобы с базы предмет восстанавливал?
Код:
    public void restore()
    {
        final int OWNER = getOwner().getObjectId();
        ThreadConnection con = null;
        FiltredPreparedStatement statement = null;
        ResultSet rset = null;
        try
        {
            con = L2DatabaseFactory.getInstance().getConnection();
            statement = con.prepareStatement("SELECT * FROM items WHERE owner_id=? AND (loc=? OR loc=?) ORDER BY object_id DESC");
            statement.setInt(1, OWNER);
            statement.setString(2, getBaseLocation().name());
            statement.setString(3, getEquipLocation().name());
            rset = statement.executeQuery();
            L2ItemInstance item, newItem;
            while(rset.next())
            {
                if((item = L2ItemInstance.restoreFromDb(rset, con, true)) == null)
                {
                    continue;
                }
                newItem = addItem(item, false, false);
                if(newItem == null)
                {
                    continue;
                }
                if(item.isEquipped())// && !item.getItem().isForPet())
                {
                    equipItem(item, false);
                }
            }
        }
        catch(Exception e)
        {
            _log.log(Level.WARNING, "could not restore inventory for player " + getOwner().getName() + ":", e);
        }
        finally
        {
            DatabaseUtils.closeDatabaseCSR(con, statement, rset);
        }
    }
Просто к обращениям с базы я еще не дорос. Gaikotsu подскажите как подправить чтобы восстанавливал предметы пета с базы.
 
Последнее редактирование:
у меня восстановление идет просто. в PetInventory
Код:
	@Override
	public void restore()
	{
		final int ownerId = getOwnerId();

		writeLock();
		try
		{
			Collection<ItemInstance> items = _itemsDAO.getItemsByOwnerIdAndLoc(ownerId, getBaseLocation());

			for (ItemInstance item : items)
			{
				_items.add(item);
				onRestoreItem(item);
			}

			items = _itemsDAO.getItemsByOwnerIdAndLoc(ownerId, getEquipLocation());

			for (ItemInstance item : items)
			{
				_items.add(item);
				onRestoreItem(item);
				if (ItemUtils.checkIfCanEquip(getActor(), item) == null)
					setPaperdollItem(item.getEquipSlot(), item);
			}
		}
		finally
		{
			writeUnlock();
		}

		refreshWeight();
	}

getBaseLocation() - в данном случае ItemLocation.PET_INVENTORY, а getEquipLocation() - ItemLocation.PET_PAPERDOLL
 
getBaseLocation() - в данном случае ItemLocation.PET_INVENTORY, а getEquipLocation() - ItemLocation.PET_PAPERDOLL
У меня это не проходит- потому что при восстановлении инвентаря он почему-то не восстанавливает предметы пета, хотя в базу запись о них есть.
Сейчас предметы пета уже не одеваются на перса- но если пет призван и в его инвентаре есть предметы для пета то он не читает с базы и не хочет восстанавливать. В итоге при загрузке перса- предметов от пета нет в инвентаре а в базе они есть.
Вот и думаю как сделать чтобы эти предметы тоже восстанавливал...
 
Все испробовал- ничего не могу понять. Как сделать чтобы при восстановлении инвентаря- предметы владельца с loc=PET_PAPERDOLL переносило в Инвентарь владельца?
Запись в БД есть что предмет есть но loc=PET_PAPERDOLL не восстанавливает в инвентарь пока не поменяешь на INVENTORY.
Код:
268485614    268484372    9661    Enchanted Fenril Fang    1    0    EQUIPMENT    PET_PAPERDOLL    7    0    0    -1    1024
Ребят подскажите как можно сделать чтобы восстанавливалось в инвентарь владельца- ато после рестарта сервера если пет был призван- то предметы пета пропадают. Хотя в базе они остаются.
 
Выкинь этот ворон дев на помойку.
Человек который слил исходник, натворил в нем таких делов.
Бегал я по серву, решил вызвать сумона, вызвалось 2 сразу и упала геодата на серве.
 
Ну у меня 2 сумона не вызывается. С этим все нормально.
Ну а так мне сборочка понравилась. Да много что нужно сделать-но делаю потихонечку.
Вот щас пытаюсь очередную проблему решить.
 
Все решил сам вопрос. После долгих мучений сделал так чтобы при восстановлении инвентаря если в базе находились предметы с пометкой PET_PAPERDOLL или PET_INVENTORY он перед считыванием содержимого инвентаря из базы присваивал им местоположение инвентаря. Плюс сделал проверку чтобы восстанавливал именно того владельца для которого восстанавливаем инвентарь.
Код:
    public void restore()
    {
        final int OWNER = getOwner().getObjectId();
     
        ThreadConnection con = null;
        FiltredPreparedStatement statement = null;
        ResultSet rset = null;

        mysql.set("UPDATE `items` SET `loc`='INVENTORY' WHERE (`loc`='PET_PAPERDOLL' OR `loc`='PET_INVENTORY') AND `owner_id`=" + OWNER);//возвращает предметы пета в инвентарь именно того владельца для которого восстанавливаем инвентарь
        try
        {
            con = L2DatabaseFactory.getInstance().getConnection();
            statement = con.prepareStatement("SELECT * FROM items WHERE owner_id=? AND (loc=? OR loc=?) ORDER BY object_id DESC");
            statement.setInt(1, OWNER);
            statement.setString(2, getBaseLocation().name());
            statement.setString(3, getEquipLocation().name());
            rset = statement.executeQuery();
         
            L2ItemInstance item, newItem;
            while(rset.next())
            {
                if((item = L2ItemInstance.restoreFromDb(rset, con, true)) == null)
                {
                    continue;
                }
                newItem = addItem(item, false, false);
                if(newItem == null)
                {
                    continue;
                }
                if(item.isEquipped())
                {
                    equipItem(item, false);
                }
                if (item.getEquipSlot() >= PAPERDOLL_MAX)
                {
                    // Неверный слот - возвращаем предмет в инвентарь.
                    item.setLocation(getBaseLocation(), findSlot(0));
                    unEquipItem(item);
                    continue;
                }
            }
        }
        catch(Exception e)
        {
            _log.log(Level.WARNING, "could not restore inventory for player " + getOwner().getName() + ":", e);
        }
        finally
        {
            DatabaseUtils.closeDatabaseCSR(con, statement, rset);
        }
    }
Теперь все работает вроде как надо и предметы восстанавливаются и на перса не одеваются. Темку можно закрывать.
Ответ на решение проблемы указал- может кому и пригодиться!:Bb1: