mirror of https://github.com/H-uru/korman.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
5.6 KiB
132 lines
5.6 KiB
# This file is part of Korman. |
|
# |
|
# Korman is free software: you can redistribute it and/or modify |
|
# it under the terms of the GNU General Public License as published by |
|
# the Free Software Foundation, either version 3 of the License, or |
|
# (at your option) any later version. |
|
# |
|
# Korman is distributed in the hope that it will be useful, |
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
# GNU General Public License for more details. |
|
# |
|
# You should have received a copy of the GNU General Public License |
|
# along with Korman. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
import bpy |
|
from bpy.props import * |
|
from PyHSPlasma import * |
|
|
|
from .base import PlasmaModifierProperties |
|
from ...exporter import ExportError |
|
from ... import idprops |
|
|
|
game_versions = [("pvPrime", "Ages Beyond Myst (63.11)", "Targets the original Uru (Live) game"), |
|
("pvPots", "Path of the Shell (63.12)", "Targets the most recent offline expansion pack"), |
|
("pvMoul", "Myst Online: Uru Live (70)", "Targets the most recent online game")] |
|
|
|
class PlasmaVersionedNodeTree(idprops.IDPropMixin, bpy.types.PropertyGroup): |
|
name = StringProperty(name="Name") |
|
version = EnumProperty(name="Version", |
|
description="Plasma versions this node tree exports under", |
|
items=game_versions, |
|
options={"ENUM_FLAG"}, |
|
default=set(list(zip(*game_versions))[0])) |
|
node_tree = PointerProperty(name="Node Tree", |
|
description="Node Tree to export", |
|
type=bpy.types.NodeTree) |
|
node_name = StringProperty(name="Node Ref", |
|
description="Attach a reference to this node") |
|
|
|
@classmethod |
|
def _idprop_mapping(cls): |
|
return {"node_tree": "node_tree_name"} |
|
|
|
def _idprop_sources(self): |
|
return {"node_tree_name": bpy.data.node_groups} |
|
|
|
|
|
class PlasmaAdvancedLogic(PlasmaModifierProperties): |
|
pl_id = "advanced_logic" |
|
|
|
bl_category = "Logic" |
|
bl_label = "Advanced" |
|
bl_description = "Plasma Logic Nodes" |
|
bl_icon = "NODETREE" |
|
|
|
logic_groups = CollectionProperty(type=PlasmaVersionedNodeTree) |
|
active_group_index = IntProperty(options={"HIDDEN"}) |
|
|
|
def export(self, exporter, bo, so): |
|
version = exporter.mgr.getVer() |
|
for i in self.logic_groups: |
|
our_versions = [globals()[j] for j in i.version] |
|
if version in our_versions: |
|
if i.node_tree is None: |
|
raise ExportError("'{}': Advanced Logic is missing a node tree for '{}'".format(bo.name, i.version)) |
|
|
|
# If node_name is defined, then we're only adding a reference. We will make sure that |
|
# the entire node tree is exported once before the post_export step, however. |
|
if i.node_name: |
|
exporter.want_node_trees[i.node_tree.name] = (bo, so) |
|
node = i.node_tree.nodes.get(i.node_name, None) |
|
if node is None: |
|
raise ExportError("Node '{}' does not exist in '{}'".format(i.node_name, i.node_tree.name)) |
|
# We are going to assume get_key will do the adding correctly. Single modifiers |
|
# should fetch the appropriate SceneObject before doing anything, so this will |
|
# be a no-op in that case. Multi modifiers should accept any SceneObject, however |
|
node.get_key(exporter, so) |
|
else: |
|
exporter.node_trees_exported.add(i.node_tree.name) |
|
i.node_tree.export(exporter, bo, so) |
|
|
|
def harvest_actors(self): |
|
actors = set() |
|
for i in self.logic_groups: |
|
actors.update(i.node_tree.harvest_actors()) |
|
return actors |
|
|
|
|
|
class PlasmaSpawnPoint(PlasmaModifierProperties): |
|
pl_id = "spawnpoint" |
|
|
|
bl_category = "Logic" |
|
bl_label = "Spawn Point" |
|
bl_description = "Point at which avatars link into the Age" |
|
|
|
def export(self, exporter, bo, so): |
|
# Not much to this modifier... It's basically a flag that tells the engine, "hey, this is a |
|
# place the avatar can show up." Nice to have a simple one to get started with. |
|
spawn = exporter.mgr.add_object(pl=plSpawnModifier, so=so, name=self.key_name) |
|
|
|
@property |
|
def requires_actor(self): |
|
return True |
|
|
|
|
|
class PlasmaMaintainersMarker(PlasmaModifierProperties): |
|
pl_id = "maintainersmarker" |
|
|
|
bl_category = "Logic" |
|
bl_label = "Maintainer's Marker" |
|
bl_description = "Designates an object as the D'ni coordinate origin point of the Age." |
|
bl_icon = "OUTLINER_DATA_EMPTY" |
|
|
|
calibration = EnumProperty(name="Calibration", |
|
description="State of repair for the Marker", |
|
items=[ |
|
("kBroken", "Broken", |
|
"A marker which reports scrambled coordinates to the KI."), |
|
("kRepaired", "Repaired", |
|
"A marker which reports blank coordinates to the KI."), |
|
("kCalibrated", "Calibrated", |
|
"A marker which reports accurate coordinates to the KI.") |
|
]) |
|
|
|
def export(self, exporter, bo, so): |
|
maintmark = exporter.mgr.add_object(pl=plMaintainersMarkerModifier, so=so, name=self.key_name) |
|
maintmark.calibration = getattr(plMaintainersMarkerModifier, self.calibration) |
|
|
|
@property |
|
def requires_actor(self): |
|
return True
|
|
|