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.
172 lines
4.4 KiB
172 lines
4.4 KiB
14 years ago
|
/*==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==*/
|
||
|
|
||
|
// singular
|
||
|
#include "plOneShotMod.h"
|
||
|
|
||
|
// local
|
||
|
#include "plArmatureMod.h"
|
||
|
#include "plAvatarMgr.h"
|
||
|
|
||
|
// global
|
||
|
#include "plgDispatch.h"
|
||
|
|
||
|
// other
|
||
14 years ago
|
#include "plMessage/plAvatarMsg.h"
|
||
14 years ago
|
|
||
|
// CTOR()
|
||
|
plOneShotMod::plOneShotMod()
|
||
|
: fDrivable(false),
|
||
|
fReversable(false),
|
||
|
fSeekDuration(1.0f),
|
||
|
fSmartSeek(false),
|
||
|
fAnimName(nil),
|
||
|
fNoSeek(false)
|
||
|
{
|
||
|
// this constructor is called from the loader.
|
||
|
}
|
||
|
|
||
|
// CTOR(char *)
|
||
|
plOneShotMod::plOneShotMod(const char *animName,
|
||
|
hsBool drivable,
|
||
|
hsBool reversable,
|
||
|
float seekDuration,
|
||
|
hsBool smartSeek,
|
||
|
hsBool noSeek)
|
||
|
: fDrivable(drivable),
|
||
|
fReversable(reversable),
|
||
|
fSeekDuration(seekDuration),
|
||
|
fSmartSeek((float)smartSeek),
|
||
|
fNoSeek(noSeek)
|
||
|
{
|
||
|
fAnimName = hsStrcpy(animName);
|
||
|
}
|
||
|
|
||
|
// INIT
|
||
|
void plOneShotMod::Init(const char *animName,
|
||
|
hsBool drivable,
|
||
|
hsBool reversable,
|
||
|
float seekDuration,
|
||
|
hsBool smartSeek,
|
||
|
hsBool noSeek)
|
||
|
{
|
||
|
fAnimName = hsStrcpy(animName);
|
||
|
fDrivable = drivable;
|
||
|
fReversable = reversable;
|
||
|
fSeekDuration = seekDuration;
|
||
|
fSmartSeek = (float)smartSeek;
|
||
|
fNoSeek = noSeek;
|
||
|
}
|
||
|
|
||
|
// DTOR()
|
||
|
plOneShotMod::~plOneShotMod()
|
||
|
{
|
||
|
if(fAnimName) {
|
||
|
delete[] fAnimName;
|
||
|
fAnimName = nil;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
#include "../plMessage/plOneShotMsg.h"
|
||
|
#include "../plMessage/plOneShotCallbacks.h"
|
||
|
|
||
|
// MSGRECEIVE
|
||
|
hsBool plOneShotMod::MsgReceive(plMessage* msg)
|
||
|
{
|
||
|
plOneShotMsg *oneShotMsg = plOneShotMsg::ConvertNoRef(msg);
|
||
|
if (oneShotMsg)
|
||
|
{
|
||
|
// Send a one shot task request to the given target, which darn well better have an avatar modifier on it.
|
||
|
plKey myKey = GetKey();
|
||
|
plKey objKey = GetTarget(0)->GetKey();
|
||
|
plKey avKey = oneShotMsg->fPlayerKey;
|
||
|
hsAssert(avKey,"The avatar key is missing in the one shot!");
|
||
|
|
||
|
if ( avKey )
|
||
|
{
|
||
|
plSceneObject *avObj = (plSceneObject *)avKey->ObjectIsLoaded();
|
||
|
if(avObj)
|
||
|
{
|
||
|
const plArmatureMod *avMod = (plArmatureMod*)avObj->GetModifierByType(plArmatureMod::Index());
|
||
|
|
||
|
if(avMod)
|
||
|
{
|
||
|
char *animName = avMod->MakeAnimationName(fAnimName);
|
||
|
|
||
|
plAvOneShotMsg *avOSmsg = TRACKED_NEW plAvOneShotMsg(myKey, oneShotMsg->fPlayerKey, objKey,
|
||
|
fSeekDuration, (hsBool)fSmartSeek, animName, fDrivable,
|
||
|
fReversable);
|
||
|
|
||
|
delete [] animName; // AvOneShotMsg constructor copies.
|
||
|
avOSmsg->fNoSeek = fNoSeek;
|
||
|
avOSmsg->SetBCastFlag(plMessage::kPropagateToModifiers);
|
||
|
hsRefCnt_SafeRef(oneShotMsg->fCallbacks);
|
||
|
avOSmsg->fCallbacks = oneShotMsg->fCallbacks;
|
||
|
plgDispatch::MsgSend(avOSmsg);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
return plMultiModifier::MsgReceive(msg);
|
||
|
}
|
||
|
|
||
|
// ADDTARGET
|
||
|
// Here I am. Announce presence to the avatar registry.
|
||
|
void plOneShotMod::AddTarget(plSceneObject* so)
|
||
|
{
|
||
|
plMultiModifier::AddTarget(so);
|
||
|
|
||
|
plAvatarMgr::GetInstance()->AddOneShot(this);
|
||
|
}
|
||
|
|
||
|
void plOneShotMod::Read(hsStream *stream, hsResMgr *mgr)
|
||
|
{
|
||
|
plMultiModifier::Read(stream, mgr);
|
||
|
|
||
|
// read in the name of the animation itself
|
||
|
fAnimName = stream->ReadSafeString();
|
||
|
fSeekDuration = stream->ReadSwapScalar();
|
||
|
fDrivable = stream->ReadBool();
|
||
|
fReversable = stream->ReadBool();
|
||
|
fSmartSeek = (float)stream->ReadBool();
|
||
|
fNoSeek = stream->ReadBool();
|
||
|
}
|
||
|
|
||
|
void plOneShotMod::Write(hsStream *stream, hsResMgr *mgr)
|
||
|
{
|
||
|
plMultiModifier::Write(stream, mgr);
|
||
|
|
||
|
stream->WriteSafeString(fAnimName);
|
||
|
stream->WriteSwapScalar(fSeekDuration);
|
||
|
stream->WriteBool(fDrivable);
|
||
|
stream->WriteBool(fReversable);
|
||
|
stream->WriteBool((hsBool)fSmartSeek);
|
||
|
stream->WriteBool(fNoSeek);
|
||
|
}
|