Improve trading villager selection based on profession

This commit is contained in:
Tanner Collin 2021-05-01 21:31:21 +00:00
parent 080895421d
commit a87cc85eab
9 changed files with 82 additions and 15 deletions

View File

@ -71,7 +71,7 @@ def main():
event_handler.on_any_event = reload_bot event_handler.on_any_event = reload_bot
observer = Observer() observer = Observer()
observer.schedule(event_handler, '.', recursive=True) observer.schedule(event_handler, 'mosfet', recursive=True)
observer.start() observer.start()
try: try:

View File

@ -393,6 +393,13 @@ class Game:
obj.item_id = entry.value.item_id obj.item_id = entry.value.item_id
obj.item_count = entry.value.item_count obj.item_count = entry.value.item_count
mob = self.g.mobs.get(packet.entity_id, None)
if mob:
for entry in packet.metadata:
if mob.type == mobs.VILLAGER:
if entry.index == 17:
mob.profession = entry.value[1]
player = self.g.players.get(packet.entity_id, None) player = self.g.players.get(packet.entity_id, None)
if player: if player:
return return

View File

@ -103,6 +103,7 @@ WHEAT_ID = get_id('wheat')
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') PUMPKIN_ID = get_id('pumpkin')
BEETROOT_ID = get_id('beetroot')
EMERALD_ID = get_id('emerald') EMERALD_ID = get_id('emerald')
BERRIES_ID = get_id('sweet_berries') BERRIES_ID = get_id('sweet_berries')

View File

@ -1,8 +1,33 @@
from mosfet.info import items
import json import json
with open('minecraft_data/registries.json') as f: with open('minecraft_data/registries.json') as f:
MOBS = json.load(f)['minecraft:entity_type']['entries'] MOBS = json.load(f)['minecraft:entity_type']['entries']
VILLAGER = 93
ARMORER = 1
BUTCHER = 2
CARTOGRAPHER = 3
CLERIC = 4
FARMER = 5
FISHERMAN = 6
FLETCHER = 7
LEATHERWORKER = 8
LIBRARIAN = 9
MASON = 10
NITWIT = 11
SHEPHERD = 12
TOOLSMITH = 13
WEAPONSMITH = 14
TRADES = {
ARMORER: [items.IRON_INGOT_ID],
BUTCHER: [items.BERRIES_ID],
FARMER: [items.PUMPKIN_ID, items.WHEAT_ID, items.POTATO_ID, items.CARROT_ID, items.BEETROOT_ID],
TOOLSMITH: [items.IRON_INGOT_ID],
WEAPONSMITH: [items.IRON_INGOT_ID],
}
EVIL = [ EVIL = [
'blaze', 'blaze',
'cave_spider', 'cave_spider',

View File

@ -235,6 +235,8 @@ class JobStates:
tuple([items.IRON_INGOT_ID]): (64, 3), tuple([items.IRON_INGOT_ID]): (64, 3),
tuple([items.WHEAT_ID]): (64, 3), tuple([items.WHEAT_ID]): (64, 3),
tuple([items.POTATO_ID]): (64, 3), tuple([items.POTATO_ID]): (64, 3),
tuple([items.CARROT_ID]): (64, 3),
tuple([items.BEETROOT_ID]): (64, 3),
} }
items.set_needed(set([ items.set_needed(set([
@ -243,6 +245,8 @@ class JobStates:
items.IRON_INGOT_ID, items.IRON_INGOT_ID,
items.WHEAT_ID, items.WHEAT_ID,
items.POTATO_ID, items.POTATO_ID,
items.CARROT_ID,
items.BEETROOT_ID,
])) ]))
return machines return machines

View File

@ -102,7 +102,10 @@ class GrabSuppliesStates:
print('No path, blacklisting barrel') print('No path, blacklisting barrel')
time.sleep(0.1) time.sleep(0.1)
self.bad_barrels.append(self.barrel) self.bad_barrels.append(self.barrel)
self.state = self.choose_barrel if len(self.bad_barrels) > 3:
self.state = self.cleanup
else:
self.state = self.choose_barrel
def going_to_barrel(self): def going_to_barrel(self):
if utils.pint(self.g.pos) == self.opening: if utils.pint(self.g.pos) == self.opening:

View File

@ -31,8 +31,29 @@ class SellToVillagerStates:
for v in w.find_villagers(p, 100): for v in w.find_villagers(p, 100):
print('Found villager:', v) print('Found villager:', v)
if v not in self.bad_villagers and v not in self.spent_villagers:
break if v in self.bad_villagers:
print('In bad villager list')
continue
if v in self.spent_villagers:
print('In spent villager list')
continue
if 'profession' not in v:
print('Villager has unknown profession')
continue
if v.profession not in mobs.TRADES:
print('Villager doesnt sell stuff we collect')
continue
trades = mobs.TRADES[v.profession]
if not self.g.game.count_items(trades):
print('We dont have anything to sell him')
continue
break
else: # for else: # for
print('No good villagers left, aborting.') print('No good villagers left, aborting.')
self.spent_villagers = [] self.spent_villagers = []
@ -59,7 +80,7 @@ class SellToVillagerStates:
if self.villager not in self.good_villagers: if self.villager not in self.good_villagers:
self.bad_villagers.append(self.villager) self.bad_villagers.append(self.villager)
print('Added to bad villager list') print('Added to bad villager list')
self.state = self.cleanup self.state = self.find_villager
return return
navpath = w.path_to_place(p, self.openings[0]) navpath = w.path_to_place(p, self.openings[0])
@ -144,8 +165,7 @@ class SellToVillagerStates:
print('Villager has been spent, aborting') print('Villager has been spent, aborting')
self.g.game.close_window() self.g.game.close_window()
self.spent_villagers.append(self.villager) self.spent_villagers.append(self.villager)
self.state = self.wait self.state = self.find_villager
self.wait_time = 10
return return
def click_trade(self): def click_trade(self):

View File

@ -304,7 +304,7 @@ class EntityMetadataPacket(Packet):
self.metadata = [] self.metadata = []
for _ in range(99): for _ in range(99):
entry = Entry.read(file_object, self.context) entry = Entry.read(file_object, self.context)
if not entry: break if not entry: break # hit an unimplemented type, stops parsing
self.metadata.append(entry) self.metadata.append(entry)

View File

@ -141,7 +141,7 @@ class Slot(Type):
class Entry(Type): class Entry(Type):
types = { simple_types = {
0: Byte, 0: Byte,
1: VarInt, 1: VarInt,
2: Float, 2: Float,
@ -169,12 +169,19 @@ class Entry(Type):
index = UnsignedByte.read(file_object) index = UnsignedByte.read(file_object)
if index == 0xff: return None if index == 0xff: return None
type = VarInt.read(file_object) type = VarInt.read(file_object)
try:
value = Entry.types[type].read(file_object) if type == 10: # optional position
except TypeError: present = Boolean.read(file_object)
value = Entry.types[type].read_with_context(file_object, context) value = Position.read_with_context(file_object, context) if present else None
except KeyError: elif type == 16: # villager data
return None value = (VarInt.read(file_object), VarInt.read(file_object), VarInt.read(file_object))
else:
try:
value = Entry.simple_types[type].read(file_object)
except TypeError:
value = Entry.simple_types[type].read_with_context(file_object, context)
except KeyError:
return None # unimplemented data type, stops parsing entries
return Entry(index, type, value) return Entry(index, type, value)