Complete villager trading job

This commit is contained in:
Tanner Collin 2021-02-24 08:21:25 +00:00
parent 28ca442a46
commit fcc74c7198
2 changed files with 57 additions and 47 deletions

View File

@ -107,8 +107,9 @@ CARROT_ID = get_id('carrot')
POTATO_ID = get_id('potato') POTATO_ID = get_id('potato')
WHEAT_SEEDS_ID = get_id('wheat_seeds') WHEAT_SEEDS_ID = get_id('wheat_seeds')
BEETROOT_SEEDS_ID = get_id('beetroot_seeds') BEETROOT_SEEDS_ID = get_id('beetroot_seeds')
PUMPKIN_ID = get_id('pumpkin')
EMERALD_ID = get_id('emerald') 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]) WANTED_ITEMS = SAPLING_IDS | set([NETHERWART_ID, CARROT_ID, POTATO_ID, WHEAT_SEEDS_ID, BEETROOT_SEEDS_ID])

95
jobs.py
View File

@ -3,7 +3,7 @@ import time
import importlib import importlib
import random import random
from itertools import count from itertools import count
from math import hypot from math import hypot, floor
from minecraft.networking.types import BlockFace from minecraft.networking.types import BlockFace
@ -1049,12 +1049,13 @@ class GrabSuppliesStates:
self.state = self.cleanup self.state = self.cleanup
def check_supplies(self): 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) print('Checking items:', items)
num_items = self.g.game.count_items(items) num_items = self.g.game.count_items(items)
print('Have:', num_items) print('Have:', num_items)
if num_items: if num_items >= minimum:
print('Skipping') print('Skipping')
continue continue
else: else:
@ -1843,12 +1844,21 @@ class SellToVillagerStates:
print('Interacting with villager') print('Interacting with villager')
self.g.game.interact(self.villager.entity_id) self.g.game.interact(self.villager.entity_id)
self.g.game.animate() self.g.game.animate()
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 self.state = self.choose_trade
def choose_trade(self): def choose_trade(self):
g = self.g.game g = self.g.game
if not self.g.window or not self.g.trades: if not self.g.window or not self.g.trades:
print('Didnt get a trade window, aborting')
self.state = self.cleanup
return return
for trade_num, trade in enumerate(self.g.trades): for trade_num, trade in enumerate(self.g.trades):
@ -1856,26 +1866,40 @@ class SellToVillagerStates:
in_num = trade.input_item_1.item_count in_num = trade.input_item_1.item_count
out_id = trade.output_item.item_id 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 continue
print('Checking trade #', trade_num)
if trade.trade_disabled: if trade.trade_disabled:
print('Trade disabled, skipping')
continue continue
if out_id != items.EMERALD_ID: if out_id != items.EMERALD_ID:
print('Not for emeralds, skipping')
continue
if price > in_num:
print('Trade in demand, skipping')
continue continue
print('Found trade: #', trade_num, trade) print('Found trade:', trade)
print('Adjusted price:', price)
self.trade = trade self.trade = trade
self.trade_num = trade_num self.trade_num = trade_num
self.state = self.click_trade self.state = self.click_trade
break break
else: else:
print('Villager has been spent, aborting') print('Villager has been spent, aborting')
self.g.game.close_window()
self.spent_villagers.append(self.villager) self.spent_villagers.append(self.villager)
self.state = self.cleanup self.state = self.wait
self.wait_time = 10
return return
def click_trade(self): def click_trade(self):
print('Clicking trade')
self.g.item_lock = True self.g.item_lock = True
self.g.game.select_trade(self.trade_num) self.g.game.select_trade(self.trade_num)
self.state = self.execute_trade self.state = self.execute_trade
@ -1887,43 +1911,28 @@ class SellToVillagerStates:
w = self.g.window w = self.g.window
w_info = mcdata.WINDOWS[w.data.window_type] w_info = mcdata.WINDOWS[w.data.window_type]
slot_num = w_info.output slot_num = w_info.output
slot = w.contents[slot_num]
self.g.item_lock = True if slot_num in w.contents:
print('Executing trade')
slot = w.contents[slot_num]
self.g.game.click_window(slot_num, 0, 1, slot) self.g.game.click_window(slot_num, 0, 1, slot)
self.g.game.close_window() else:
print('Bad trade, aborting')
self.state = self.end_trade self.state = self.end_trade
def end_trade(self): def end_trade(self):
if self.g.item_lock: print('Trading complete')
return self.g.game.close_window()
self.wait_time = 1
self.state = self.wait_for_trade
print('Trade completed.') def wait_for_trade(self):
if self.wait_time > 0:
self.wait_time -= utils.TICK
else:
self.state = self.interact_villager 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(self): def wait(self):
if self.wait_time > 0: if self.wait_time > 0:
self.wait_time -= utils.TICK self.wait_time -= utils.TICK
@ -2010,7 +2019,7 @@ class JobStates:
self.sleep_with_bed_states.silent = True self.sleep_with_bed_states.silent = True
self.cache_items_states.silent = True self.cache_items_states.silent = True
self.grab_supplies_states.supplies = { self.grab_supplies_states.supplies = {
tuple(items.SHOVEL_IDS): 9 tuple(items.SHOVEL_IDS): (1, 9),
} }
return machines return machines
@ -2050,7 +2059,7 @@ class JobStates:
self.sleep_with_bed_states.silent = True self.sleep_with_bed_states.silent = True
self.cache_items_states.silent = True self.cache_items_states.silent = True
self.grab_supplies_states.supplies = { self.grab_supplies_states.supplies = {
tuple(items.AXE_IDS): 9, tuple(items.AXE_IDS): (1, 9),
} }
return machines return machines
@ -2091,7 +2100,7 @@ class JobStates:
item = items.ITEMS['minecraft:'+name]['protocol_id'] item = items.ITEMS['minecraft:'+name]['protocol_id']
self.grab_supplies_states.supplies = { self.grab_supplies_states.supplies = {
tuple([item]): 0, tuple([item]): (1, 0),
} }
return machines return machines
@ -2106,16 +2115,16 @@ class JobStates:
def trade(self): def trade(self):
machines = [ machines = [
#self.grab_supplies_states, self.grab_supplies_states,
self.sell_to_villager, self.sell_to_villager,
#self.sleep_with_bed_states, self.sleep_with_bed_states,
#self.eat_food_states, self.eat_food_states,
#self.cache_items_states, self.cache_items_states,
] ]
self.sleep_with_bed_states.silent = True self.sleep_with_bed_states.silent = True
self.cache_items_states.silent = True self.cache_items_states.silent = True
self.grab_supplies_states.supplies = { self.grab_supplies_states.supplies = {
tuple(items.AXE_IDS): 9, tuple([items.PUMPKIN_ID]): (64, 9),
} }
return machines return machines