【中英对译】MCEdit 2 Documentation(2)

文档源地址:https://mcedit2.readthedocs.io/en/latest/
基于百度翻译的翻译结果逐句核对修改。
MCEdit 2 Plugin Development
MCEdit 2插件开发
A plugin for MCEdit 2 is a Python module that defines one or more Plugin classes and then registers them with MCEdit. These classes are instantiated once for each Editor Session and called on by MCEdit in response to various user actions.
mcedit 2的插件是一个python模块,它定义一个或多个插件类,然后将它们注册到mcedit。这些类为每个编辑器会话实例化一次,并由mcedit响应各种用户操作调用。
·Plugin basics 插件基础
··Plugin Structure 插件结构
··Undo History 撤消历史记录
··Registering Plugin Classes 正在注册插件类
·Plugin Tasks 插件任务
··World Dimensions 世界维度
··Editing Blocks 编辑块
··Editing Entities 编辑实体
··Creating entities 创建实体
·Types of plugins 插件类型
··Command Plugins 命令插件
··Simple Commands 简单命令
···Simple Command Inputs 简单命令输入
····Input Types 输入类型
··Tool Plugins 工具插件
···Mouse Handlers 鼠标处理程序
··Brush Shape Plugins 画笔形状插件
···As a boolean array 作为布尔数组
···As a Selection object 作为选择对象
·Plugin Examples 插件示例
··Simple Options 简单选项
··World Editing 世界编辑

