PDA

Просмотр полной версии : предметы=скилы


mira
11.06.2012, 01:48
возникла такая задача. имеяя список ид предметов мне нужно узнать какие умения мне доступны при использовании их.
откуда можно выдрать информацию в таком виде (пример):

ID пердмета ID умения(эффекта)
1538=Blessed Scroll of Escape 2036=Blessed Scroll of Escape
1374=Greater Haste Potion 2034=Greater Haste Potion
3928=L2Day - Scroll of Focus 2052=Scroll of Focus

Добавлено через 2 минуты
вощем нада научить юзать имеющиеся предметы в инвентаре по необходимости, без хардкода в скрипте

supernewbie
11.06.2012, 02:40
mira, дык очевидно же откуда - с сборки серва как всегда

mira
11.06.2012, 15:22
CREATE TABLE IF NOT EXISTS `etcitem` (
`item_id` decimal(11,0) NOT NULL default '0',
`name` varchar(100) NOT NULL default '',
`additionalname` varchar(100) NOT NULL default '',
`crystallizable` varchar(5) NOT NULL default 'false',
`item_type` varchar(14) NOT NULL default 'none',
`weight` decimal(4,0) NOT NULL default '0',
`consume_type` varchar(9) NOT NULL default 'normal',
`material` varchar(11) NOT NULL default 'wood',
`crystal_type` varchar(4) NOT NULL default 'none',
`duration` int(3) NOT NULL default '-1', -- duration in minutes for shadow items
`time` int(4) NOT NULL default '-1', -- duration in minutes for time limited items
`price` decimal(11,0) NOT NULL default '0',
`crystal_count` int(4) NOT NULL default '0',
`sellable` varchar(5) NOT NULL default 'false',
`dropable` varchar(5) NOT NULL default 'false',
`destroyable` varchar(5) NOT NULL default 'false',
`tradeable` varchar(5) NOT NULL default 'false',
`depositable` varchar(5) NOT NULL default 'false',
`handler` varchar(70) NOT NULL DEFAULT 'none',
`skill` varchar(70) NOT NULL DEFAULT '0-0;',
PRIMARY KEY (`item_id`)
);

вроде да

Добавлено через 3 часа 57 минут
Теперь вопрос. Каким софтом скл файл превратить в активную базу данных )

alexteam
11.06.2012, 15:40
как бы зависит от того что за бд.

mira
11.06.2012, 16:56
я так понял нада установить MySQL server для начала.
поставил версию 5.1 ага. пытаюсь создать экземпляр сервера - пишет неудалось запустить службу

развернуть базу из скрипта с помощью какойто утилиты можно в дистрибутиве. еще пхп админ но там вообще нифига непонятно :)

alexteam
11.06.2012, 17:12
easyphp
в дистре все что нужно есть.

mira
11.06.2012, 18:10
ща скачаем. но учитывая то что я в скл полный чайник могу и неразобратса)

Добавлено через 24 минуты
афигеть методом тыка импортировал таблицу
даже видна в NavyCat-е

unknowned
11.06.2012, 19:03
mira, знания скуля уже давно передаются на уровне генов, его не учат, его вспоминают :D

mira
11.06.2012, 19:49
я не попал в это поколение =/

так теперь пробую подключитса через TMySQLClient, последняя ошибка пишет "клиентом не поддерживаетса протокол аутентификации"

че за поебота?

