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.

218 lines
6.1 KiB

/*==LICENSE==*
CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011 Cyan Worlds, Inc.
This program 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.
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
You can contact Cyan Worlds, Inc. by email legal@cyan.com
or by snail mail at:
Cyan Worlds, Inc.
14617 N Newport Hwy
Mead, WA 99021
*==LICENSE==*/
#include "HeadSpin.h"
#include "plComponent.h"
#include "plComponentReg.h"
#include "hsTemplates.h"
#include "../MaxMain/plPluginResManager.h"
#include "../MaxMain/plMaxNode.h"
#include "../pnSceneObject/plSceneObject.h"
#include "../pnKeyedObject/plKey.h"
#include "plMiscComponents.h"
#include "resource.h"
void DummyCodeIncludeFuncTemplate()
{
}
static const char *GetPBString(IParamBlock2 *pb, ParamID id)
{
const char *str = pb->GetStr(id, 0);
if (str && *str == '\0')
return nil;
return str;
}
class plTemplateComponent : public plComponent
{
protected:
const char* IGetAgeName(plMaxNode *node);
public:
plTemplateComponent();
// SetupProperties - Internal setup and write-only set properties on the MaxNode. No reading
// of properties on the MaxNode, as it's still indeterminant.
virtual hsBool SetupProperties(plMaxNode *node, plErrorMsg *pErrMsg);
virtual hsBool Convert(plMaxNode *node, plErrorMsg *pErrMsg);
};
CLASS_DESC(plTemplateComponent, gTemplateDesc, "Template", "CloneTemplate", "Clone", Class_ID(0x6742590b, 0x14fd2135))
enum
{
kTemplateName
};
ParamBlockDesc2 gTemplateBlk
(
plComponent::kBlkComp, _T("Template"), 0, &gTemplateDesc, P_AUTO_CONSTRUCT, plComponent::kRefComp,
end
);
plTemplateComponent::plTemplateComponent()
{
fClassDesc = &gTemplateDesc;
fClassDesc->MakeAutoParamBlocks(this);
}
const char* plTemplateComponent::IGetAgeName(plMaxNode *node)
{
UInt32 numComps = node->NumAttachedComponents();
for (UInt32 i = 0; i < numComps; i++)
{
plComponentBase* comp = node->GetAttachedComponent(i);
if (comp->ClassID() == PAGEINFO_CID)
{
plPageInfoComponent* pageInfo = (plPageInfoComponent*)comp;
return pageInfo->GetAgeName();
}
}
return nil;
}
#include "../MaxMain/plMaxNodeData.h"
// SetupProperties - Internal setup and write-only set properties on the MaxNode. No reading
// of properties on the MaxNode, as it's still indeterminant.
hsBool plTemplateComponent::SetupProperties(plMaxNode *node, plErrorMsg *pErrMsg)
{
const char* ageName = IGetAgeName(node);
if (!ageName)
return false;
#if 0
const char *templateName = node->GetName();
plKey roomKey = plPluginResManager::ResMgr()->NameToLoc(ageName, "District", "BuiltIn", (UInt32)-1);
// Set this object and all its children to be in the special template age
node->SetRoomKey(roomKey);
for (int i = 0; i < node->NumberOfChildren(); i++)
{
plMaxNode* childNode = (plMaxNode*)node->GetChildNode(i);
childNode->SetRoomKey(roomKey);
}
#endif
// We need a coordinate interface so we can move to the clone position
node->SetForceLocal(true);
node->GetMaxNodeData()->SetItinerant(true);
return true;
}
hsBool plTemplateComponent::Convert(plMaxNode *node, plErrorMsg *pErrMsg)
{
if (node->GetSceneObject())
node->GetSceneObject()->SetSynchFlagsBit(plSynchedObject::kAllStateIsVolatile);
for (int i = 0; i < node->NumberOfChildren(); i++)
{
plMaxNode* childNode = (plMaxNode*)node->GetChildNode(i);
if (childNode->GetSceneObject())
childNode->GetSceneObject()->SetSynchFlagsBit(plSynchedObject::kAllStateIsVolatile);
}
return true;
}
////////////////////////////////////////////////////////////////////////////////
#include "../plModifier/plCloneSpawnModifier.h"
class plSpawnComponent : public plComponent
{
public:
plSpawnComponent();
// SetupProperties - Internal setup and write-only set properties on the MaxNode. No reading
// of properties on the MaxNode, as it's still indeterminant.
virtual hsBool SetupProperties(plMaxNode *node, plErrorMsg *pErrMsg);
virtual hsBool Convert(plMaxNode *node, plErrorMsg *pErrMsg);
};
CLASS_DESC(plSpawnComponent, gSpawnDesc, "Instance", "CloneInst", "Clone", Class_ID(0x5702450d, 0x2c636131))
ParamBlockDesc2 gSpawnBlk
(
plComponent::kBlkComp, _T("Spawn"), 0, &gSpawnDesc, P_AUTO_CONSTRUCT + P_AUTO_UI, plComponent::kRefComp,
IDD_COMP_TEMPLATE, IDS_COMP_CLONE_INST, 0, 0, NULL,
kTemplateName, _T("name"), TYPE_STRING, 0, 0,
p_ui, TYPE_EDITBOX, IDC_NAME,
end,
end
);
plSpawnComponent::plSpawnComponent()
{
fClassDesc = &gSpawnDesc;
fClassDesc->MakeAutoParamBlocks(this);
}
// SetupProperties - Internal setup and write-only set properties on the MaxNode. No reading
// of properties on the MaxNode, as it's still indeterminant.
hsBool plSpawnComponent::SetupProperties(plMaxNode *node, plErrorMsg *pErrMsg)
{
if (!GetPBString(fCompPB, kTemplateName))
{
pErrMsg->Set(true, "Clone Instance Component", "Clone Instance component on node %s can't convert because it doesn't have a name", node->GetName());
pErrMsg->Set(false);
return false;
}
// We need a coordinate interface to find the point to warp the clone to.
node->SetForceLocal(true);
return true;
}
hsBool plSpawnComponent::Convert(plMaxNode *node, plErrorMsg *pErrMsg)
{
const char *templateName = GetPBString(fCompPB, kTemplateName);
if (!templateName)
return false;
plCloneSpawnModifier* mod = TRACKED_NEW plCloneSpawnModifier;
mod->SetExportTime();
mod->SetTemplateName(templateName);
node->AddModifier(mod, IGetUniqueName(node));
return true;
}