diff --git a/items.py b/items.py index c015c09..06a58ee 100644 --- a/items.py +++ b/items.py @@ -107,8 +107,9 @@ CARROT_ID = get_id('carrot') POTATO_ID = get_id('potato') WHEAT_SEEDS_ID = get_id('wheat_seeds') BEETROOT_SEEDS_ID = get_id('beetroot_seeds') +PUMPKIN_ID = get_id('pumpkin') EMERALD_ID = get_id('emerald') -NEEDED_ITEMS = BED_IDS | SHOVEL_IDS | AXE_IDS | FOOD_IDS | set([CHEST_ID]) +NEEDED_ITEMS = BED_IDS | SHOVEL_IDS | AXE_IDS | FOOD_IDS | set([CHEST_ID, PUMPKIN_ID]) WANTED_ITEMS = SAPLING_IDS | set([NETHERWART_ID, CARROT_ID, POTATO_ID, WHEAT_SEEDS_ID, BEETROOT_SEEDS_ID]) diff --git a/jobs.py b/jobs.py index f3ab4c8..7c86269 100644 --- a/jobs.py +++ b/jobs.py @@ -3,7 +3,7 @@ import time import importlib import random from itertools import count -from math import hypot +from math import hypot, floor from minecraft.networking.types import BlockFace @@ -1049,12 +1049,13 @@ class GrabSuppliesStates: self.state = self.cleanup def check_supplies(self): - for items, maximum in self.supplies.items(): + for items, limits in self.supplies.items(): + minimum, maximum = limits print('Checking items:', items) num_items = self.g.game.count_items(items) print('Have:', num_items) - if num_items: + if num_items >= minimum: print('Skipping') continue else: @@ -1843,12 +1844,21 @@ class SellToVillagerStates: print('Interacting with villager') self.g.game.interact(self.villager.entity_id) self.g.game.animate() - self.state = self.choose_trade + self.wait_time = 0.5 + self.state = self.wait_for_window + + def wait_for_window(self): + if self.wait_time > 0: + self.wait_time -= utils.TICK + else: + self.state = self.choose_trade def choose_trade(self): g = self.g.game if not self.g.window or not self.g.trades: + print('Didnt get a trade window, aborting') + self.state = self.cleanup return for trade_num, trade in enumerate(self.g.trades): @@ -1856,26 +1866,40 @@ class SellToVillagerStates: in_num = trade.input_item_1.item_count out_id = trade.output_item.item_id + price = in_num \ + + floor(in_num * trade.price_multiplier * trade.demand) \ + + trade.special_price - if g.count_items([in_id]) < in_num: + if g.count_items([in_id]) < price: continue + + print('Checking trade #', trade_num) if trade.trade_disabled: + print('Trade disabled, skipping') continue if out_id != items.EMERALD_ID: + print('Not for emeralds, skipping') + continue + if price > in_num: + print('Trade in demand, skipping') continue - print('Found trade: #', trade_num, trade) + print('Found trade:', trade) + print('Adjusted price:', price) self.trade = trade self.trade_num = trade_num self.state = self.click_trade break else: print('Villager has been spent, aborting') + self.g.game.close_window() self.spent_villagers.append(self.villager) - self.state = self.cleanup + self.state = self.wait + self.wait_time = 10 return def click_trade(self): + print('Clicking trade') self.g.item_lock = True self.g.game.select_trade(self.trade_num) self.state = self.execute_trade @@ -1887,42 +1911,27 @@ class SellToVillagerStates: w = self.g.window w_info = mcdata.WINDOWS[w.data.window_type] slot_num = w_info.output - slot = w.contents[slot_num] - self.g.item_lock = True - self.g.game.click_window(slot_num, 0, 1, slot) - self.g.game.close_window() + if slot_num in w.contents: + print('Executing trade') + slot = w.contents[slot_num] + self.g.game.click_window(slot_num, 0, 1, slot) + else: + print('Bad trade, aborting') + self.state = self.end_trade def end_trade(self): - if self.g.item_lock: - return + print('Trading complete') + self.g.game.close_window() + self.wait_time = 1 + self.state = self.wait_for_trade - print('Trade completed.') - self.state = self.interact_villager - - - - #def grab_stack(self): - # g = self.g.game - # in_id = self.trade.input_item_1.item_id - # slot_num, slot = g.get_window_slot(in_id) - - # if not slot: - # print('Item not found, aborting') - # self.state = self.cleanup - # return - - # print('Grabbing:', slot) - # self.g.item_lock = True - # # double click stack to grab max - # self.g.game.click_window(slot_num, 0, 6, slot) - - # self.state = self.freeze - - - def freeze(self): - return + def wait_for_trade(self): + if self.wait_time > 0: + self.wait_time -= utils.TICK + else: + self.state = self.interact_villager def wait(self): if self.wait_time > 0: @@ -2010,7 +2019,7 @@ class JobStates: self.sleep_with_bed_states.silent = True self.cache_items_states.silent = True self.grab_supplies_states.supplies = { - tuple(items.SHOVEL_IDS): 9 + tuple(items.SHOVEL_IDS): (1, 9), } return machines @@ -2050,7 +2059,7 @@ class JobStates: self.sleep_with_bed_states.silent = True self.cache_items_states.silent = True self.grab_supplies_states.supplies = { - tuple(items.AXE_IDS): 9, + tuple(items.AXE_IDS): (1, 9), } return machines @@ -2091,7 +2100,7 @@ class JobStates: item = items.ITEMS['minecraft:'+name]['protocol_id'] self.grab_supplies_states.supplies = { - tuple([item]): 0, + tuple([item]): (1, 0), } return machines @@ -2106,16 +2115,16 @@ class JobStates: def trade(self): machines = [ - #self.grab_supplies_states, + self.grab_supplies_states, self.sell_to_villager, - #self.sleep_with_bed_states, - #self.eat_food_states, - #self.cache_items_states, + self.sleep_with_bed_states, + self.eat_food_states, + self.cache_items_states, ] self.sleep_with_bed_states.silent = True self.cache_items_states.silent = True self.grab_supplies_states.supplies = { - tuple(items.AXE_IDS): 9, + tuple([items.PUMPKIN_ID]): (64, 9), } return machines