Types of plugins 插件类型
Command Plugins are the simplest kind of plugin and the most similar to MCEdit 1 “filter” plugins. A command plugin adds a new menu item to the “Plugins” menu which calls the plugin’s code when selected. Command plugins are free to edit the world and to display windows, dialog boxes, and other UI elements.
命令插件是最简单的插件类型,与MCEdit 1的“filter”插件最相似。一个命令插件将一个新的菜单项添加到“插件”菜单中,该菜单在被选中时调用插件的代码。命令插件可以自由编辑世界并显示窗口、对话框和其他UI元素。
Tool Plugins are a way to add new editor tools. Each editor tool will display a panel of options while it is selected, and will respond to mouse actions within the world view such as clicking and dragging. Tool plugins are free to edit the world and to display windows, dialog boxes, and other UI elements. Before creating a Tool plugin, consider if what you want to accomplish can be done using a Brush Mode Plugins instead.
工具插件是添加新编辑器工具的一种方法。每个编辑器工具在被选中时将显示一个选项面板,并响应世界视图中的鼠标操作,如单击和拖动。工具插件可以自由编辑世界并显示窗口、对话框和其他UI元素。在创建工具插件之前,请考虑您想要完成的工作是否可以使用画笔模式插件来完成。
Brush Shape Plugins are used to provide new shapes for use with the Brush and Selection tool (and any other tools that may ask the user to choose a shape). Shape plugins may not edit the world and may only return a SelectionBox object that defines the shape.
画笔形状插件用于提供新的形状,以便与“画笔”和“选择”工具(以及任何其他可能要求用户选择形状的工具)一起使用。形状插件不能编辑世界,只能返回定义形状的SelectionBox对象。
Brush Mode Plugins are used to provide new actions for use with the Brush tool. For instance, you could make a Brush Mode that sets the name of any entity within the affected area to “Dinnerbone”. Brush modes are expected to edit the world, and since the undo-history is managed by the Brush tool, you do not need to manage it yourself.
画笔模式插件用于为“画笔”工具提供新的操作。例如,可以创建一个“画笔模式”,将受影响区域内的任何实体的名称设置为“Dinnerbone”。画笔模式可以编辑世界,由于撤消历史由画笔工具管理,因此您不需要自己管理它。
Inspector Plugins are used to create user interfaces for editing entities and tile entities. Since inspectors for all of the base Minecraft entities are included with MCEdit, this plugin type is intended for adding support for Minecraft mods. For instance, a plugin for inspecting chests from the IronChests mod would inherit from the base Chest inspector and change the number of slots in the chest.
检查器插件用于创建用于编辑实体和Tile实体的用户界面。由于所有基础Minecraft实体的检查器都包含在MCEdit中,因此此插件类型旨在添加对Minecraft mods的支持。例如,一个用于检查来自铁箱mod的箱子的插件将继承自基本的箱子检查器,并更改箱子中的槽数。
Tile Entity Plugins are a low-level plugin that does not directly interact with the user. These plugins provide TileEntityRef classes that wrap the underlying NBT structures for tile entities and may add meaning to numerical constants, validate tag types, or expose ItemStacks that are stored in a nonstandard manner. These plugins are expected to accompany the Inspector plugins for mod-added tile entities.
Tile实体插件是一个低级插件,不直接与用户交互。这些插件提供TileEntityRef类,这些类包装Tile实体的基础NBT结构,并可能为以非标准方式存储的数字常量、验证标记类型或公开物品堆栈添加含义。这些插件将与Inspector插件一起用于mod添加的 Tile实体。
The future of Generate Plugins is uncertain.
生成插件的未来是不确定的。
·Command Plugins 命令插件
·Simple Commands 简单命令
··Simple Command Inputs 简单命令输入
···Input Types 输入类型
·Tool Plugins 工具插件
··Mouse Handlers 鼠标处理程序
·Brush Shape Plugins 画笔形状插件
··As a boolean array 作为布尔数组
··As a Selection object 作为选择对象
Command Plugins 命令插件
A command plugin will add a new menu command to the application’s Plugins menu, and call a specified function when the menu command is selected. This is the simplest and most straightforward type of plugin, and is the most similar to MCEdit 1.0’s “filter” plugins.
命令插件将向应用程序的插件菜单添加新的菜单命令,并在菜单命令被选择时调用指定的函数。这是最简单和最直接的插件类型,与MCEdit1.0的“过滤器”插件最相似。
To define a command plugin, create a class that inherits from CommandPlugin. Implement the __init__ function to call self.addMenuItem for each user-selectable command, and also implement the functions that correspond to each menu item.
要定义一个命令插件,请创建从CommandPlugin继承的类。实现__init__函数,为每个用户可选择的命令调用self.addMenuItem,并实现与每个菜单项对应的功能。
A basic command plugin:
一个基本命令插件:
from mcedit2.plugins import registerPluginCommand, CommandPluginfrom PySide import QtGui
@registerPluginCommandclass ExampleCommand(CommandPlugin):
def __init__(self, editorSession):
super(ExampleCommand, self).__init__(editorSession)
self.addMenuItem("Example Command", self.perform)
def perform():
dimension = self.editorSession.currentDimension
chunkCount = dimension.chunkCount()
QtGui.QMessageBox.information(None, # messagebox parent (None for app-modal)
"Example Command", # messagebox title
"The Example Command was successful. " # messagebox text
"The current dimension contains "
"%d chunks") % chunkCount)
You can do nearly anything you want in the perform() function. The currently edited dimension can be accessed as self.editorSession.currentDimension. See plugin_tasks for an overview of the dimension object. If you need to modify the world, be sure to read undo-history first.
在perform()函数中,您几乎可以执行任何操作。当前被编辑的维度可以作为self.editorSession.currentDimension访问。有关维度对象的概述,请参见plugin_tasks。如果您需要修改世界,请务必先阅读undo-history(撤消历史记录)。
Simple Commands 简单命令
MCEdit 1.0’s “filter” plugins all follow the same pattern: They prompt the user for some inputs, and then call a perform() function which is given the current world, the current selection, and the inputs provided by the user. SimpleCommandPlugin fills the same role in MCEdit 2.0.
MCEdit 1.0的“filter”插件都遵循相同的模式:它们提示用户输入一些信息,然后调用一个perform()函数,该函数给出当前世界、当前选择以及用户提供的输入。SimpleCommandPlugin在MCEdit 2.0中扮演相同的角色。
This class automatically adds a menu item to the Plugins menu. When the item is chosen, it opens a dialog box with a list of options defined by the class; when the user presses “OK”, it calls a perform() function with those same arguments. The options to present are defined by a Python data structure, making it possible to create a simple UI for your plugin without having to learn any of Qt’s UI widgets.
此类会自动将菜单项添加到“插件”菜单中。当该项被选择时,它将打开一个对话框,其中包含由类定义的选项列表;当用户按“确定”时,它将使用这些相同的参数调用perform()函数。要显示的选项是由一个Python数据结构定义的,这样就可以为您的插件创建一个简单的UI,而无需学习Qt的任何UI部件。
SimpleCommandPlugin also manages the undo history automatically. There is no need to call beginCommand() here, and to do so is an error.
SimpleCommandPlugin还自动管理撤消历史记录。这里不需要调用beginCommand(),这样做是一个错误。
A minimal SimpleCommandPlugin:
一个最小的SimpleCommandPlugin:
from mcedit2.plugins import registerPluginCommand, SimpleCommandPlugin
@registerPluginCommandclass SimpleOptionsDemo(SimpleCommandPlugin):
displayName = "Simple Options Demo"
options = [
{
'type': 'int',
'value': 0,
'min': 0,
'max': 100,
'name': 'myIntOption',
'text': 'Integer Option: ',
},
]
def perform(self, dimension, selection, options):
print("Option value: %d" % options['myIntOption'])
print("Selection volume: %s" % selection.volume)
print("Chunks in dimension: %d" % dimension.chunkCount())
This plugin will display a dialog with a single integer input, and print the value from that input to the console along with info about the current selection and dimension.
这个插件将显示一个带有单个整数输入的对话框,并将该输入以及当前选择和维度的信息打印到控制台。
Simple Command Inputs 简单命令输入
Each element in the plugin’s options list is a dict that defines a single input. All
option elements must have at least these keys:
插件的options(选项)列表中的每个元素都是定义单个输入的dict。所有选项元素必须至少具有以下键:
·type: Defines which kind of input to create.
·类型:定义要创建的输入类型。
·name: The internal name for this input. You will use this to access the input’s value, and MCEdit will use it to automatically save the last used value.
·名称:此输入的内部名称。您将使用它来访问输入的值,MCEdit会使用它自动保存上次使用的值。
·text: The caption to display alongside this input. Should describe what the input does.
·文本:显示在此输入旁边的标题。应该描述输入的作用。
·value: An initial value to show in the input. Optional.
·值:要在输入中显示的初始值。可选。
Further keys are available depending on the type of input.
根据输入的类型,还可以使用其他键。
Input Types 输入类型
·type="int": A numeric input for integer values, within the range +/- two billion or so. If both the min and max keys are given, also creates a slider for selecting a value from within this range
·type="int": 整数值的数值输入,在+/-20亿左右的范围内。如果同时给出了“最小”和“最大”键,还会创建一个用于从该范围内选择一个值的滑块。
··min: Minimum allowed value. Optional.
··min:最小允许值。可选。
··max: Maximum allowed value. Optional.
··max:最大允许值。可选。
·type="float": Identical to the int input, but provides a floating point value (within the range allowed by double-precision floating point). If both the min and max keys are given, also creates a slider for selecting a value from within this range
·type="float":与int输入相同,但提供一个浮点值(在双精度浮点允许的范围内)。如果同时给出了“最小”和“最大”键,也会创建一个用于从该范围内选择一个值的滑块。
··min: Minimum allowed value. Optional.
··min:最小允许值。可选。
··max: Maximum allowed value. Optional.
··max:最大允许值。可选。
·type="bool": A checkbox that can be either on or off.
·type=“bool”:可打开或关闭的复选框。
·type="text": A text field that can input a single line of text.
·type=“text”:可以输入一行文本的文本域。
··placeholder: Displays this text in a light grey color if the text field is empty. Optional.
··placeholder:如果文本域为空,则以浅灰色显示此文本。可选。
·type="choice": A pop-up menu that offers multiple choices for the user to select from. Each choice is associated with a value that you define in the element’s choices list. This is the value you will receive as this option’s value in the perform() function.
·type="choice":一个弹出菜单,为用户提供多种选择。每个选项都与您在元素的choices列表中定义的值关联。这是您将在perform() 函数中作为该选项的值接收的值。
··choices: A list of tuples of the form (text, value).
··选项:窗体的元组列表(文本、值)。
·type="blocktype": A button that allows the user to select a Minecraft block type.The option’s value will be a single BlockType instance that can be used with dimension.setBlock.
·type="blocktype":一个允许用户选择一个Minecraft方块类型的按钮。该选项的值将是一个可以与dimension.setBlock一起使用的单个BlockType实例。
··value: The block type that will initially be selected. This should be a block’s internal name, such as minecraft:grass.
··value: 最初被选择的方块类型。这应该是一个方块的内部名称,如minecraft:grass。
For examples of all possible simple command inputs, see the simple_options.py file in the plugins folder included with MCEdit.
有关所有可能的简单命令输入的示例,请参阅MCEdit附带的plugins文件夹中的simple_options.py文件。
Tool Plugins 工具插件
Tool Plugins allow the creation of new editor tools, which give the user new ways to interact with the world by clicking and dragging in the world viewport. Each tool plugin may provide an “options widget” which is shown in the tool options panel while the tool is selected. A tool plugin may implement mouse event handlers, which will recieve 3D coordinates in world space cooresponding to the mouse position.
工具插件允许创建新的编辑器工具,为用户提供了通过在“世界”视区中单击和拖动来与世界交互的新方法。每个工具插件都可以提供一个“选项部件”,当工具被选择时,该部件被显示在工具选项面板中。一个工具插件可以实现鼠标事件处理程序,它将在与鼠标位置相对应的世界空间中接收三维坐标。
A tool plugin may also provide a 3D mouse cursor in the form of a SceneNode. Alternately, a 2D mouse cursor may be implemented by calling QCursor functions in your implementations of toolActive and toolInactive
一个工具插件还可以提供SceneNode形式的3D鼠标光标。或者,可以通过在toolactive和toolinactive的实现中调用QCursor 函数来实现2D鼠标光标。
Mouse Handlers 鼠标处理程序
These mouse handlers are called in response to user actions. A simple tool may only
implement mousePress or mouseRelease, while a tool that also allows dragging or changes its cursor according to world position may also implement mouseDrag or mouseMove.
调用这些鼠标处理程序以响应用户操作。一个简单的工具可能只实现mousePress或mouseRelease,而一个允许根据世界位置拖动或更改其光标的工具也可能实现mouseDrag或mouseMove。
EditorTool.mousePress(event)[source]
Parameters:
event (QMouseEvent) – event has been augmented with these attributes: point, ray, blockPosition, blockFace
EditorTool.mouseMove(event)[source]
Parameters:
event (QMouseEvent) – event has been augmented
EditorTool.mouseDrag(event)[source]
Parameters:
event (QMouseEvent) – event has been augmented
EditorTool.mouseRelease(event)[source]
Parameters:
event (QMouseEvent) – event has been augmented
Brush Shape Plugins 画笔形状插件
A Brush Shape plugin adds a new option to the Brush and Select tools for choosing the shape of the tool. A shape plugin must return a Selection object that defines the range of blocks in the shape, and may provide a Widget object to present shape-specific options in the tool’s options panel.
画笔形状插件向“画笔和选择”工具添加了一个新选项,用于选择工具的形状。形状插件必须返回定义形状中方块范围的Selection对象,并且可以提供Widget对象以在工具的“选项”面板中显示该形状特定的选项。
Shape plugins must inherit from mcedit2.editortools.brush.shapes.BrushShape. There are two ways to implement the shape: as a function that returns a boolean array, or as a function that returns a new Selection object.
形状插件必须继承自mcedit2.editortools.brush.shapes.BrushShape。实现形状有两种方法:作为返回布尔数组的函数,或作为返回新Selection对象的函数。
The BrushShape instance must also have an ID member which is a string that uniquely identifies this brush shape, and must have a displayName member which is the shape’s human-readable name. It may also have an icon member which is an absolute path to an image file to display as the shape’s icon.
BrushShape实例还必须具有一个ID成员,该成员是唯一标识此画笔形状的字符串,并且必须具有一个displayName成员,该成员是此形状的人类可读名称。它也可能有一个icon成员,它是作为形状图标显示的图像文件的绝对路径。
As a boolean array 作为布尔数组
BrushShape.shapeFunc(blockPositions, selectionSize)[source]
Return a 3D boolean array for the blocks selected by this shape in a requested area.
返回请求区域中此形状所选方块的三维布尔数组。
(Note that numpy arrays have a ‘shape’ attribute which gives the length of the array along each dimension. Sorry for the confusion.)
(请注意,numpy数组有一个“shape”属性,它给出了数组沿每个维度的长度。不好意思弄混了。)
The coordinates of the blocks are given by blockPositions, which is a 4D array where the first axis has size 3 and represents the Y, Z, and X coordinates. The coordinates given are relative to the bounding box for this shape. The remaining 3 axes have the shape of the requested area.
方块的坐标由blockPositions给出,它是一个4d数组,其中第一个轴的大小为3,代表Y、Z和X坐标。给定的坐标与此形状的边界框有关。其余3个轴具有所请求区域的形状。
blockPositions may be separated into coordinate arrays by writing y, z, x = blockPositions.
blockPositions可以通过写y, z, x =blockPositions来分隔成坐标数组。
The size and shape of the array to return is given by the shapes of the arrays in blockPositions.
要返回的数组的大小和形状由位于blockPositions的数组的形状给出。
The size of the shape’s bounding box is given by selectionSize.
形状的边界框的大小由selectionSize给出。
Parameters:
·blockPositions (numpy.ndarray[ndims=4,dtype=float32]) – Coordinates of requested blocks relative to Shape’s bounding box.
·selectionSize ((int, int, int)) – Size of the Shape’s bounding box.
Returns:
mask – Boolean array of the same shape as blockPositions[0] where selected blocks are True
Return type:
numpy.ndarray[ndims=3,dtype=bool]
This is the simpler way of implementing a brush shape. When the shape is used, shapeFunc will be called repeatedly for each section of the selection. It will be passed the coordinates of each block in the selection, relative to the selection’s origin point, along with the full size of the selection. Using these values, you will compute and return a boolean array (of the same shape as the coordinate array) that indicates whether each block in the section should be selected.
这是实现画笔形状的更简单的方法。该形状被使用时,将对所选的每个部分重复调用shapeFunc。它将传递所选部分中每个方块相对于所选部分原点的坐标以及所选部分的完整大小。使用这些值,您将计算并返回一个布尔数组(形状与坐标数组相同),该数组指示是否应选择此部分中的每个方块。
blockPositions is a multi-dimensional array where the first axis selects the x, y, or z coordinates; e.g. to access the x coordinate array, write blockPositions[0].
blockPositions是一个多维数组,其中第一个轴选择X、Y或Z坐标;例如,要访问X坐标数组,请写blockPositions[0]。
selectionSize is a simple tuple of three positive integers.
selectionSize是由三个正整数组成的简单元组。
For example, this brush shape selects all blocks whose relative Y coordinate is more than 5 - in other words, it is a rectangular selection that excludes the bottom five layers of its bounding box:
例如,此画笔形状选择相对Y坐标大于5的所有方块-换句话说,它是一个矩形选择,不包括其边界框的底部五层:
class Example(BrushShape):
ID = "example"
displayName = "Example Brush Shape"
def shapeFunc(self, blockPositions, size):
y = blockPositions[1]
mask = y > 5
return mask
Note that shapeFunc does not have access to the world dimension where the selection is made, and cannot inspect the world and react to its contents. shapeFunc is meant for shapes that are purely mathematical in nature and can be made using simple computations on the coordinates and the selection’s size.
请注意,shapeFunc无法访问进行选择的世界维度,并且无法检查世界并对其内容作出反应。shapeFunc用于本质上纯数学的、可以使用坐标和选择大小的简单计算而生成的形状。
As a Selection object 作为选择对象
BrushShape.createShapedSelection(box, dimension)[source]
Return a SelectionBox that selects the blocks inside this shape.
返回选择此形状内的方块的SelectionBox。
The default implementation returns a ShapeFuncSelection using self.shapeFunc. Subclasses may override this to return different types of SelectionBox.
默认实现使用self.shapeFunc返回一个ShapeFuncSelection。子类可以重写此项以返回不同类型的SelectionBox。
TODO: BitmapSelectionBox
TODO:位图选择框
Parameters:
·box (BoundingBox) – Bounding box of the selection
·dimension (WorldEditorDimension) – Dimension to create the shaped selection for.
Returns:
box – SelectionBox object that selects all blocks inside this shape
Return type:
SelectionBox
This is the more advanced way of implementing a brush shape. createShapedSelection is given the rectangular bounding box that encloses the shape, and the world dimension where the shape is being used. It must return a SelectionBox instance, which may be one of the existing selection classes or a class of your own design. For details about SelectionBox subclasses, see selection
这是实现画笔形状的更高级的方法。createShapedSelection给出了包围形状的矩形边界框以及使用形状的世界维度。它必须返回一个SelectionBox实例,该实例可能是现有的选择类之一,也可能是您自己设计的类。有关SelectionBox子类的详细信息,请参见Selection。