Добавлено через 41 минуту
кажетса вкурил.
DirectMysqlObjects поддерживает сервер до 4.1
у меня же 5.5 а там сменили алгоритм хеширования
придетса искать новую халявную компоненту =(

supernewbie
11.06.2012, 20:35
я не попал в это поколение =/

так теперь пробую подключитса через TMySQLClient, последняя ошибка пишет "клиентом не поддерживаетса протокол аутентификации"

че за поебота?

Добавлено через 41 минуту
кажетса вкурил.
DirectMysqlObjects поддерживает сервер до 4.1
у меня же 5.5 а там сменили алгоритм хеширования
придетса искать новую халявную компоненту =(
http://blog.sribna.com/use_mysql_old_password.htm то?

mira
11.06.2012, 21:33
http://blog.sribna.com/use_mysql_old_password.htm то?

да то самое. поэтому удалил нафиг эти юниты и поставил ZEOS для MySQL
о чудо тестовое приложение подключилось таки к моей базе

однако ввиду полного незнания SQL , остуствия документации к ZEOS немогу понять как же мне считать данные оттуда.

по моим догадкам нужно юзать компоненту ZQuery но невтыкаю как она работает. с компонтентом мудак (MyDAC) поддержки и примеров больше, вот тока она коммерческая

Yegor
11.06.2012, 21:40
Я юзаю MyDac вот залил http://zalil.ru/33427182

По ней могу подсказать как работать

mira
11.06.2012, 22:12
Я юзаю MyDac вот залил http://zalil.ru/33427182

По ней могу подсказать как работать

эммм. там уже не нада платить?)
//скачал

Добавлено через 20 минут
проверил, мудак тоже успешно подключаетса в БД
теперь осталось научитса считывать поля из БД) с чего начать?

supernewbie
11.06.2012, 22:59
эммм. там уже не нада платить?)
//скачал

Добавлено через 20 минут
проверил, мудак тоже успешно подключаетса в БД
теперь осталось научитса считывать поля из БД) с чего начать?
TMyConnection, TMyQuery, пишешь в TMyConnection хост, пароль, базу, юзера, в TMyQuery.SQL - в него пишешь запрос, TMyQuery.Execute - выполняет запрос, читаешь по TMyQuery.Fields или TMyQuery.FieldByName и соответственно у полей методы .AsInteger, .AsString. собсна всё

Yegor
11.06.2012, 23:27
Вот общий вариант чтения данных из БД с перебором полученных значений:


MyQuery1.SQL.Text:= 'SELECT * FROM skills WHERE skillId = 100500';
MyQuery1.Open;
MyQuery1.First;
for i:= 0 to MyQuery1.RecordCount - 1 do
begin
skillLevel:= MyQuery1.FieldByName('level').AsInteger;
...
MyQuery1.Next;//важно для перехода к следующей записи
end;
MyQuery1.Close;

alexteam
11.06.2012, 23:29
зеос.
на формочке\тдатамодуле с именем dmdata лежит

object SqlConnection: TZConnection
Protocol = 'mysql-4.1'
HostName = '192.168.0.1'
Port = 3306
Database = 'qqqq'
User = 'wwww'
Password = 'eeeee'
Catalog = 'mysql'
AutoCommit = False
end

есть класс прослойка.позволяющий юзать квери с любой нити без последствий.

TZQueryWrapper = class
private
Z : TZQuery;
function getsql: tstrings;
procedure setsql(const Value: tstrings);
protected
Procedure SynchCreate;
Procedure SynchDestroy;
procedure SynchOpen;
procedure SynchClose;
procedure SynchExecSql;
procedure SynchNext;
public
procedure Open;
procedure Close;
procedure ExecSql;
procedure next;
Function RowsAffected : integer;
Function Eof : boolean;
function GetBlobFieldData(FieldNo: Integer; var Buffer: TBlobByteData): Integer;
Function FieldByName(const name : string):Tfield;
property sql : tstrings read getsql write setsql;
Constructor Create;
Destructor destroy; override;
end;

{ TZQueryWrapper }

procedure TZQueryWrapper.Close;
begin
if GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchClose)
else
SynchClose;
end;

constructor TZQueryWrapper.Create;
begin
z := nil;

if GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchCreate)
else
SynchCreate;
end;

destructor TZQueryWrapper.destroy;
begin
if GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchDestroy)
else
SynchDestroy;
inherited;
end;

function TZQueryWrapper.Eof: boolean;
begin
result := z.Eof;
end;

