Создаём команду и отправляем этим скриптом всех на фарм.
- Расчитываем и идём к месту фарма
2. Передвижение по кругу относительно точки в пространстве на месте фарма
3. Лечимся по мере необходимости
4. Возвращаемся на фарм после смерти
Реализован, так называемый, кайтинг монстров — удержание монстров в зоне атаки с не возможностью их атаковать персонажа.
// боевой режим?
var attack_mode=true
//show_json(G.maps["main"].monsters)
// настройки
MONSTER = "crabx" // на кого будем охотится
// С bee не работает корректно - их несколько спавнов!!!
// Если MONSTER == "", то ищем его
// иначе по данным коррдинатам
x=-1020 // x=-32 // spawn goo
y=1420 // x=787
// по умолчанию, при 0 расчитывается
RadiusWar = 0
// расчитываем куда идём
if (MONSTER != ""){ //
let obj = G.maps["main"].monsters
for(key in obj){
//log(obj[key].type)
if(obj[key].type == MONSTER){ // нашли нашего монстра
x=(obj[key].boundary[0] + obj[key].boundary[2])/2
y=(obj[key].boundary[1] + obj[key].boundary[3])/2
if(RadiusWar==0){
a = Math.abs(obj[key].boundary[2]-obj[key].boundary[0])
b = Math.abs(obj[key].boundary[3]-obj[key].boundary[1])
RadiusWar=Math.round(Math.min(a,b)*0.8)
log("RadiusWar=" + RadiusWar)
}
}
}
}
log("x=" + x + " y=" + y)
log("Попробуем дойти...")
xmove(x,y) // поиск пути
var Death=false // умер?
REGEN = false // регенирация
Farm = {}
Farm.x = x
Farm.y = y
Farm.Radius = RadiusWar //* 2
DeathNum=0
// начало кодирования
FlagReady = false
setInterval(function(){
// отслеживаем поход к месту
if (!FlagReady && x != character.real_x && y != character.real_y){
//log(character.real_x) // текущие координаты
} else if(!FlagReady) { // дошли
FlagReady = true
log (character.name + " ready to war!")
}
if(Death && !character.rip){ // умер и воскрес
FlagReady = false
Death=false
// возвращаемся на кормёжку
xmove(Farm.x,Farm.y) // поиск пути
DeathNum = DeathNum + 1
log(character.name + " помер в " + DeathNum + " раз. Иду назад...")
}
////////////////////////////////////////////////////////////////////////////
// использовать зелья, когда нужно
if(character.hp<character.max_hp/3
|| character.mp<character.max_mp/3
|| REGEN
){
use_hp_or_mp();
}
if(character.hp<character.max_hp/4 && !target){
// надо подлечиться
REGEN = true
}
if(character.hp>character.max_hp*2/3 && REGEN){
// как подлечимся
REGEN = false
}
////////////////////////////////////////////////////////////////////////////
// Готовый к бою
if(FlagReady){ // основной код
// выйти если не атакую или мёртв или двигается
if(!attack_mode || character.rip || is_moving(character)) return;
var target=get_targeted_monster();
if(!target && !REGEN)
{
// min_xp - минимально опыта
// max_att - максимальная атака
// path_chek - доступен
// no_target - не атакован другими
target=other_target()
if(!target){
target=get_nearest_monster({min_xp:100,max_att:1000});
}
if(target){
change_target(target) // забираем эту цель
}
else
{
set_message("No Monsters");
return;
}
}
if(is_in_range(target)) // на дистанции атаки
{
if(can_attack(target)) // могу атаковать?
{
set_message("Attacking");
attack(target);
}
}
// кружимся
orbitFarmingSpot(target)
}
////////////////////////////////////////////////////////////////////////////
loot(); // подбираем лут
toTrader()
},1000/20); // повторяем каждые 1/4 секунды.
//Circles Center of Farming Spot
function orbitFarmingSpot(target) {
//If close to Farming Spot...
if (distance(character, Farm) < Farm.Radius
//...and have no target...
&& (!target
//...or character is in target's range...
|| target?.range * 3 >= distance(character, target)
//...or monster is out of character's range...
|| character?.range <= distance(character, target)
//...or target can charge - Orbit!
|| target?.charge)) {
//Get & constrain Orbit-Radii
// в оригинале тут расчёт по ширине и высоте зоны охоты и максимального отхода от центра
// let farmingSpotRadii = getFarmingSpot(farmMonsterType, "getKitingData");
let farmingSpotRadii={}
const maxRadius = (Farm.Radius / 2) - 2;
// if (farmingSpotRadii.xRadius > maxRadius) farmingSpotRadii.xRadius = maxRadius;
// if (farmingSpotRadii.yRadius > maxRadius) farmingSpotRadii.yRadius = maxRadius;
farmingSpotRadii.xRadius = maxRadius
farmingSpotRadii.yRadius = maxRadius
//Handle Offset
let offset = 1;
// эта фигня хранит в ОЗУ переменную смещения
if (!get(character.name + "Offset")) {
set(character.name + "Offset", offset);
} else {
offset = Number(get(character.name + "Offset"));
offset += 0.2;
if (offset >= 99999999) offset = 1;
set(character.name + "Offset", offset);
}
//Orbit around farming Spot center
xmove(
Farm.x + (farmingSpotRadii.xRadius * Math.sin(offset)),
Farm.y + (farmingSpotRadii.yRadius * Math.cos(offset))
);
}
}
//поиск доступных целей других персонажей
function other_target()
{
let retTarget = false
let tmp
let obj = get_characters();
for(key in obj){
if(obj[key].online != 0){
var leader = get_player(obj[key]);
// Current target and target of leader.
var currentTarget = get_targeted_monster();
var leaderTarget = get_target_of(leader)
// Change the target.
if (!currentTarget || currentTarget != leaderTarget){
// Current target is empty or other than the leader's.
change_target(leaderTarget);
currentTarget = get_targeted_monster();
}
// Attack the target.
targetTarget = get_target_of(currentTarget)
if(currentTarget && targetTarget == leader){
// Current target isn't empty and attackable.
retTarget=currentTarget
}
}
}
return retTarget
}
// событие после смерти
function handle_death()
{
Death=true
setTimeout(respawn,25000);
return true;
// This ensures you keep on farming, yet, to retain your XP, do enhance the logic for defense
}
// Поучение нового уровня
character.on("level_up",function(data){
game_log("I am now level "+data.level+"!");
});
function toTrader(){
TRADER="GAVmerchant" // имя торговца
MaxDist=300 // дистанция взаимодействия с торговцем
let merchant=get_player(TRADER)
// проверяем что торговец online
if(merchant != null ){ // торговец в игре
// проверяем что торговец рядом и тогда передаём ему нужное
if (distance(character, merchant) < MaxDist){
// отправить 100 000 золота торговцу
if(character.gold > 500000 && get_player(TRADER)){
send_gold(TRADER, 100000)
}
// отправить торговцу лут
let offset = null
for (let i = 0; i < character.isize; i++) {
let item = character.items[i]
if (item != null){
offset=i
}
}
if (offset != null){
// q - количество - у ресов
// level - уровень - у шмоток
let a = character.items[offset]
let obj = a
for(key in obj){
if(key="q"){ // только шмотки не стакуемые
send_item(TRADER, offset, a.q) // по 1 ячейке за раз
}
if(key == "level"){ // только шмотки не стакуемые
send_item(TRADER, offset) // по 1 ячейке за раз
}
}
}
}
} // если торговца нет, то и делать ничего не надо
}