Разрабатываю скрипт кристаллизации... и столкнулся с рядом проблем :
PHP код:
const ItemID = 12098; // ItemID шмотки MyName='Gaubica'; //<-- пишем ник своего чара InventorySize = 100; //<-- количество ячеек в рюкзаке //InventoryOffset = 22; //<-- смещение для листа инвентаря, если у вас не определяет инвентарь поменяйте на 26 или какое там на вашем ГФШ
//---------------------------------------------------------------- var ItemBase: array of Int64; Crystal: boolean; BaseItems : array[1..InventorySize,1..22] of Int64; x:longint; //---------------------------------------------------------------- procedure Init; //Вызывается при включении скрипта var i,k: Int64; begin for i:=1 to InventorySize do for k:=1 to 22 do BaseItems[i,k]:=0; Crystal:=false; SendMsg1('Начало инициализации скрипта, откройте инвентарь'); end; //----------------------------------------------------------------- procedure Free; //Вызывается при выключении скрипта begin break; end; //------------------------------------------------------------------ procedure SendMsg1(msg:string); begin buf:=#$4A; WriteD(0); WriteD(10); WriteS(''); WriteS(msg); SendToClientEx('Gaubica'); end;
procedure ItemList; var i, j, k: Int64; ListSize: Int64; begin j:=4; //пропускаем дo ListSize ListSize:=ReadH(j); //SendMsg1('--'+inttostr(ListSize)); for i:=1 to ListSize do if (i<=ListSize) then begin BaseItems[i,1]:=ReadH(j); //ItemType1 BaseItems[i,2]:=ReadD(j); //ObjectID BaseItems[i,3]:=ReadD(j); //ItemID BaseItems[i,4]:=ReadD(j); //LocationSlot BaseItems[i,5]:=ReadQ(j); //Amount: BaseItems[i,6]:=ReadH(j); //ItemType2 BaseItems[i,7]:=ReadH(j); //CustomType1 BaseItems[i,8]:=ReadH(j); //isEquipped: BaseItems[i,9]:=ReadD(j); //BodyPart BaseItems[i,10]:=ReadH(j); //EnchantLevel BaseItems[i,11]:=ReadH(j); //CustType2 BaseItems[i,12]:=ReadD(j); //AugmentationID BaseItems[i,13]:=ReadD(j); //mana BaseItems[i,14]:=ReadH(j); //attackelement BaseItems[i,15]:=ReadH(j); //attackelementpower BaseItems[i,16]:=ReadH(j); //firedefelementpower BaseItems[i,17]:=ReadH(j); //waterdefelementpower BaseItems[i,18]:=ReadH(j); //winddefelementpower BaseItems[i,19]:=ReadH(j); //earthdefelementpower BaseItems[i,20]:=ReadH(j); //holydefelementpower BaseItems[i,21]:=ReadH(j); //unholydefelementpower BaseItems[i,22]:=ReadD(j); //remindingtime
end;
end;
Последний раз редактировалось tenary, 31.05.2010 в 22:46.
Причина: переписал скрипт на исправленный
procedure InventoryUpdate; //пакет 21, Создает базу ObjectID по ItemID var i, ii, j, k, ListCount, UpdType : Int64; ItemType1, ObjectID, ItemID, LocationSlot, Count, ItemType2, CustomType1, isEquipped, BodyPart, EnchantLevel, CustType2, AugmentationID,mana,attackelement, attackelementpower,firedef,waterdef,winddef,earthdef,holydef,unholydef,remtime :Int64; begin ListCount:=ReadH(2); //количество итемов j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален for i:=1 to ListCount do begin UpdType :=ReadH(j); ItemType1 :=ReadH(j); ObjectID :=ReadD(j); ItemID :=ReadD(j); LocationSlot :=ReadD(j); Count :=ReadQ(j); ItemType2 :=ReadH(j); CustomType1 :=ReadH(j); isEquipped :=ReadH(j); BodyPart :=ReadD(j); EnchantLevel :=ReadH(j); CustType2 :=ReadH(j); AugmentationID:=ReadD(j); mana:=ReadD(j); //mana attackelement:=ReadH(j); //attackelement attackelementpower:=ReadH(j); //attackelementpower firedef:=ReadH(j); //firedefelementpower waterdef:=ReadH(j); //waterdefelementpower winddef:=ReadH(j); //winddefelementpower earthdef:=ReadH(j); //earthdefelementpower holydef:=ReadH(j); //holydefelementpower unholydef:=ReadH(j); //unholydefelementpower remtime:=ReadD(j); //remindingtime case UpdType of // 1: 0; //добавлен новый предмет, игнорим 2: //изменен предмет в инвентаре for ii:=1 to InventorySize do begin if (BaseItems[ii,2]=ObjectID) then begin BaseItems[ii,1]:=ItemType1; BaseItems[ii,2]:=ObjectID; BaseItems[ii,3]:=ItemID; BaseItems[ii,4]:=LocationSlot; BaseItems[ii,5]:=Count; BaseItems[ii,6]:=ItemType2; BaseItems[ii,7]:=CustomType1; BaseItems[ii,8]:=isEquipped; BaseItems[ii,9]:=BodyPart; BaseItems[ii,10]:=EnchantLevel; BaseItems[ii,11]:=CustType2; BaseItems[ii,12]:=AugmentationID; BaseItems[ii,13]:=mana; BaseItems[ii,14]:=attackelement; BaseItems[ii,15]:=attackelementpower; BaseItems[ii,16]:=firedef; BaseItems[ii,17]:=waterdef; BaseItems[ii,18]:=winddef; BaseItems[ii,19]:=earthdef; BaseItems[ii,20]:=holydef; BaseItems[ii,21]:=unholydef; BaseItems[ii,22]:=remtime; Break; end; end;
3: begin //удален for ii:=1 to InventorySize do if (BaseItems[ii,2]=ObjectID) then begin for k:=1 to 22 do BaseItems[ii,k]:=0; Break; end; end; end; end; {ReadItems;} end;
function GetObjectId(inItemID :Int64) : Int64; var i : Int64; begin for i:=1 to 100 do if (BaseItems[i,3]=inItemID) then begin Result:=BaseItems[i,2]; exit; end else Result:=-1; end;
procedure RequestCrystallizeItem(ObjectID: integer; Count:Int64 = 1); begin buf:=#$AF; WriteD(ObjectID); WriteQ(1); SendToServerEx('Gaubica'); end; //------------------------------------------------------------ //основная часть скрипта //вызывается при приходе каждого пакета если скрипт включен begin
if FromServer and (pck[1]=#$11) then ItemList; //создание базы предметов if FromServer and (pck[1]=#$21) and (pck[4]=#$62) then begin InventoryUpdate; //Обновление базы, если принят пакет на удаление предмета
if Crystal and (GetObjectId(ItemID)>0) then begin RequestCrystallizeItem(GetObjectId(ItemID)); Delay(100); InventoryUpdate; Delay(100); end else begin Crystal:=false; SendMsg1('Весь шмот кристаллизован'); free; end; end; if FromServer and (pck[1]=#$27) then begin SendMsg1('Панеслася!!!'); if (GetObjectId(ItemID)>0) then begin Crystal:=true; RequestCrystallizeItem(GetObjectId(ItemID)); end else SendMsg1('Нужная шмотка не найдена'); end; end.
вопрос в 6 посте
Последний раз редактировалось tenary, 31.05.2010 в 22:55.
Прочитал про эти функции.. но все равно не понимаю этот кусок алгоритма...
И все же что может означать спам пакетов с сервера в чат : "ERR : NO TRADE!" ?
скорее всего у тебя неверное считывание количества итемов, в одном месте у тебя стоит
BaseItems[i,5]:=ReadD(j); //Amount:
j:=j+4; ------------ считывается qword\можно кстати заменить сразу на =ReadQ(j);
а в блоке апдейта уже просто
Count:=ReadD(j);
определи как верно для твоего сервера будет и переделай
__________________ На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."
А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
Последний раз редактировалось Breadfan, 31.05.2010 в 17:18.
Наконецто разобрался... рад безумно правильно считываю список, выбираю нужный ObjectId по ItemID, но теперь новая проблемма..
когда выполняю эту процедуру:
procedure RequestCrystallizeItem(ObjectID: integer; Count:Int64 = 1);
begin
buf:=#$2F;
WriteD(ObjectID);
WriteQ(Count);
SendToServerEx('Gaubica');
он отправляет пакет:
Tип: 0x2F (RequestCrystallizeItem)
Pазмер: 13+2
Время прихода: 21:04:44:468
0002 d ObjectID: 1081447975 (0x40759627)
0006 q Count: 1
но через некоторое время приходит системное сообшение : У Вас нет прав, чтобы сделать это.
Подскажите пожалуйста в чем проблема?
Добавлено через 3 часа 22 минуты
Посмотрел вручную пакет для кристализации.. и был неприятно удивлен.. в первый раз это было 0xC6 после двух успешных кристаллизаций вылетел из игры... захожу.. смотрю снова он уже стал 0x3A снова получил вылет из игры.. в третий раз уже 0xAF ... поясните пожалуйста нубу как преодолеть данную проблемму?
Вручную кристаллизую шмотку.. смотрю пакет.. далее вставляю в скрипт и запускаю... первая кристаллизация проходит успешно.. но последующее не воспринимаются. при повторном запуске вылетаю из игры...
Например вручную отправляю на сервер 99 49 F4 59 40 01 00 00 00 00 00 00 00 через некоторое время отправляется само по себе несколько пакетов на сервер B1 хх хх хх хх хх 00 00 00 00 14 00 00.
Последний раз редактировалось tenary, 31.05.2010 в 22:59.
Причина: Добавлено сообщение
tenary, введена доп.шифрация, нужно писать свою newxor.dll, ну это так ... предположение ... остальные пакеты ИДшники не меняют через некоторое кол-во одинаковых пакетов?
Помогите модернизировать скрипт для фреи. Я пока плохо разбираюсь, вопщем вот что получилось подскажите где накосячил...
PHP код:
const ItemID = 890; // ItemID шмотки MyName='Ответ'; //<-- пишем ник своего чара InventorySize = 100; //<-- количество ячеек в рюкзаке //InventoryOffset = 22; //<-- смещение для листа инвентаря, если у вас не определяет инвентарь поменяйте на 26 или какое там на вашем ГФШ
//---------------------------------------------------------------- var ItemBase: array of Int64; Crystal: boolean; BaseItems : array[1..InventorySize,1..22] of Int64; x:longint; //---------------------------------------------------------------- procedure Init; //Вызывается при включении скрипта var i,k: Int64; begin for i:=1 to InventorySize do for k:=1 to 22 do BaseItems[i,k]:=0; Crystal:=false; SendMsg1('Начало инициализации скрипта, откройте инвентарь'); end; //----------------------------------------------------------------- procedure Free; //Вызывается при выключении скрипта begin break; end; //------------------------------------------------------------------ procedure SendMsg1(msg:string); begin buf:=#$4A; WriteD(0); WriteD(10); WriteS(''); WriteS(msg); SendToClientEx('Ответ'); end;
procedure ItemList; var i, j, k: Int64; ListSize: Int64; begin j:=4; //пропускаем дo ListSize ListSize:=ReadH(j); //SendMsg1('--'+inttostr(ListSize)); for i:=1 to ListSize do if (i<=ListSize) then begin BaseItems[i,1]:=ReadD(j); //ObjectID BaseItems[i,2]:=ReadD(j); //ItemID BaseItems[i,3]:=ReadD(j); //LocationSlot BaseItems[i,4]:=ReadQ(j); //Amount: BaseItems[i,5]:=ReadH(j); //ItemType2 BaseItems[i,6]:=ReadH(j); //CustomType1 BaseItems[i,7]:=ReadH(j); //isEquipped: BaseItems[i,8]:=ReadD(j); //BodyPart BaseItems[i,9]:=ReadH(j); //EnchantLevel BaseItems[i,10]:=ReadH(j); //CustType2 BaseItems[i,11]:=ReadD(j); //AugmentationID BaseItems[i,12]:=ReadD(j); //mana BaseItems[i,13]:=ReadH(j); //attackelement BaseItems[i,14]:=ReadH(j); //attackelementpower BaseItems[i,15]:=ReadH(j); //FreyaUnknown1 BaseItems[i,16]:=ReadH(j); //firedefelementpower BaseItems[i,17]:=ReadH(j); //waterdefelementpower BaseItems[i,18]:=ReadH(j); //winddefelementpower BaseItems[i,19]:=ReadH(j); //earthdefelementpower BaseItems[i,20]:=ReadH(j); //holydefelementpower BaseItems[i,21]:=ReadH(j); //unholydefelementpower BaseItems[i,22]:=ReadD(j); //remindingtime BaseItems[i,23]:=ReadD(j); //FreyaUnknown2 BaseItems[i,24]:=ReadH(j); //FreyaUnknown3
end;
end; procedure InventoryUpdate; //пакет 21, Создает базу ObjectID по ItemID var i, ii, j, k, ListCount, UpdType : Int64; ItemType1, ObjectID, ItemID, LocationSlot, Count, ItemType2, CustomType1, isEquipped, BodyPart, EnchantLevel, CustType2, AugmentationID,mana,attackelement, attackelementpower,fu1,firedef,waterdef,winddef,earthdef,holydef,unholydef,remtime,fu2,fu3 :Int64; begin ListCount:=ReadH(2); //количество итемов j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален for i:=1 to ListCount do begin UpdType :=ReadH(j); ItemType1 :=ReadH(j); ObjectID :=ReadD(j); ItemID :=ReadD(j); LocationSlot :=ReadD(j); Count :=ReadQ(j); ItemType2 :=ReadH(j); CustomType1 :=ReadH(j); isEquipped :=ReadH(j); BodyPart :=ReadD(j); EnchantLevel :=ReadH(j); CustType2 :=ReadH(j); AugmentationID:=ReadD(j); mana:=ReadD(j); //mana attackelement:=ReadH(j); //attackelement attackelementpower:=ReadH(j); //attackelementpower fu1:=ReadH(j); //FreyaUnknown1 firedef:=ReadH(j); //firedefelementpower waterdef:=ReadH(j); //waterdefelementpower winddef:=ReadH(j); //winddefelementpower earthdef:=ReadH(j); //earthdefelementpower holydef:=ReadH(j); //holydefelementpower unholydef:=ReadH(j); //unholydefelementpower remtime:=ReadD(j); //remindingtime fu2:=ReadD(j); //FreyaUnknown2 fu3:=ReadH(j); //FreyaUnknown3 case UpdType of // 1: 0; //добавлен новый предмет, игнорим 2: //изменен предмет в инвентаре for ii:=1 to InventorySize do begin if (BaseItems[ii,1]=ObjectID) then begin BaseItems[ii,1]:=ObjectID; BaseItems[ii,2]:=ItemID; BaseItems[ii,3]:=LocationSlot; BaseItems[ii,4]:=Count; BaseItems[ii,5]:=ItemType2; BaseItems[ii,6]:=CustomType1; BaseItems[ii,7]:=isEquipped; BaseItems[ii,8]:=BodyPart; BaseItems[ii,9]:=EnchantLevel; BaseItems[ii,10]:=CustType2; BaseItems[ii,11]:=AugmentationID; BaseItems[ii,12]:=mana; BaseItems[ii,13]:=attackelement; BaseItems[ii,14]:=attackelementpower; BaseItems[ii,15]:=fu1; BaseItems[ii,16]:=firedef; BaseItems[ii,17]:=waterdef; BaseItems[ii,18]:=winddef; BaseItems[ii,19]:=earthdef; BaseItems[ii,20]:=holydef; BaseItems[ii,21]:=unholydef; BaseItems[ii,22]:=remtime; BaseItems[ii,23]:=fu2; BaseItems[ii,24]:=fu3; Break; end; end;
3: begin //удален for ii:=1 to InventorySize do if (BaseItems[ii,1]=ObjectID) then begin for k:=1 to 22 do BaseItems[ii,k]:=0; Break; end; end; end; end; {ReadItems;} end;
function GetObjectId(inItemID :Int64) : Int64; var i : Int64; begin for i:=1 to 100 do if (BaseItems[i,2]=inItemID) then begin Result:=BaseItems[i,1]; exit; end else Result:=-1; end;
procedure RequestCrystallizeItem(ObjectID: integer; Count:Int64 = 1); begin buf:=#$2F; WriteD(ObjectID); WriteQ(1); SendToServerEx('Ответ'); end; //------------------------------------------------------------ //основная часть скрипта //вызывается при приходе каждого пакета если скрипт включен begin
if FromServer and (pck[1]=#$11) then ItemList; //создание базы предметов if FromServer and (pck[1]=#$21) and (pck[4]=#$62) then begin InventoryUpdate; //Обновление базы, если принят пакет на удаление предмета
if Crystal and (GetObjectId(ItemID)>0) then begin RequestCrystallizeItem(GetObjectId(ItemID)); Delay(100); InventoryUpdate; Delay(100); end else begin Crystal:=false; SendMsg1('Весь шмот кристаллизован'); free; end; end; if FromServer and (pck[1]=#$27) then begin SendMsg1('Панеслася!!!'); if (GetObjectId(ItemID)>0) then begin Crystal:=true; RequestCrystallizeItem(GetObjectId(ItemID)); end else SendMsg1('Нужная шмотка не найдена'); end; end.
Последний раз редактировалось Satoshi Hojo, 30.12.2011 в 06:38.
Причина: оформление