Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

Автоматический реденс (Обновление денсов/сонгов)

SARCAZM

Это что за покемон?
Команда форума
Рег
5 Июн 2015
Сообщения
1,446
Реакции
1
Trovo
SARCAZM
Автор iR_. Название темы может немного​
не совпадать с действительным назначением скрипта.​
За шару огромное спасибо @NeonEye
post-1-0-00585900-1440226263.png
Если не ошибаюсь, то вот (от автора):
Автореденс с адекватным расходом маны(дается промежуточно Dance\Song):
1. Для каждой формации пати дается свой денс\сонг
2. Удобный конфиг для настройки очередности эффектов

uses
SysUtils, SettingsModule, Classes;

type
TBaseFunctor = function(actor: TL2Live; skillId: integer = -1): boolean;
IntArr = array of integer;

var
Settings: TSettings;
//config
//isAutoAccept: boolean;
throwNames: array of string;
skillsArray: array of integer;

mageEff: IntArr;
warrEff: IntArr;
rogueEff: IntArr;
petEff: IntArr;

endTime: integer;
remoteNickname: string;
remoteControl: TL2Control;
remoteUser: TL2User;
isConcentrationCheck: boolean;
isShadowCheck: boolean;
shadowEndTime: integer;

function getArray(param: string): array of integer;
var
sl:TStringList;
i: integer;
resStr: string;
begin
sl := TStringList.Create;
Settings.SetFile(Script.Path + User.Name + '_SDsettings.ini');
resStr := Settings.Load('Skills', param, '0;0');
try
sl.Delimiter := ';';
sl.DelimitedText := resStr;
SetLength(Result, sl.Count);
for i:=0 to sl.count-1 do
Result := StrToInt(sl);

finally
sl.Free;
end;
end;

function getStringArray: array of string;
var
sl:TStringList;
i: integer;
resStr: string;
begin
sl := TStringList.Create;
Settings.SetFile(Script.Path + User.Name + '_SDsettings.ini');
resStr := Settings.Load('Skills', 'Throw names', ';');
try
sl.Delimiter := ';';
sl.DelimitedText := resStr;
SetLength(Result, sl.Count);
for i:=0 to sl.count-1 do
Result := (sl);

finally
sl.Free;
end;
end;

procedure doCast(skillId: integer; remoteNick: string);
var
skill: TL2Skill;
begin
if SkillList.ByID(skillId, skill) then
begin
if fManaCheck(5, User) then
Engine.UseSkill(skillId);
exit;
end;

if Length(remoteNick) < 1 then
begin
print('wrong nickname');
exit;
end;
remoteControl := GetControl(remoteNick);
if (Assigned(remoteControl)) then
begin
remoteUser := remoteControl.GetUser;

if fManaCheck(5, remoteUser) then
remoteControl.UseSkill(skillId);
end;
end;

function shouldRedance(obj: TL2Live; arr: array of integer; endtime: integer): boolean;
var
i: integer;
eff: TL2Buff;
begin
for i:=0 to Length(arr)-1 do
begin
if not obj.Buffs.ByID(arr, eff) or (obj.Buffs.ByID(arr, eff) and (eff.EndTime < endTime * 1000)) then
begin
Result := true;
exit;
end;
end;
Result := false;
end;

function countEffects(obj: TL2Live; arr: array of integer): integer;
var
i: integer;
eff: TL2Buff;
begin
Result := 0;
for i:=0 to Length(arr)-1 do
begin
if not obj.Buffs.ByID(arr, eff) or (obj.Buffs.ByID(arr, eff) and (eff.EndTime < endTime)) then
inc(result);
end;
end;

function partyCount(functor: TBaseFunctor; tNames: array of string; withMe: boolean = false): integer;
var
i: integer;
perlimResult: integer;
begin
perlimResult := 0;

if Party.Chars.Count < 1 then
begin
Result := 0;
exit;
end;

for i:=0 to Party.Chars.Count-1 do
begin
if fBuffable(Party.Chars.Items(i)) and (functor(Party.Chars.Items(i))) and not isContains(tNames, Party.Chars.Items(i).Name) then
perlimResult := perlimResult + 1;
end;
if (withMe) then
begin
if functor(User) then
perlimResult := perlimResult + 1;
end;
Result := perlimResult;
end;

function partyPetCount(functor: TBaseFunctor; tNames: array of string; withMe: boolean = false): integer;
var
i: integer;
perlimResult: integer;
begin
perlimResult := 0;

if Party.Pets.Count < 1 then
begin
Result := 0;
exit;
end;

