Adventure Land — чистый фарминг

Автор: | 14 января, 2022
Поделиться...

Создаём команду и отправляем этим скриптом всех на фарм.

  1. Расчитываем и идём к месту фарма

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 ячейке за раз
					}
				}
			}			
		}
	} // если торговца нет, то и делать ничего не надо
}

Поделиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *