Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Смотрите, что не пофиксил, пробуйте. Надо будет ещё обработку ошибок допилить и дублирование кода убрать в NamedFileStream extends FileStream, чтобы обходиться одной строчкой кода
NamedFileStream("sig.txt").writeUTFBytes("{"+outpu t.join(",\n")+"}"); вместо 5. почти доделанный, но рабочий .as
Забэкапьте старый на всякий.
Main.as
Код:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.filesystem.*;
import class_314;
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
var file:File = new File(File.applicationDirectory.nativePath+"/url.txt");
var stream:FileStream = new FileStream();
stream.open(file, FileMode.READ);
this.serverUrl = stream.readUTFBytes(file.size);
stream.close();
//this.serverUrl = "http://java.shadowlands.ru/zombievk";
file = new File(File.applicationDirectory.nativePath+"/keys.txt");
stream = new FileStream();
stream.open(file, FileMode.READ);
var contents:Array = stream.readUTFBytes(file.size).split(" ");
stream.close();
//this.serverUrl = contents[0];
this.authKey = contents[0];
this.var_290 = new Number(contents[1]);
this.sessionKey = contents[2];
getSalt();
}
private var serverUrl:String;
private var sessionKey:String;
public var sigSaltFunc:Function;
private var var_290:Number;
private var authKey:String;
private var postfix:String;
private function getSalt():void
{
var loadSaltComplete:Function = null;
var loadSaltFileComplete:Function = null;
var loadSaltFileFailed:Function = null;
loadSaltComplete = function(param1:class_314):void
{
sigSaltFunc = param1.saltFunc;
var file:File = new File(File.applicationDirectory.nativePath+"/salt");
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
stream.writeBytes(param1.bytes);
stream.close();
timeGetOk();
};
loadSaltFileComplete = function(param1:class_314):void
{
if (param1.actualPostfix == postfix) {
sigSaltFunc = param1.saltFunc;
timeGetOk();
} else loadSaltFileFailed(param1);
};
this.postfix = sessionKey.substring(sessionKey.indexOf(":") + 1);
loadSaltFileFailed = function(param1:class_314):void
{
new class_314(serverUrl, postfix, loadSaltComplete);
};
new class_314(serverUrl, postfix, loadSaltFileComplete, loadSaltFileFailed, "salt");
};
private function timeGetOk():void
{
var file:File = new File(File.applicationDirectory.nativePath + "/sig.txt");
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
var output:Array = new Array();
var id:Number;
var sig:String;
for (var i:Number = 0; i < 1000; i++) {
id = var_290 + i;
sig = this.sessionKey + id.toString() + this.authKey;
sig = sig + this.sigSaltFunc(sig);
output[i]= new String("\""+id.toString()+"\":\""+sig+"\"")
}
stream.writeUTFBytes("{"+output.join(",\n")+"}");
stream.close();
stage.nativeWindow.close();
}
}
}
class_314.as
Код:
package
{
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.IOErrorEvent;
import flash.events.Event;
import flash.utils.ByteArray;
import flash.utils.getQualifiedClassName;
public class class_314 extends Loader
{
public function class_314(param1:String, param2:String, param3:Function, param4:Function = null, savedSaltSWF:String = null)
{
super();
if (savedSaltSWF != null)
this.url = param1 + "/salt?postfix=" + param2;
else this.url = savedSaltSWF;
this.postfix = param2;
this.completeHandler = param3;
this.failHandler = param4;
this.contentLoaderInfo.addEventListener(Event.COMPLETE,this.method_533);
this.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,this.method_1684);
this.request = new URLRequest(param1);
load(this.request);
}
private static var var_1767:int = 3;
public var url:String;
public var completeHandler:Function;
private var failHandler:Function;
private var request:URLRequest;
private var var_1152:int = 0;
public var loaded:Boolean = false;
public var saltFunc:Function;
public var bytes:ByteArray;
public var actualPostfix:String;
private var postfix:String;
private function method_1684(param1:IOErrorEvent) : void
{
if(this.var_1152 < var_1767)
{
this.var_1152++;
this.request = new URLRequest(this.url);
load(this.request);
}
else
{
this.loaded = false;
this.contentLoaderInfo.removeEventListener(Event.COMPLETE,this.method_533);
this.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,this.method_1684);
if(this.failHandler != null)
{
this.failHandler(this);
}
}
}
private function method_533(param1:Event) : void
{
var _loc2_:Object = param1.target.content;
this.bytes = param1.target.bytes;
this.actualPostfix = getQualifiedClassName(_loc2_).substr( -postfix.length, postfix.length);
trace(this.actualPostfix);
this.saltFunc = _loc2_.saltFunc;
this.loaded = true;
this.contentLoaderInfo.removeEventListener(Event.COMPLETE,this.method_533);
this.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,this.method_1684);
this.completeHandler(this);
}
}
}
Спасибо [отсортировано по времени]:
polkowoy за детальные вопросы по установке патча,
mike4kz за разработку альтернативной версии патча с разбором swf на питоне,
vintets за решение проблемы с русской кодировкой в пути,
dark-dragon за работающий фикс с относительными путями и постановку проблемы "белого окошка",
vintets, dark-dragon, zloy_gnom_2012 и причастным - за пояснения непонимающим,
vhyrix, JohnMorgan, dark-dragon и остальным участвовавшим - за поддержку и приятную атмосферу форума.
И, конечно, разработчикам и доработчикам оригинального бота и создателям зф, без которых это было бы невозможно.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от megabyte0
Было бы очень приятно, когда стартуешь первую суперварку на развиваемом акке, на 250 парах поваров. То ставишь
варить = глазную росянку
варить ингридиенты = да
создавать мозги если нехватает = да
А иначе 15-30 минут на ручной перестановке рецептов в конфиге можно и потерять
В плане варить глазную настойку=1000,острую росянку=1000,глазную росянку=500, было бы гораздо менее эффективно.
Чем плохо: варить глазную настойку=1000,острую росянку=1000,глазную росянку=500 ?
Для варки ингредиентов добавлю например знак +. Типа: RECIPE_01=100+. Будет обходить дерево ингредиентов и варить недостающие.
С мозгами уже сложнее, надо придумывать как это будет работать.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от vhyrix
Чем плохо: варить глазную настойку=1000,острую росянку=1000,глазную росянку=500 ?
Так мы варим 2000 рецептов на 30-50 поварах, а если варить и сразу создавать, то 30-50 поваров в начале и 250 в конце, а "площадь под кривой" - та же. Экономим время на остальные рецепты.
Конечно, это единичный случай использования, но написать "варить голову-гриб=80+" народу тоже было бы приятно, не думая, из чего её делать. Хотя, кто уж посчитал, что 80, и так напишет ингры
Цитата:
Сообщение от vhyrix
С мозгами уже сложнее, надо придумывать как это будет работать.
При обходе всех островов хранить словарик на каком острове сколько мозгов "должно работать", то есть кого он бы разбудил, если б хватало мозгов (работающие + должны_быть_работающими). А когда встречает останкино, просто разность суммы значений словарика с имеющимися мозгами создаёт.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Сегодня произошла нехорошая вещь: упал сервер ключей. В результате 5 часов бот не работал. Так что у меня появилась новая увлекательная задача создания распределенной системы генерации ключей, которая не рухнет полностью и сразу.
Я бы пообщался с теми кто знает как такую вещь построить.
Добавлено через 23 минуты
Цитата:
Сообщение от megabyte0
Так мы варим 2000 рецептов на 30-50 поварах, а если варить и сразу создавать, то 30-50 поваров в начале и 250 в конце, а "площадь под кривой" - та же. Экономим время на остальные рецепты.
Конечно, это единичный случай использования, но написать "варить голову-гриб=80+" народу тоже было бы приятно, не думая, из чего её делать. Хотя, кто уж посчитал, что 80, и так напишет ингры
При обходе всех островов хранить словарик на каком острове сколько мозгов "должно работать", то есть кого он бы разбудил, если б хватало мозгов (работающие + должны_быть_работающими). А когда встречает останкино, просто разность суммы значений словарика с имеющимися мозгами создаёт.
Так давно не играл, что забыл про возможность создавать мозги. Хорошая штука. Построю Останкино и сделаю функцию. Из чего лучше делать мозги ил Хелии или Росянки?
У кого можно заиграть 5 нефти и 27 кварца на Останкино? Поменяю на Любовь или Нож для бумаги. Еще факелы есть и секвойя.
Последний раз редактировалось vhyrix; 06.08.2014 в 16:32.
Причина: Добавлено сообщение
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
[Ссылки могут видеть только зарегистрированные пользователи. ]
Помогите... )))В чём проблема,
Кто может помочь!!! в лс...или тут..
Добавлено через 2 минуты
Цитата:
Так давно не , что забыл про возможность создавать мозги. Хорошая штука. Построю Останкино и сделаю функцию. Из чего лучше делать мозги ил Хелии или Росянки?
Хелии 100%
Последний раз редактировалось Сергійко; 06.08.2014 в 17:40.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от vhyrix
упал сервер ключей.
Или я чего-то не знаю или не заметил... просветите, что за вещь такая? Етот сервер.
Цитата:
Сообщение от vhyrix
Из чего лучше делать мозги из Хелии или Росянки?
Обычно, если акк старый и оборудованный, делают из хеллии, потому что она просто крафтится в летучем корабле без варки.
Ботоводы делают из росянки, потому что сажать урожая меньше, а варить всего день потом. Так что можно сделать опционально.
Цитата:
Сообщение от dreamerag2
сократил AIR SDK для бота до 40м
Тогда есть повод скомпилять swf в exe - весь sdk будет не нужен XDD
Последний раз редактировалось megabyte0; 06.08.2014 в 20:16.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от megabyte0
Или я чего-то не знаю или не заметил... просветите, что за вещь такая? Етот сервер.
Обычно, если акк старый и оборудованный, делают из хеллии, потому что она просто крафтится в летучем корабле без варки.
Ботоводы делают из росянки, потому что сажать урожая меньше, а варить всего день потом. Так что можно сделать опционально.
Тогда есть повод скомпилять swf в exe - весь sdk будет не нужен XDD
нужно как то оптимизировать бота чтоб без доп програм работал..
Добавлено через 4 минуты
Цитата:
Сообщение от megabyte0
пояснить можно?
Никак, модуль можно выкинуть. Пользуйте нормальные функции. Можно их засунуть например в base.py функции тут
Код:
def send(self, events):
return self._get_events_sender().send_game_events(events)
def money(self):
return self._get_game_state().get_state().gameMoney
def craft_item_count(self,item):
if item=="@COINS": return self.money()
if item.startswith("@C_"):
pass
return self._get_game_state().count_in_storage(item)
def add_crafted_item(self,item,count):
if item=="@COINS":
self._get_game_state().get_state().gameMoney+=count
return
if item.startswith("@C_"):
pass
self._get_game_state().add_from_storage(item, count)
def __get_building_craft(self,building,craft_id):
return filter(lambda(obj):obj.id == craft_id,self._get_item_reader().get(building).crafts)[0]
def craft_available(self,building,craft_id):
craft = self.__get_building_craft(building,craft_id)
#проверка на то, тратится или нет
#проверка на макс число сделанных
return min(self.craft_item_count(material.item)/material.count for material in craft.materials)
def craft(self,building,craft_id,count,max_count_once=500):
craft = self.__get_building_craft(building,craft_id)
for item in self._get_game_state().get_state().gameObjects:
if (item.item == "@"+building) and (item.level>=craft.level):
building_id = item.id
break
else:
return 0
count = min(count,self.craft_available(building,craft_id))
saved_count=count
#removing
for material in craft.materials:
self.add_crafted_item(material.item, -material.count*count)
#adding
self.add_crafted_item(craft.result, craft.resultCount*count)
craft_event={"itemId":craft_id,"objId":building_id,"action":"craft","type":"item"}
#sending
events=[craft_event] * min(count,max_count_once)
while count>max_count_once:
self.send(events)
count-=max_count_once
events=[craft_event] * count
self.send(events)
return saved_count
Пользовать примерно так:
Код:
def perform_action(self):
if self.location_id() == 'isle_mobile' and self.money()<10000000:
actually_crafted = self.craft('B_BUSINESS','3',50)
logger.info(u"Сделали %.1fкк монет"%(actually_crafted*0.1))
пояснить конечно можно, строишь 5 000 флагов как минимум и возращаешь все затрачениые ресурсы почти за неделю)
Последний раз редактировалось zloy_gnom_2012; 06.08.2014 в 20:31.
Причина: Добавлено сообщение
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от megabyte0
Или я чего-то не знаю или не заметил... просветите, что за вещь такая? Етот сервер.
Обычно, если акк старый и оборудованный, делают из хеллии, потому что она просто крафтится в летучем корабле без варки.
Ботоводы делают из росянки, потому что сажать урожая меньше, а варить всего день потом. Так что можно сделать опционально.
Тогда есть повод скомпилять swf в exe - весь sdk будет не нужен XDD
Сервер ключей генерирует подписи. Которые вы из флеша пытаетесь получить. Я даже пару раз предлагал всех желающих подключить к нему. Зомбот заработает под линуксом и флеш не будет нужен.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от vhyrix
Сервер ключей генерирует подписи. Которые вы из флеша пытаетесь получить. Я даже пару раз предлагал всех желающих подключить к нему. Зомбот заработает под линуксом и флеш не будет нужен.
и как подключится?
Добавлено через 4 минуты
Цитата:
Сообщение от megabyte0
Или я чего-то не знаю или не заметил... просветите, что за вещь такая? Етот сервер.
Обычно, если акк старый и оборудованный, делают из хеллии, потому что она просто крафтится в летучем корабле без варки.
Ботоводы делают из росянки, потому что сажать урожая меньше, а варить всего день потом. Так что можно сделать опционально.
Тогда есть повод скомпилять swf в exe - весь sdk будет не нужен XDD
можешь подробную инструкцию дать по созданию модуля для крафта в любой постройке.. так как иногда нужно создавать больше 1000 материалов, а щёлкать лень)
Последний раз редактировалось zloy_gnom_2012; 06.08.2014 в 21:51.
Причина: Добавлено сообщение
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от zloy_gnom_2012
нужно как то оптимизировать бота чтоб без доп программ работал..
И был доступен любому ботоводу, не имеющему ни малейшего понятия о том, как он грузит сервер зф?
Этим занимался уважаемый mike4kz, надеюсь, успешно, потому что отписываться он перестал.
Цитата:
Сообщение от zloy_gnom_2012
можешь подробную инструкцию дать по созданию модуля для крафта в любой постройке
Берутся функции, прописываются в base.py, в класс BaseActor
После этого крафт выглядит так:
self.craft('B_BUSINESS','3',50)
параметры - где, номер крафта (начиная с 1, а лучше смотрите файл ресурсов игры items), сколько раз сделать.
в любом модуле. Отдельный модуль не нужен. Если нужен, то пишется в 3 строчки.
Цитата:
Сообщение от zloy_gnom_2012
и как подключится?
Написать класс на питоне и платить 20р/мес или сколько там говорил уважаемый vhyrix.
Хотя зачем же класс? Берём то, как загружается /items , спариваем с тем, как загружаются из файла sig и можно продавать
Ну, и конечно, zlib.decompress.
Цитата:
Сообщение от vhyrix
и флеш не будет нужен
При правильном подходе он и так не нужен, да и под linux adobe AIR 2.6 (SDK) есть, вместе с flex SDK 4.5, хотя версия swf 10.2, когда для salt.swf заявлено 11, но, я думаю, это можно пропатчить прямо в загруженной salt.swf, вроде ничо она особо 11-го не пользует, тот же as3. Было бы желание. Я как понял, народу просто заморачиваться не хочется.
Цитата:
Сообщение от vhyrix
генерирует подписи.
И по сколько Вы их отдаёте? Просто интересно. Только не говорите, что по одной, это ж двойное время на каждый пакет.
Цитата:
Сообщение от Lion1000+
ставил и с тройкой и без. исход один и тот же
Строчка с телефоном должна не начинаться с тройки,
она должна начинаться с user
Аналогично с паролем - с pass пробел.
Хотя, простите, если я очевидные вещи говорю и проблема не в этом.
Цитата:
Сообщение от vhyrix
распределенной системы генерации ключей, которая не рухнет полностью и сразу.
Можно отдавать вертушку DNS, как это сделано в icq или у той же самой зф при java .shadowlands .ru , но я не уверен как заставить питона кушать именно определённую запись из DNS, наверняка это нетривиально. Хотя тот же wget умеет их последовательно перебирать, так что это возможно.
Альтернативным решением были бы hardcoded IP-адреса серверов, но это потребует обновлений клиента, если что.
Последний раз редактировалось megabyte0; 07.08.2014 в 00:22.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Кстати, насчет бота. У меня упорно крутится в голове слова(кажется даже из официальной группы) о том, что бот не должен позволять делать того, что не может официальный клиент. И пока бот ведет себя мирно и не наглеет за него банить не будут. Банили тех, кто охренел окончательно и бесповоротно. Например тех, кто влезал на закрытые территории и тырил сундуки. Это отслеживается моментально и вот тут я даже верю, что бан выдается автоматом.
Цитата:
и как подключится?
Вечерком напишу класс для питона и покажу.
Цитата:
И по сколько Вы их отдаёте? Просто интересно. Только не говорите, что по одной, это ж двойное время на каждый пакет.
До вчерашнего дня по 100, теперь по 200.
Цитата:
vhyrix ты не думал добавить управление торгами? что бы обновляло их.
Давай алгоритм сделаю. )
Вчера появилась мысль насчет некоего подобия скриптов. например пишешь buy_fruit:location=isle_03;box=16,14,64,70;fruit=F T_MANDARINE;doit. И бот шустренько рассаживает мандарины по острову Любви.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от vhyrix
Кстати, насчет бота. У меня упорно крутится в голове слова(кажется даже из официальной группы) о том, что бот не должен позволять делать того, что не может официальный клиент. И пока бот ведет себя мирно и не наглеет за него банить не будут. Банили тех, кто охренел окончательно и бесповоротно. Например тех, кто влезал на закрытые территории и тырил сундуки. Это отслеживается моментально и вот тут я даже верю, что бан выдается автоматом.
Вечерком напишу класс для питона и покажу.
До вчерашнего дня по 100, теперь по 200.
Давай алгоритм сделаю. )
Вчера появилась мысль насчет некоего подобия скриптов. например пишешь buy_fruit:location=isle_03;box=16,14,64,70;fruit=F T_MANDARINE;doit. И бот шустренько рассаживает мандарины по острову Любви.
А я давно говорил что автобан банит только когда выходишь за рамки стандартноо функционала..)
очевидно ведь...
бота со стандартными функциями тяжело отследить..)