for i:=0 to Party.Pets.Count-1 do
begin
if fBuffable(Party.Pets.Items(i)) and (functor(Party.Pets.Items(i))) and not isContains(tNames, Party.Chars.Items(i).Title) then
perlimResult := perlimResult + 1;
end;

Result := perlimResult;
end;

function partyCount2(tNames: array of string; arr: IntArr): integer;
var
i: integer;
perlimResult: integer;
begin
perlimResult := 0;

if Party.Chars.Count < 1 then
begin
Result := 0;
exit;
end;

for i:=0 to Party.Chars.Count-1 do
begin
if fBuffable(Party.Chars.Items(i)) and (shouldRedance(Party.Chars.Items(i), arr, EndTime)) and not isContains(tNames, Party.Chars.Items(i).Name) then
perlimResult := perlimResult + 1;
end;

Result := perlimResult;
end;

function countPartyWithoutEffects: IntArr;
var
i: integer;
res: integer;
partyStatus: array of integer;
begin
SetLength(partyStatus, Party.Chars.Count);
for i:=0 to Party.Chars.Count-1 do
begin
if not isContains(throwNames, Party.Chars.Items(i).Name) and fBuffable(Party.Chars.Items(i)) then
partyStatus := countEffects(Party.Chars.Items(i), skillsArray)
else
partyStatus := 0;
end;
Result := partyStatus;
end;

function absWithoutEffects: integer;
var
arr: array of integer;
i: integer;
res: integer;
begin
arr := countPartyWithoutEffects;
res := 0;
for i:=0 to Length(arr)-1 do
begin
res := res + arr;
end;

Result := Trunc(res / Length(arr));
end;

//functors
function fBuffable(actor: TL2Live): boolean;
var
effect: tl2effect;
begin
Result := (not actor.Dead) and (User.DistTo(actor) < 900) and not actor.Buffs.ByID(1422, effect);
{and not isMedused(actor)}
end;

function updateConcentration(actor: TL2Char; skillId: integer = -1): boolean;
var
eff: TL2Buff;
begin
Result := isHealer(actor) and not actor.Buffs.ByID(276, eff)
or (actor.Buffs.ByID(276, eff) and (eff.EndTime <= endTime * 1000));
end;

function withoutEff(actor: TL2Char; skillId: integer = -1): boolean;
var
eff: TL2Buff;
begin
Result := not actor.Buffs.ByID(skillId, eff)
or (actor.Buffs.ByID(skillId, eff) and (eff.EndTime <= endTime * 1000));
end;

function isHealer(obj: TL2Char): boolean;
begin
Result := (obj.ClassID = 97) or (obj.ClassID = 105) or (obj.ClassID = 112);
end;

function updateWarrior(actor: TL2Char; skillId: integer = -1): boolean;
begin
Result := isWarrior(actor) and shouldRedance(actor, warrEff, endTime);
end;

function updateMage(actor: TL2Char; skillID: integer = -1): boolean;
begin
Result := isMage(actor) and shouldRedance(actor, mageEff, endTime);
end;

function updateRogue(actor: TL2Char; skillID: integer = -1): boolean;
begin
Result := (isArcher(actor) or isRoque(actor)) and shouldRedance(actor, rogueEff, endTime);
end;

function updatePet(actor: TL2Pet; skillId: integer = -1): boolean;
begin
Result := shouldRedance(actor, petEff, endTime);
end;

function updateShadow(actor: TL2Live; skillId: integer = -1): boolean;
var
eff: TL2Effect;
begin
Result := not actor.Buffs.ByID(366, eff)
or (actor.Buffs.ByID(366, eff) and (eff.EndTime <= shadowEndTime * 1000));
end;


function isWarrior(obj: TL2Char): boolean;
begin
Result := ((obj.ClassID = 88) {duelist}
or (obj.ClassID = 89) {deadnought}
or (obj.ClassID = 113) {titan}
or (obj.ClassID = 114) {grand khautari}
or (obj.ClassID = 117) {forutne seeker}
or (obj.ClassID = 118) {maestro}
or (obj.ClassID = 131)); {doombringer}
end;

function isArcher(obj: TL2Char): boolean;
begin
Result := ((obj.ClassID = 92) {sagittarius}
or (obj.ClassID = 102) {moonlight sentinel}
or (obj.ClassID = 109) {ghost sentinel}
or (obj.ClassID = 134)); {trickster}
end;

function isRoque(obj: TL2Char): boolean;
begin
Result := ((obj.ClassID = 101) {wind rider}
or (obj.ClassID = 108) {ghost hunter}
or (obj.ClassID = 93)); {adventurer}
end;