procedure TZQueryWrapper.ExecSql;
begin
if GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchExecSql)
else
SynchExecSql;
end;

function TZQueryWrapper.FieldByName(const name: string): Tfield;
begin
Result := z.FieldByName(name);
end;

function TZQueryWrapper.GetBlobFieldData(FieldNo: Integer;
var Buffer: TBlobByteData): Integer;
begin
result := z.GetBlobFieldData(FieldNo,Buffer);
end;

function TZQueryWrapper.getsql: tstrings;
begin
result := Z.SQL;
end;

procedure TZQueryWrapper.next;
begin
if GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchNext)
else
SynchNext;

end;

procedure TZQueryWrapper.Open;
begin
if GetCurrentThreadId <> MainThreadID then
TThread.Synchronize(nil, SynchOpen)
else
SynchOpen;
end;

function TZQueryWrapper.RowsAffected: integer;
begin
Result := z.RowsAffected;
end;

procedure TZQueryWrapper.setsql(const Value: tstrings);
begin
Z.SQL := Value;
end;

procedure TZQueryWrapper.SynchClose;
begin
z.Close;
end;

procedure TZQueryWrapper.SynchCreate;
begin
if not dmDB.SqlConnection.Connected then
dmDB.SqlConnection.Connect;

Z := TZQuery.Create(nil);
z.Connection := dmDB.SqlConnection;
end;

procedure TZQueryWrapper.SynchDestroy;
begin
z.free;
end;

procedure TZQueryWrapper.SynchExecSql;
begin
z.ExecSQL;
end;

procedure TZQueryWrapper.SynchNext;
begin
z.Next;
end;

procedure TZQueryWrapper.SynchOpen;
begin
z.Open;
end;


есть глобально обьявленная функция.

Function NewUpdateQuery(sQuesry : string):TZQueryWrapper;
begin
result := TZQueryWrapper.Create;
result.sql.Text := sQuesry;
end;


ну. и в итоге, юзаем как то так.

with NewUpdateQuery(format('select id from build_parsers where buildnum = %d',[NewBuild])) do
begin
open;
while not eof do
begin
DeleteFile(pchar(format('%s\%d.bin',[OutputDir,FieldByName('id').AsInteger])));
next;
end;
Close;
Destroy;
end;

mira
12.06.2012, 02:13
круто. спасиба пасаны)

mira
12.06.2012, 15:21
чтото немогу найти значения битовых флагов для слотов, где там в сервере

опытным путем установил тока

BODY_LHAND = 128; //weapon
BODY_RHAND = 256; // dual weapon or shield


Добавлено через 13 минут
типы вепонов в цифрах тоже ненашол. например какая цифра соответствует dualsword

Добавлено через 56 минут
части тела пробил через клиент.
осталость гдето взять ид вепонов

supernewbie
12.06.2012, 19:14
mira, L2Item
public static final int TYPE1_WEAPON_RING_EARRING_NECKLACE = 0;
public static final int TYPE1_SHIELD_ARMOR = 1;
public static final int TYPE1_OTHER = 2;
public static final int TYPE1_ITEM_QUESTITEM_ADENA = 4;

public static final byte TYPE2_WEAPON = 0;
public static final byte TYPE2_SHIELD_ARMOR = 1;
public static final byte TYPE2_ACCESSORY = 2;
public static final byte TYPE2_QUEST = 3;
public static final byte TYPE2_MONEY = 4;
public static final byte TYPE2_OTHER = 5;
public static final byte TYPE2_PET_WOLF = 6;
public static final byte TYPE2_PET_HATCHLING = 7;
public static final byte TYPE2_PET_STRIDER = 8;
public static final byte TYPE2_NODROP = 9;
public static final byte TYPE2_PET_GWOLF = 10;
public static final byte TYPE2_PENDANT = 11;
public static final byte TYPE2_PET_BABY = 12;

public static final int SLOT_NONE = 0x00000;
public static final int SLOT_UNDERWEAR = 0x00001;
public static final int SLOT_CLOAK = 0x0003; //TODO:????

public static final int SLOT_R_EAR = 0x00002;
public static final int SLOT_L_EAR = 0x00004;

public static final int SLOT_NECK = 0x00008;

public static final int SLOT_R_FINGER = 0x00010;
public static final int SLOT_L_FINGER = 0x00020;

public static final int SLOT_HEAD = 0x00040;
public static final int SLOT_R_HAND = 0x00080;
public static final int SLOT_L_HAND = 0x00100;
public static final int SLOT_GLOVES = 0x00200;
public static final int SLOT_CHEST = 0x00400;
public static final int SLOT_LEGS = 0x00800;
public static final int SLOT_FEET = 0x01000;
public static final int SLOT_BACK = 0x02000;
public static final int SLOT_LR_HAND = 0x04000;
public static final int SLOT_FULL_ARMOR = 0x08000;
public static final int SLOT_HAIR = 0x10000;
public static final int SLOT_FORMAL_WEAR = 0x20000;
public static final int SLOT_DHAIR = 0x40000;
public static final int SLOT_HAIRALL = 0x80000;
public static final int SLOT_R_BRACELET = 0x100000;
public static final int SLOT_L_BRACELET = 0x200000;
public static final int SLOT_DECO = 0x400000;
public static final int SLOT_SIGIL = 0x000000; // TODO: fix
public static final int SLOT_BELT = 0x10000000;
public static final int SLOT_WOLF = -100;
public static final int SLOT_HATCHLING = -101;
public static final int SLOT_STRIDER = -102;
public static final int SLOT_BABYPET = -103;
public static final int SLOT_GWOLF = -104;
public static final int SLOT_PENDANT = -105;


Добавлено через 3 минуты

Добавлено через 13 минут
типы вепонов в цифрах тоже ненашол. например какая цифра соответствует dualsword
про какие именно цифры идёт речь?

mira
12.06.2012, 19:52
{ body equip bitmask }
BODY_LHAND = 128; //weapon
BODY_RHAND = 256; // dual weapon or shield
BODY_FINGERS= 48;
BODY_EARS = 6;
BODY_NECK = 8;
BODY_BELT = $10000000;
BODY_BACK = $2000; // cloack
BODY_UNDERWEAR = 1;
BODY_HEAD = 64;
BODY_UPPER = 1024;
BODY_LOWER = 2048;
BODY_GLOVE = 512;
BODY_FEET = 4096;
BODY_HAIR = 65536;
BODY_FACE = $40000;
BODY_HAIRALL= $80000;

с слотами так сделал, в принцыпе как у тебя. чето может нехватает но петомцы пока пофиг)

{weapon flags}
weapon_Dual_Sword=1;
weapon_Sword=2;
weapon_Big_Sword=4;
weapon_Blunt=8;
weapon_Big_Blunt=16;
weapon_Dagger=32;
weapon_Dual_Fist=64;
weapon_Bow=128;
weapon_Dual_Dagger=256;
weapon_Pole=512;
weapon_Shield=1024;
weapon_Magic=2048;
weapon_Light=4096;
weapon_Heavy=8192;
weapon_Rapier=16384;
weapon_Ancient=32768;
weapon_Crossbow=65536;
weapon_Sigil=131072;
weapon_Fist=262144;
weapon_Rod=524288;
weapon_Etc=1048576;

випоны сам задал, на пакетном уровне типа оружия не передаетса всеравно такчто пофиг

Yegor
12.06.2012, 21:15
mira, ты что очередного бота делаешь?

