/*==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 . 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 "hsTypes.h" #include "plPickingDetector.h" #include "plMessage/plActivatorMsg.h" #include "plMessage/plPickedMsg.h" #include "pnNetCommon/plNetApp.h" #include "pnSceneObject/plSceneObject.h" #include "pnKeyedObject/plKey.h" #include "pnMessage/plObjRefMsg.h" #include "pnMessage/plFakeOutMsg.h" #include "pnNetCommon/plNetApp.h" #include "plgDispatch.h" hsBool plPickingDetector::MsgReceive(plMessage* msg) { plObjRefMsg* refMsg = plObjRefMsg::ConvertNoRef(msg); if( refMsg ) { if( refMsg->fType == plObjRefMsg::kModifier) { if( refMsg->GetContext() & (plRefMsg::kOnCreate|plRefMsg::kOnRequest|plRefMsg::kOnReplace) ) { plModifier* mod = plModifier::ConvertNoRef(refMsg->GetRef()); SetRemote(mod); } else if( refMsg->GetContext() & (plRefMsg::kOnDestroy|plRefMsg::kOnRemove) ) { SetRemote(nil); } } return true; } plPickedMsg* pPMsg = plPickedMsg::ConvertNoRef(msg); if (pPMsg) { for (int i = 0; i < fReceivers.Count(); i++) { plActivatorMsg* pMsg = TRACKED_NEW plActivatorMsg; pMsg->AddReceiver( fReceivers[i] ); if (pPMsg->fPicked) pMsg->SetTriggerType( plActivatorMsg::kPickedTrigger ); else pMsg->SetTriggerType( plActivatorMsg::kUnPickedTrigger ); // pass on the hit point pMsg->fHitPoint = pPMsg->fHitPoint; if (fProxyKey) pMsg->fPickedObj = fProxyKey; else pMsg->fPickedObj = GetTarget()->GetKey(); // assume that since this is something that was PICKED that it was done by the local player. plKey locPlayerKey = plNetClientApp::GetInstance()->GetLocalPlayerKey(); if (locPlayerKey) pMsg->fHitterObj = locPlayerKey; pMsg->SetSender(GetKey()); plgDispatch::MsgSend( pMsg ); hsStatusMessageF("%s sending activate message to %s\n",GetKey()->GetName(), fReceivers[i]->GetName()); } } if (RemoteMod() && RemoteMod()->MsgReceive(msg)) return true; return plDetectorModifier::MsgReceive(msg); }