Buy NPC Items

Requires 23.3.0+. The client will crash because it does not know which NPC you’re in so it cannot add the item to your inventory.

from phBot import *
import struct

def get_npc(name):
	npcs = get_npcs()
	for k, v in npcs.items():
		if v['name'].strip().lower() == name.strip().lower() or v['servername'].strip().lower() == name.strip().lower():
			return (k, v)
	return None

def get_npc_item(model, item):
	goods = get_npc_goods(model)
	if goods:
		for p, s in goods.items():
			for _s, i in s.items():
				if i['name'].strip().lower() == item.strip().lower() or i['servername'].strip().lower() == item.strip().lower():
					return (p, _s)
	return None

def npc_select(args):
	if len(args) == 2:
		n = get_npc(args[1])
		if n:
			inject_joymax(0x7045, struct.pack('I', n[0]), False)
			return 2000
	return 0

def npc_enter(args):
	if len(args) == 2:
		n = get_npc(args[1])
		if n:
			inject_joymax(0x7046, struct.pack('IB', n[0], 1), False)
			return 2000
	return 0

def npc_buy(args):
	if len(args) == 4:
		n = get_npc(args[1])
		if n:
			goods = get_npc_item(n[1]['model'], args[2])
			if goods:
				packet = struct.pack('B', 8)
				packet += struct.pack('B', goods[0]) 		# page
				packet += struct.pack('B', goods[1]) 		# slot
				packet += struct.pack('H', int(args[3]))	# quantity
				packet += struct.pack('I', n[0]) 			# npc
				inject_joymax(0x7034, packet, False)
				return 2000
	return 0

def npc_exit(args):
	if len(args) == 2:
		n = get_npc(args[1])
		if n:
			inject_joymax(0x704B, struct.pack('I', n[0]), False)
			return 2000
	return 0

log('[%s] Loaded' % __name__)

Script usage:

npc_select,Potion Merchant Manina
npc_enter,Potion Merchant Manina
npc_buy,Potion Merchant Manina,HP Recovery Potion (Medium),1
npc_exit,Potion Merchant Manina