forked from mcedit/pymclevel
-
Notifications
You must be signed in to change notification settings - Fork 1
/
entity.py
112 lines (93 loc) · 2.81 KB
/
entity.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
'''
Created on Jul 23, 2011
@author: Rio
'''
from mclevelbase import *
__all__ = "Entity, TileEntity".split(", ")
id = "id"
Motion = "Motion"
Pos = "Pos"
Rotation = "Rotation"
class TileEntity(object):
knownIDs = "Furnace, Sign, MonsterSpawner, Chest, Music, Trap, RecordPlayer".split(", ")
baseStructures = {
"Furnace": (
("BurnTime", TAG_Short),
("CookTime", TAG_Short),
("Items", TAG_List),
),
"Sign": (
("Items", TAG_List),
),
"MobSpawner": (
("Items", TAG_List),
),
"Chest": (
("Items", TAG_List),
),
"Music": (
("note", TAG_Byte),
),
"Trap": (
("Items", TAG_List),
),
"RecordPlayer": (
("Record", TAG_Int),
),
}
maxItems = {
"Furnace" : 3,
"Chest" : 27,
"Trap" : 9,
}
@classmethod
def Create(cls, tileEntityID, **kw):
tileEntityTag = TAG_Compound()
tileEntityTag[id] = TAG_String(tileEntityID)
base = cls.baseStructures.get(tileEntityID, None)
if base:
for (name, tag) in base:
tileEntityTag[name] = tag()
cls.setpos(tileEntityTag, (0, 0, 0))
return tileEntityTag
@classmethod
def pos(cls, tag):
return [tag[a].value for a in 'xyz']
@classmethod
def setpos(cls, tag, pos):
for a, p in zip('xyz', pos):
tag[a] = TAG_Int(p)
@classmethod
def copyWithOffset(cls, tileEntity, copyOffset):
eTag = deepcopy(tileEntity)
eTag['x'] = TAG_Int(tileEntity['x'].value + copyOffset[0])
eTag['y'] = TAG_Int(tileEntity['y'].value + copyOffset[1])
eTag['z'] = TAG_Int(tileEntity['z'].value + copyOffset[2])
return eTag
class Entity(object):
@classmethod
def Create(cls, entityID, **kw):
entityTag = TAG_Compound()
entityTag[id] = TAG_String(entityID)
Entity.setpos(entityTag, (0, 0, 0))
return entityTag
@classmethod
def pos(cls, tag):
if Pos not in tag:
raise InvalidEntity, tag
return [a.value for a in tag[Pos]]
@classmethod
def setpos(cls, tag, pos):
tag["Pos"] = TAG_List([TAG_Double(p) for p in pos])
@classmethod
def copyWithOffset(cls, entity, copyOffset):
eTag = deepcopy(entity)
positionTags = map(lambda p, co: nbt.TAG_Double(p.value + co), eTag["Pos"], copyOffset)
eTag["Pos"] = TAG_List(positionTags)
if eTag["id"].value == "Painting":
eTag["TileX"].value += copyOffset[0]
eTag["TileY"].value += copyOffset[1]
eTag["TileZ"].value += copyOffset[2]
return eTag
class InvalidEntity(ValueError): pass
class InvalidTileEntity(ValueError): pass