Создаём команду и отправляем этим скриптом всех на фарм.
- Расчитываем и идём к месту фарма
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 ячейке за раз } } } } } // если торговца нет, то и делать ничего не надо }