Breadfan
12.06.2012, 21:58
сначала надо составить таблицу умений и бафов от ситков. их соотношение. что если чтото висит с бафа - не юзал свиток. Чисто теоретически в сборках есть параметр указывающий на тип бафа свитка - посмотри на него. <item id="3926" type="EtcItem" name="L2Day - Scroll of Guidance">
<set name="icon" val="icon.etc_scroll_white_i00" />
<set name="default_action" val="skill_reduce" />
<set name="etcitem_type" val="scroll" />
<set name="material" val="paper" />
<set name="weight" val="120" />
<set name="is_stackable" val="true" />
<set name="is_oly_restricted" val="true" />
<set name="handler" val="ItemSkills" />
<set name="item_skill" val="2050-1" />
<set name="use_condition" val="{{uc_transmode_exclude;{tt_flying}}}" />
</item>

mira
13.06.2012, 00:45
mira, ты что очередного бота делаешь?

почему очередного. этот тоже самый

просто решил научить его юзать итемы через AI а не через хардкод useitem в скрипте. ну типа чтоб сам знал что у него в сумке и куда это мона применить)
зы - со скилами вроде все получилось

Добавлено через 7 минут
сначала надо составить таблицу умений и бафов от ситков. их соотношение. что если чтото висит с бафа - не юзал свиток. Чисто теоретически в сборках есть параметр указывающий на тип бафа свитка - посмотри на него. <item id="3926" type="EtcItem" name="L2Day - Scroll of Guidance">
<set name="icon" val="icon.etc_scroll_white_i00" />
<set name="default_action" val="skill_reduce" />
<set name="etcitem_type" val="scroll" />
<set name="material" val="paper" />
<set name="weight" val="120" />
<set name="is_stackable" val="true" />
<set name="is_oly_restricted" val="true" />
<set name="handler" val="ItemSkills" />
<set name="item_skill" val="2050-1" />
<set name="use_condition" val="{{uc_transmode_exclude;{tt_flying}}}" />
</item>

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

mira
15.06.2012, 19:24
easyphp
в дистре все что нужно есть.

подскажи плз по EasyPHP
как там импортировать файл выше 2 метров
в настройках чтото ненашол

SeregaZ
15.06.2012, 20:15
и время выполнения скрипта тогда тоже смотри :) а то будет отрубать, если превысишь лимит в несколько секунд.

ты поиск по файлу сделай - и смотри где size. что-то типа:
output_buffering = 4096 или post_max_size = 8M или upload_max_filesize = 2M

Добавлено через 40 секунд
pdo_mysql.cache_size = 2000

mira
16.06.2012, 01:37
Starting with version 2.7.0, the import engine has been re–written and these problems should not occur. If possible, upgrade your phpMyAdmin to the latest version to take advantage of the new import features.
The first things to check (or ask your host provider to check) are the values of upload_max_filesize, memory_limit and post_max_size in the php.ini configuration file. All of these three settings limit the maximum size of data that can be submitted and handled by PHP. One user also said that post_max_size and memory_limit need to be larger than upload_max_filesize.

There exist several workarounds if your upload is too big or your hosting provider is unwilling to change the settings:
•Look at the $cfg['UploadDir'] feature. This allows one to upload a file to the server via scp, ftp, or your favorite file transfer method. PhpMyAdmin is then able to import the files from the temporary directory. More information is available in the Configuration section of this document.
•Using a utility (such as BigDump) to split the files before uploading. We cannot support this or any third party applications, but are aware of users having success with it.
•If you have shell (command line) access, use MySQL to import the files directly. You can do this by issuing the "source" command from within MySQL: source filename.sql.

вот че они сами пишут про это.

alexteam
16.06.2012, 02:25
easyphp\mysql\bin\mysql.exe -uUSER -pPassword -D databasename < dump.sql

пробелов после -u\p не надо.
в дамп.скл собственно дамп базы.
базу предварительно создать через пхпмайадмин к примеру.

SeregaZ
16.06.2012, 10:30
во во во. я почти угадал :) еще время выполнения скрипта тоже увеличь.

mira
17.06.2012, 09:21
easyphp\mysql\bin\mysql.exe -uUSER -pPassword -D databasename < dump.sql

пробелов после -u\p не надо.
в дамп.скл собственно дамп базы.
базу предварительно создать через пхпмайадмин к примеру.

спс получилось