Сообщений: 561
	Тем: 44
	Зарегистрирован: Sep 2011
	
Репутация: 
412
	 
	
	
		Кто то мне может объяснить почему в объект PhantomInfo сохраняется все из таблицы phantoms кроме
 поля `class_id` и при любом пуке оно его тянет из базы.
PHP код:
<?php 
public int getSubclassByObjId(int obj_id)
    {
....
            statement = con.prepareStatement("SELECT class_id FROM phantoms WHERE obj_Id=?");
... 
В методе рядом вообще  ошибочно продублирован код из предыдущего метода:
PHP код:
<?php 
public boolean isHasEquip(int obj_id)
    {
        int result = 0;
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rset = null;
        try
        {
            con = DatabaseFactory.getInstance().getConnection();
            statement = con.prepareStatement("SELECT class_id FROM items WHERE char_obj_id=?");
            statement.setInt(1, obj_id);
            rset = statement.executeQuery();
            if(rset.next())
                result = rset.getInt(1);
        }
        catch(Exception e)
        {
            _log.error("CharNameTable.getSubclassByObjId(Int): " + e, e);
        }
        finally
        {
            DbUtils.closeQuietly(con, statement, rset);
        }
        return false;
    } 
 
Зачем проверка? 
!PhantomSpawnParser.getSpawnLocs().isEmpty()
PHP код:
<?php 
if(PhantomSpawnParser.getSpawnLocs() != null && !PhantomSpawnParser.getSpawnLocs().isEmpty())
            {
                for(PhantomSpawnObjectInfo spawn_object : PhantomSpawnParser.getSpawnLocs())
                {
... 
 
	
	
	
		
	Сообщений: 561
	Тем: 44
	Зарегистрирован: Sep 2011
	
Репутация: 
412
	 
	
		
		
		03-29-2016, 11:27 PM 
(Сообщение последний раз редактировалось: 03-30-2016, 01:42 AM   flopix.)
		
	 
	
		А это вообще интересный момент.
PHP код:
<?php 
// перебираем фантомов, пока на получим нужного по ИИ
            while(fakeObjId == -1 || PhantomsEngine.getInstance().isPhantomAlreadySpawned(fakeObjId))
                fakeObjId = getMatch(ai_type); 
Если фантома нужного класса нет в наличии то этот цикл будет исполнятся бесконечно, а внутри функции getMatch идет обращение к БД для получения класса.
И нет бы перебрать один раз весь список чтобы  убедится что в нем есть или отсутствует еще не задействованный фантом нужного типа, но нет мы в цикле из всего списка тыкаем случайный индекс и каждый раз проверяем подходит ли он нам. Если нет - повторяем поиск. Если там например такой фантом даже и есть но только один тыкаться можно очень долго. Бред.
	
 
	
	
	
	
 
	
	
	
		
	Сообщений: 105
	Тем: 22
	Зарегистрирован: Mar 2010
	
Репутация: 
279
	 
	
	
		Странно на давнешнем видео видел, как они били мобов, юзали соски, пвп-шились.
	
	
	
	
	
 
 
	
	
	
		
	Сообщений: 287
	Тем: 24
	Зарегистрирован: Feb 2010
	
Репутация: 
919
	 
	
	
		flopix Написал:Connie, раз уже выложили исходники будьте добры выложите  недостающие методы.
Например:
Player.createFakePlayer(obj_id, template);
PHP код:
<?php 
public static Player createFakePlayer(int objId, PcTemplate pc_template) {
        return new Player(objId, pc_template);
    } 
 PHP код:
<?php 
public Player(final int objectId, final PcTemplate pc_template, final String accountName)
    {
        super(objectId);
        setPcTemplate(pc_template);
        _login = accountName;
        _nameColor = 0xFFFFFF;
        _titlecolor = 0xFFFF77;
        _baseClass = getPcClass().class_id;
        base_class = pc_template.pc_class;
        base_race = pc_template.pc_template_type.race;
        _cubics = new CopyOnWriteArrayList<EffectCubic>();
        phantom_params = new PhantomParams(this);
        playerRating = new PlayerRating(objectId);
    } 
 	
	flopix Написал:Проясните логику работы.
Система сама не создает фейк игроков?
Нужно в таблицу phantoms натыкать заранее заготовленных существующих в таблице characters игроков?
Зачем тогда дублируется имя в этой таблице?
1. Тот код, что тут выложен - не создает новых ботов. 
2. Да, нужно.
3. Они мне мешали в таблице characters, к тому же, информации об игроках хранится много больше, чем о ботах, и чтобы не засорять БД ненужной информацией была создана таблица phantoms. (БД меньше весит от этого, быстрее работает.)
flopix Написал:Что такое тогда такое `obj_id` в этой таблице?
Это obj_id для создания Player с этим ID. Без этого никак. 
flopix Написал:То есть этот obj_id никак не связан с аналогичным полем в таблице characters?
И тогда метод createFakePlayer каждый раз создает нового персонажа не из таблицы characters, а на основании переданного L2PlayerTemplate template.
Связан. Это ID для создаваемого объекта Player. И нельзя делать так, чтобы были коллизии с игроками, поэтому лично я использую цифры от 5ккк для ИД ботов. Проще говоря, нельзя, чтобы был один и тот же ИД у бота и игрока.
Да, верно, каждый раз создается новый персонаж на основании темплейта (так и не нашлось времени на создание бота, который бы качался, одевался и т.д., а раз не нужно сохранять его итемы и т.д., то это каждый раз создается заного).
flopix Написал:Просто страницей выше я не так понял и пошел по ложному пути.
В коде этих фантомов есть команда admin_phantoms_truncate
Она делает следующее:
1. Выгребает всех персонажей у которых логин "fh4f#67$kl"
PHP код:
<?php 
st = con.prepareStatement("SELECT * FROM characters WHERE account_name = ?");
st.setString(1, "fh4f#67$kl");
... 
 
	
	
	
		
	Сообщений: 561
	Тем: 44
	Зарегистрирован: Sep 2011
	
Репутация: 
412
	 
	
	
		[QUOTE='Connie;412735']Неверная работа, где-то косяк у вас.
Цитата:
[QUOTE]Сообщение от flopix  Посмотреть сообщение
Ну что ж запустил эту систему на сборке l2open.
Фантом персонаж как заводной бегает вокруг заданной точки периодически используя на себе селфы.
Если видит в заданном радиусе игрока бежит и пытается его слить в ПК.
Мобов не трогает.
Со стороны выглядит очень странно. Наверно их еще стоит учить бить мобов.[/QUOTE]
да вот в методе поиска цели 
getAndSetLockedTarget сделано так:
PHP код:
<?php 
targets = phantom.getAroundPlayers(radius, 600); 
покажите мне где тут поиск  мобов вокруг?