function isMage(obj: TL2Char): boolean;
begin
Result := ((obj.ClassID = 94) {archmage}
or (obj.ClassID = 95) {soultaker}
or (obj.ClassID = 103) {mystic muse}
or (obj.ClassID = 110) {storm screamer}
or (obj.ClassID = 133) {female soul hound}
or (obj.ClassID = 132)); {male soul hound}
end;

function fManaCheck(manaPerCount: integer; obj: TL2Live): boolean;
var
effect: tl2effect;
begin
Result := (obj.Buffs.ByID(1533, effect) or obj.Buffs.ByID(1532, effect)
or obj.Buffs.ByID(3282, effect) or (obj.MP > manaPerCount));
end;

//etc

function isContains(arr: array of string; val: string): boolean;
var
i: integer;
begin
if Length(arr) < 1 then
begin
Result := false;
exit;
end;

for i:=0 to Length(arr)-1 do
begin
if (AnsiSameText(arr, val)) then
begin
Result := true;
exit;
end;
end;
Result := false;
end;

procedure loadSettings;
begin
skillsArray := getArray('Skill list');
throwNames := getStringArray;

mageEff := getArray('Mage list');
warrEff := getArray('Warrior list');
rogueEff := getArray('Rogue list');
petEff := getArray('Pet list');

Settings.SetFile(Script.Path + User.Name + '_SDsettings.ini');
remoteNickname := Settings.Load('Skills', 'Remote dancer', 'NickName');
endTime := Settings.Load('Skills', 'EndTime', 10);
isConcentrationCheck := Settings.LoadBool('Skills', 'Concentration Check', 'true');
isShadowCheck := Settings.LoadBool('Skills', 'Shadow Check', 'false');
shadowEndTime := Settings.Load('Skills', 'Shadow EndTime', 30);
end;

procedure mainController(iSkillList: IntArr; remoteNick: string);
var
eff: TL2Buff;
skill: TL2Skill;
i: integer;
currArr: IntArr;
arr1: IntArr;
arr2: IntArr;
begin

if (Length(iSkillList) > 2) then
begin
SetLength(currArr, Length(iSkillList));
SetLength(arr1, 2);
SetLength(arr2, Length(iSkillList)-2);

currArr := iSkillList;

for i:=0 to length(arr1)-1 do
arr1 := currArr;

for i:=0 to length(currArr)-2 do
arr2 := currArr[i + 2];

end
else
begin
SetLength(currArr, Length(iSkillList));
SetLength(arr1, Length(currArr));
SetLength(arr2, 0);
currArr := iSkillList;
for i:=0 to length(arr1)-1 do
arr1 := currArr;
end;


while Engine.Status = lsOnline do
begin
delay(50);

if isConcentrationCheck and (partyCount(updateConcentration, throwNames, false) > 0) then
doCast(276, remoteNick);

if isShadowCheck and ((partyCount(updateShadow, throwNames, true) > 0)
or (partyPetCount(updateShadow, throwNames, true) > 0)) then
doCast(366, remoteNick);

if (partyCount2(throwNames, arr1) > 0) then
begin
for i:=0 to Length(arr1)-1 do
begin
doCast(arr1, remoteNick);
delay(200);
end;
end;

if (partyPetCount(updatePet, throwNames, false) > 0) then
begin
for i:=0 to Length(petEff)-1 do
begin
doCast(petEff, remoteNick);
delay(200);
end;
end;

if (partyCount(updateWarrior, throwNames, false) > 0) then
begin
for i:=0 to Length(warrEff)-1 do
begin
doCast(warrEff, remoteNick);
delay(200);
end;
end;

if (partyCount(updateMage, throwNames, false) > 0) then
begin
for i:=0 to Length(mageEff)-1 do
begin
doCast(mageEff, remoteNick);
delay(200);
end;
end;

if (partyCount(updateRogue, throwNames, false) > 0) then
begin
for i:=0 to Length(rogueEff)-1 do
begin
doCast(rogueEff, remoteNick);
delay(200);
end;
end;

if Length(arr2) = 0 then
continue;

if (partyCount2(throwNames, arr2) > 0) then
begin
for i:=0 to Length(arr2)-1 do
begin
doCast(arr2, remoteNick);
delay(200);
end;
end;


end;
end;

begin

loadSettings;

script.newThread(@mainController(skillsArray, remoteNickname));

end.


 
Не могу разобраться как пользоваться скриптом? где что нужно исправить под себя, чтобы заработало, подскажите плиз :)
 
