Рейтинг темы:
  • 2 Голос(ов) - 2.5 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Исходный код фантомов/ботов
#51
То есть этот obj_id никак не связан с аналогичным полем в таблице characters?
И тогда метод createFakePlayer каждый раз создает нового персонажа не из таблицы characters, а на основании переданного L2PlayerTemplate template.
Ответ
#52
flopix Написал:То есть этот obj_id никак не связан с аналогичным полем в таблице characters?
И тогда метод createFakePlayer каждый раз создает нового персонажа не из таблицы characters, а на основании переданного L2PlayerTemplate template.

Именно так. Вообще, там в конструкторе, требуется только проинитить колоры, базовый класс и АИ.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#53
Просто страницей выше я не так понял и пошел по ложному пути.


В коде этих фантомов есть команда admin_phantoms_truncate

Она делает следующее:

1. Выгребает всех персонажей у которых логин "fh4f#67$kl"
PHP код:
<?php 
st
= con.prepareStatement("SELECT * FROM characters WHERE account_name = ?");
st.setString(1, "fh4f#67$kl");
...

2. Заносит на основании этих персов новых в таблицу phantoms

3. Удаляет исходных персонажей.
PHP код:
<?php 
PlayerManager
.deleteCharByObjId(info.obj_id);
Ответ
#54
Кто то мне может объяснить почему в объект 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())
{
...


Дареному коню как говорится в зубы не смотрят. Но у меня вопрос к автору - это точно рабочий код, а не промежуточный вариант?
Ответ
#55
А это вообще интересный момент.

PHP код:
<?php 
// перебираем фантомов, пока на получим нужного по ИИ
while(fakeObjId == -1 || PhantomsEngine.getInstance().isPhantomAlreadySpawned(fakeObjId))
fakeObjId = getMatch(ai_type);

Если фантома нужного класса нет в наличии то этот цикл будет исполнятся бесконечно, а внутри функции getMatch идет обращение к БД для получения класса.

И нет бы перебрать один раз весь список чтобы убедится что в нем есть или отсутствует еще не задействованный фантом нужного типа, но нет мы в цикле из всего списка тыкаем случайный индекс и каждый раз проверяем подходит ли он нам. Если нет - повторяем поиск. Если там например такой фантом даже и есть но только один тыкаться можно очень долго. Бред.
Ответ
#56
Connie Написал:Умеют ПвП, ГвГ, по городам бегать. Их эквип задается в конфигах, скилы которые они будут юзать там же задаются. Можно в пати их объединять. Остальное по конфигам видно.

Ну что ж запустил эту систему на сборке l2open.

Фантом персонаж как заводной бегает вокруг заданной точки периодически используя на себе селфы.
Если видит в заданном радиусе игрока бежит и пытается его слить в ПК.
Мобов не трогает.

Со стороны выглядит очень странно. Наверно их еще стоит учить бить мобов.
Ответ
#57
Странно на давнешнем видео видел, как они били мобов, юзали соски, пвп-шились.
Ответ
#58
Может это была другая фантом система?
Тут банально в методах нигде даже нет поиска мобов вокруг, только игроков.


Походу исходники недоделанные например файл PhantomLevelFarmParams.java пустой

PHP код:
<?php 
package fakes
.model;

/**
* Created with IntelliJ IDEA.
* User: Administrator
* Date: 03.02.14
* Time: 23:30
* To change this template use File | Settings | File Templates.
*/
public class PhantomLevelFarmParams
{
//
}
Ответ
#59
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");
...

2. Заносит на основании этих персов новых в таблицу phantoms

3. Удаляет исходных персонажей.
PHP код:
<?php 
PlayerManager
.deleteCharByObjId(info.obj_id);

Раньше боты были в таблице characters, чтобы автоматически перенести их оттуда и был написан этот код.

flopix Написал:Кто то мне может объяснить почему в объект PhantomInfo сохраняется все из таблицы phantoms кроме
поля `class_id` и при любом пуке оно его тянет из базы.

PHP код:
<?php 
public int getSubclassByObjId(int obj_id)
{
....
statement = con.prepareStatement("SELECT class_id FROM phantoms WHERE obj_Id=?");
...

flopix Написал:В методе рядом вообще ошибочно продублирован код из предыдущего метода:
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;
}
Нерабочий метод, недоделанный. Зарубка на бота, умеющего качаться и одеваться по мере прокачки. Не было реализовано.

flopix Написал:Зачем проверка? !PhantomSpawnParser.getSpawnLocs().isEmpty()
PHP код:
<?php 
if(PhantomSpawnParser.getSpawnLocs() != null && !PhantomSpawnParser.getSpawnLocs().isEmpty())
{
for(
PhantomSpawnObjectInfo spawn_object : PhantomSpawnParser.getSpawnLocs())
{
...


Дареному коню как говорится в зубы не смотрят. Но у меня вопрос к автору - это точно рабочий код, а не промежуточный вариант?
Если нет спавнов то и не нужен спавн таск.
Код рабочий, всё работает, боты общаются, дерутся, дергаются по городам. По крайней мере у меня.

flopix Написал:А это вообще интересный момент.

PHP код:
<?php 
// перебираем фантомов, пока на получим нужного по ИИ
while(fakeObjId == -1 || PhantomsEngine.getInstance().isPhantomAlreadySpawned(fakeObjId))
fakeObjId = getMatch(ai_type);

Если фантома нужного класса нет в наличии то этот цикл будет исполнятся бесконечно, а внутри функции getMatch идет обращение к БД для получения класса.

И нет бы перебрать один раз весь список чтобы убедится что в нем есть или отсутствует еще не задействованный фантом нужного типа, но нет мы в цикле из всего списка тыкаем случайный индекс и каждый раз проверяем подходит ли он нам. Если нет - повторяем поиск. Если там например такой фантом даже и есть но только один тыкаться можно очень долго. Бред.
Нужно было спавнить единовременно 100-200 ботов при базе в 10к ботов. Чтобы хоть как-то работало было сделано так, а потом руки не дошли переделать. Да, ларчик просто открывался.

flopix Написал:Ну что ж запустил эту систему на сборке l2open.

Фантом персонаж как заводной бегает вокруг заданной точки периодически используя на себе селфы.
Если видит в заданном радиусе игрока бежит и пытается его слить в ПК.
Мобов не трогает.

Со стороны выглядит очень странно. Наверно их еще стоит учить бить мобов.
Неверная работа, где-то косяк у вас.

flopix Написал:Может это была другая фантом система?
Тут банально в методах нигде даже нет поиска мобов вокруг, только игроков.


Походу исходники недоделанные например файл PhantomLevelFarmParams.java пустой

PHP код:
<?php 
package fakes
.model;

/**
* Created with IntelliJ IDEA.
* User: Administrator
* Date: 03.02.14
* Time: 23:30
* To change this template use File | Settings | File Templates.
*/
public class PhantomLevelFarmParams
{
//
}
Боты качающиеся с нуля и фармящие лут не были реализованы.

kpNemo Написал:Странно на давнешнем видео видел, как они били мобов, юзали соски, пвп-шились.
Это не мои были. Видео моих ботов нет нигде, вот почему.
Ответ
#60
[QUOTE='Connie;412735']Неверная работа, где-то косяк у вас.

Цитата:
[QUOTE]Сообщение от flopix Посмотреть сообщение
Ну что ж запустил эту систему на сборке l2open.

Фантом персонаж как заводной бегает вокруг заданной точки периодически используя на себе селфы.
Если видит в заданном радиусе игрока бежит и пытается его слить в ПК.
Мобов не трогает.
Со стороны выглядит очень странно. Наверно их еще стоит учить бить мобов.[/QUOTE]


да вот в методе поиска цели getAndSetLockedTarget сделано так:

PHP код:
<?php 
targets
= phantom.getAroundPlayers(radius, 600);


покажите мне где тут поиск мобов вокруг?
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Прокси сервер, и система ботов. dantest 6 2,554 08-17-2015, 08:07 PM
Последний пост: dantest
  Исходный код Phantomas 6 2,542 08-06-2015, 01:55 PM
Последний пост: Phantomas

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)