Plugin Examples插件示例
Simple Options 简单选项
This plugin demonstrates the use of the SimpleCommandPlugin class and its options list.
这个插件演示了SimpleCommandPlugin类及其options列表的使用。
simple_options.py source code
"""
simple_options
"""
from __future__ import absolute_import, division, print_function, unicode_literals
from PySide import QtGui
from mcedit2.plugins import registerPluginCommand, SimpleCommandPlugin
import logging
log = logging.getLogger(__name__)
@registerPluginCommand
class SimpleOptionsDemo(SimpleCommandPlugin):
displayName = "Simple Options Demo"
options = [
{
'type': 'label',
'text': 'A label containing some descriptive text. This text is automatically word-wrapped.'
},
{
'type': 'label',
'text': '''A multi-line label
with several lines
of text.'''
},
{
'type': 'int',
'value': 50,
'min': 0,
'max': 75,
'name': 'myIntOption',
'text': 'Integer Option: ',
},
{
'type': 'int',
'value': 75,
'name': 'myIntOption2',
'text': 'Integer Option (No Min/Max): ',
},
{
'type': 'float',
'value': 1.5,
'min': 0,
'max': 7.5,
'name': 'myFloatOption',
'text': 'Float Option: ',
},
{
'type': 'float',
'value': 2.5,
'name': 'myFloatOption2',
'text': 'Float Option (No Min/Max): ',
},
{
'type': 'bool',
'name': 'myBoolOption',
'text': 'Boolean Option: ',
},
{
'type': 'text',
'name': 'myTextOption',
'text': 'Text Option (Placeholder): ',
'placeholder': 'Placeholder Text',
},
{
'type': 'text',
'name': 'myTextOption2',
'text': 'Text Option (Default Value): ',
'value': 'Default Text Value',
},
{
'type': 'choice',
'name': 'myChoiceOption',
'text': 'Choice Option: ',
'choices': [
('Choice With Text Data', 'choice1'),
('Choice With Integer Data', 50),
('Choice With Float Data', 4.5),
]
},
{
'type': 'blocktype',
'name': 'myBlocktypeOption',
'text': 'Blocktype Option: ',
'value': 'minecraft:glass',
}
]
def perform(self, dimension, selection, options):
lines = []
for key in [
'myIntOption',
'myIntOption2',
'myFloatOption',
'myFloatOption2',
'myBoolOption',
'myTextOption',
'myTextOption2',
'myChoiceOption',
'myBlocktypeOption',
]:
lines.append('%s: %s' % (key, options[key]))
QtGui.QMessageBox.information(None, "Simple Options Demo Result",
"Selected Options:\n\n" + '\n'.join(lines))
World Editing 世界编辑
This plugin demonstrates how to read and change blocks, and how to find entities and modify entity attributes.
这个插件演示了如何读取和更改方块,以及如何查找实体和修改实体属性。
world_editing_demo.py source code
"""
world_editing_demo
"""
from __future__ import absolute_import, division, print_function, unicode_literals
from PySide import QtGui
from mcedit2.plugins import registerPluginCommand, SimpleCommandPlugin
import logging
log = logging.getLogger(__name__)
@registerPluginCommand
class WorldEditingDemo(SimpleCommandPlugin):
displayName = "World Editing Demo"
options = [
{
'type': 'blocktype',
'name': 'replaceWith',
'text': 'Replace all Stone blocks with this: ',
'value': 'minecraft:glass',
},
{
'type': 'float',
'value': 10,
'min': 0,
'max': 200,
'name': 'pigHealth',
'text': 'Change the health of all Pigs to this: ',
},
{
'type': 'text',
'name': 'zombieName',
'text': 'Change the name of all Zombies to this: ',
'placeholder': 'Dinnerbone',
},
]
def perform(self, dimension, selection, options):
stone = dimension.blocktypes['minecraft:stone']
replaceWith = options['replaceWith']
for x, y, z in selection.positions:
if dimension.getBlock(x, y, z) == stone:
dimension.setBlock(x, y, z, replaceWith)
for entity in dimension.getEntities(selection, id='Pig'):
entity.Health = options['pigHealth']
for entity in dimension.getEntities(selection, id='Zombie'):
entity.Name = options['zombieName']