@bestlolka, Если я правильно понял, переименуй файл NickName_SDsettings.ini , вписав вместо NickName имя персонажа и отредактируй файл под себя
 
Пожалуйста помогите решить проблему. Проблема в следующем. Отредактировал для свса и бд имя файла. Настроил под себя содержимое каждого файла. Запускаю адреналин, подгружаю скрипты. При нажатии на кнопку запуска скрипта выводит сообщение: "Script error: Module: "auto redance", Line: 102, Message: Access violation at address 0AD61821. Read of address 00000000. Посмотрел я 102 строку там begin. Есть соображения как решить эту проблему?
 
@Atero, вообщем то ошибка в систем чат бота, то ошибка выскакивает в консоль. бывает просто бот виснет. Что я делаю не так?
1) Разархивировал в папку с ботом
2)Отредактировал под себя NickName_SDsettings.ini и переименовал его вместо НикНейм вписал ник своего бд.
айдишки денсов и сонгов в той последовательности которой мне надо прописал.
3)Загрузил сам скрипт в боте.

4)Запускаю скрипт
Ну и в итоге или ошибка или бот виснет. В игре тишина, не денсов не сонгов.
Или я где-то туплю или я уже не знаю.

Помогите плиз. Или подскажите куда копать.
 
@Atero, очень нравится фраза "либо виснет, либо ошибка". Если он запустился - уже хорошо. Если ошибка при компиляции - это другое дело.
На какой строке ошибка возникает?
Еще следует отметить, что используется связка бд+свс, так как в конфиге нужно указывать ник второго барда Remote dancer
 
var
timer,OnOff:integer;
begin
while 1=1 do begin
if engine.GetFaceState(0) = true then begin
timer:=GetTickCount+123*1000;
if engine.GetFaceState(0) = true then OnOff:=1
else OnOff:=2;

if (user.classID = 107) or (user.classID = 34) then begin // Бд
engine.facecontrol(0,false);
engine.canceltarget;
Engine.MoveTo(user.x,user.y,user.z);
engine.useskill(275);
engine.useskill(274);
engine.useskill(271);
if OnOff = 1 then engine.facecontrol(0,true);
end;

if (user.classID = 100) or (user.classID = 21) then begin // свс
engine.facecontrol(0,false);
engine.canceltarget;
Engine.MoveTo(user.x,user.y,user.z);
delay(500);
engine.useskill(268);
engine.useskill(269);
engine.useskill(264);
if OnOff = 1 then engine.facecontrol(0,true);
end;
while GetTickCount < timer do delay(100);
end;
delay(1000);
end;
end.

Для непонимающих, что вообще происходит. Мой на коленке написанный скрипт(да, прийдется его запустить на БД и СВСе) если запускать ботов кнопкой Insert, будут денсить без просадки по мане.
 
Беспонтовый скрипт, он работает все норм даёт диско, но там таймер смотрит по первым денсам или сонгам, то есть если поставить 1 секунду то редиско начнется когда первый в списке денс или сонг упадет до 1 секунды, это уже не правильно таймер должен смотреть на последний денс или сонг, а так они на верх бомбят , не о чем короче
 
@Agonia, наверное написано все как раз для меня) не понимаю что просходит)
подскажи,нужно что б бд давал пати на чара,давал реденс и выходил) ну и так по кд)
 
Тоже повозился с этим скриптом, в пати он у меня давал только сонги для петов и то коряво, в итоге настроил через интерфейс.
А ошибку такую дает если какой-то из списков сонгов дансов неправильно указан, когда все указал верно, скрипт давал денсы пока мп не кончится.



zsc написал(а):
Agonia, наверное написано все как раз для меня) не понимаю что просходит) подскажи,нужно что б бд давал пати на чара,давал реденс и выходил) ну и так по кд)
В настройках пати хил\баф галочка запрос пати, выход через
 
@zsc, в настройках пати, ставишь 2 галки "принимать от своих ботов", в настройках денсов, ставишь галку "вне пати", профит.
 
Скрипт норм отрабатывает, да на последних секундах первого денса, но если проточка уже норм. ЕЕ не заморачивалась вообще, зато ДС не кто не проебывал.
 
Если бы потправили его на последний денс или сонг в списке, что бы все денсы падали , то было бы норм, а так беспонт, проще через ид настроить уже
 
Не могу понять почему не работает, БД дает только Shadow и все.
 
Просветите, можно ли сделать, чтоб д/с спадал полностью?
 
Вроде все верно сделал, но сонг/денсы дает по откату пока мп не закончится
 
Назад
Сверху