Skip to content

Instantly share code, notes, and snippets.

@Arcensoth
Created December 10, 2016 07:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Arcensoth/25bea82f9d2b6ee91c075ec04cb3f289 to your computer and use it in GitHub Desktop.
Save Arcensoth/25bea82f9d2b6ee91c075ec04cb3f289 to your computer and use it in GitHub Desktop.
# Feel free to modify and use this filter however you wish. If you do,
# please give credit to SethBling.
# http://youtube.com/SethBling
#
''' Fixed for MC 1.8 by Rezzing, September 6, 2014
PLEASE READ: The unusable trade won't prevent new trades anymore but I
solved it by adding a very high career level. So only use it if you like
the fancy stop sign. '''
# Reedited by DragonQuiz, November 8, 2014
#
# Changes: ^denotes new change
# 1) Allow your villager to move or not.
# 2) Rename your villager in MCEdit.
# 3) Allow players to receive experience for their trade.
# 4) Updated more of the code, made it much prettier.
# 5) Added rotation so the villager *can rotate* when possible.
# And a big thanks to Sethbling for creating this filter and all his other filters at http://sethbling.com/downloads/mcedit-filters/
#
# [V4] Updated by Arcensoth on December 10, 2016 with the following changes:
# - added rudimentary version tag to filter name
# - added a toggle to enable/disable villager nametag, checked by default
# - when unchecked, NBT tags CustomNameVisible and CustomName are not added
from pymclevel import TAG_Byte, TAG_Short, TAG_Int, TAG_Compound, TAG_List, TAG_String, TAG_Double, TAG_Float
displayName = "Create Shops V4"
Professions = {
"Farmer (brown)": 0,
"Librarian (white)": 1,
"Priest (purple)": 2,
"Blacksmith (black apron)": 3,
"Butcher (white apron)": 4,
"Villager (green)": 5,
}
ProfessionKeys = ()
for key in Professions.keys():
ProfessionKeys += (key,)
CustomHeads = {
"Skeleton Skull": 0,
"Wither Skeleton Skull": 1,
"Zombie Skull": 2,
"Player Skull": 3,
"Creeper Skull": 4
}
HeadsKeys = ()
for key in CustomHeads.keys():
HeadsKeys += (key,)
inputs = [(("Trade", "title"),
("This is a modified version of SethBling's Create Shops filter at DragonQuiz's request", "label"),
("Profession", ProfessionKeys),
("Add Stopping Trade", True),
("Invulnerable Villager", True),
("Make Unlimited Trades", True),
("Give Experience per a Trade", True),
("Make Villager not Move", False),
("Make Villager Silent", False),
("Villager Name", ("string", "width=250")),
("Use Villager Name", True)),
(("Rotation", "title"),
(" Rotate the Position of your Trader\n"
"*Can only be used if Not Move is checked*", "label"),
("Y-Axis", (0, -180, 180)),
("Changes its body rotation. Due west is 0. Must be between -180 to 180 degrees.", "label"),
("X-Axis", (0, -90, 90)),
(
"Changes the head rotation Horizontal is 0. Positive values look downward. Must be between -90 to 90 degrees",
"label"),
),
(("Head", "title"),
("Choose a custom head for the villagers you make", "label"),
("Custom Head", False),
("Legacy Mode (Pre 1.9)", False),
("Skull Type", HeadsKeys),
("", "label"),
("If Player Skull", "label"),
("Player's Name", ("string", "width=250"))),
(("Notes", "title"),
("To create a shop first put your buy in the top slot(s) of the chest.\n"
"Second put a second buy in the middle slot(optional).\n"
"Third put a sell in the bottom slot.\n"
"Click the chest you want and choose what you want and click hit enter\n"
"*All items must be in the same row*\n"
, "label"))
]
def perform(level, box, options):
# Redefine Professions and CustomHeads with translated data
profs = {}
global Professions
for k, v in Professions.items():
profs[trn._(k)] = v
Professions = profs
cust_heads = {}
global CustomHeads
for k, v in CustomHeads.items():
cust_heads[trn._(k)] = v
CustomHeads = cust_heads
#
emptyTrade = options["Add Stopping Trade"]
invincible = options["Invulnerable Villager"]
unlimited = options["Make Unlimited Trades"]
xp = options["Give Experience per a Trade"]
nomove = options["Make Villager not Move"]
silent = options["Make Villager Silent"]
name = options["Villager Name"]
use_name = options["Use Villager Name"]
yaxis = options["Y-Axis"]
xaxis = options["X-Axis"]
IsCustomHead = options["Custom Head"]
SkullType = options["Skull Type"]
legacy = options["Legacy Mode (Pre 1.9)"]
PlayerName = options["Player's Name"]
for (chunk, slices, point) in level.getChunkSlices(box):
for e in chunk.TileEntities:
x = e["x"].value
y = e["y"].value
z = e["z"].value
if (x, y, z) in box:
if e["id"].value in ("Chest", "minecraft:chest"):
createShop(level, x, y, z, emptyTrade, invincible, Professions[options["Profession"]], unlimited,
xp, nomove, silent, name, use_name, yaxis, xaxis, IsCustomHead, legacy, CustomHeads[SkullType], PlayerName)
def createShop(level, x, y, z, emptyTrade, invincible, profession, unlimited, xp, nomove, silent, name, use_name, yaxis, xaxis, IsCustomHead, legacy, SkullType, PlayerName):
chest = level.tileEntityAt(x, y, z)
if chest is None:
return
priceList = {}
priceListB = {}
saleList = {}
for item in chest["Items"]:
slot = item["Slot"].value
if 0 <= slot <= 8:
priceList[slot] = item
elif 9 <= slot <= 17:
priceListB[slot - 9] = item
elif 18 <= slot <= 26:
saleList[slot - 18] = item
villager = TAG_Compound()
villager["PersistenceRequired"] = TAG_Byte(1)
villager["OnGround"] = TAG_Byte(1)
villager["Air"] = TAG_Short(300)
villager["AttackTime"] = TAG_Short(0)
villager["DeathTime"] = TAG_Short(0)
villager["Fire"] = TAG_Short(-1)
villager["Health"] = TAG_Short(20)
villager["HurtTime"] = TAG_Short(0)
villager["Age"] = TAG_Int(0)
villager["Profession"] = TAG_Int(profession)
villager["Career"] = TAG_Int(1)
villager["CareerLevel"] = TAG_Int(1000)
villager["Riches"] = TAG_Int(200)
villager["FallDistance"] = TAG_Float(0)
if use_name:
villager["CustomNameVisible"] = TAG_Byte(1)
villager["CustomName"] = TAG_String(name)
villager["Invulnerable"] = TAG_Byte(invincible)
villager["NoAI"] = TAG_Byte(nomove)
villager["id"] = TAG_String("Villager")
villager["Motion"] = TAG_List([TAG_Double(0.0), TAG_Double(0.0), TAG_Double(0.0)])
villager["Pos"] = TAG_List([TAG_Double(x + 0.5), TAG_Double(y), TAG_Double(z + 0.5)])
villager["Rotation"] = TAG_List([TAG_Float(yaxis), TAG_Float(xaxis)])
villager["Willing"] = TAG_Byte(0)
villager["Offers"] = TAG_Compound()
villager["Offers"]["Recipes"] = TAG_List()
if silent:
villager["Silent"] = TAG_Byte(1)
else:
villager["Silent"] = TAG_Byte(0)
for i in range(9):
if (i in priceList or i in priceListB) and i in saleList:
offer = TAG_Compound()
if xp:
offer["rewardExp"] = TAG_Byte(1)
else:
offer["rewardExp"] = TAG_Byte(0)
if unlimited:
offer["uses"] = TAG_Int(0)
offer["maxUses"] = TAG_Int(2000000000)
else:
offer["uses"] = TAG_Int(0)
offer["maxUses"] = TAG_Int(1)
if i in priceList:
offer["buy"] = priceList[i]
if i in priceListB:
if i in priceList:
offer["buyB"] = priceListB[i]
else:
offer["buy"] = priceListB[i]
offer["sell"] = saleList[i]
villager["Offers"]["Recipes"].append(offer)
if emptyTrade:
offer = TAG_Compound()
offer["buy"] = TAG_Compound()
offer["buy"]["Count"] = TAG_Byte(1)
offer["buy"]["Damage"] = TAG_Short(0)
offer["buy"]["id"] = TAG_String("minecraft:barrier")
offer["sell"] = TAG_Compound()
offer["sell"]["Count"] = TAG_Byte(1)
offer["sell"]["Damage"] = TAG_Short(0)
offer["sell"]["id"] = TAG_String("minecraft:barrier")
villager["Offers"]["Recipes"].append(offer)
if IsCustomHead:
Head = TAG_Compound()
Head["id"] = TAG_String("minecraft:skull")
Head["Damage"] = TAG_Short(SkullType)
if SkullType == 3 and PlayerName:
Head["tag"] = TAG_Compound()
Head["tag"]["SkullOwner"] = TAG_String(PlayerName)
Head["Count"] = TAG_Short(1)
if legacy == True:
villager["Equipment"] = TAG_List([TAG_Compound(), TAG_Compound(), TAG_Compound(),TAG_Compound(), Head],)
else:
villager["ArmorItems"] = TAG_List([TAG_Compound(), TAG_Compound(), TAG_Compound(), Head])
level.setBlockAt(x, y, z, 0)
chunk = level.getChunk(x / 16, z / 16)
chunk.Entities.append(villager)
chunk.TileEntities.remove(chest)
chunk.dirty = True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment