void MinefieldZoneComponent::notifyPositionUpdate(SceneObject* sceneObject, QuadTreeEntry* entry) const { // if we don't have any mines, just exit if(sceneObject->getContainerObjectsSize() == 0 ) return; ManagedReference<SceneObject*> target = cast<SceneObject*>(entry); if(!sceneObject->isMinefield() || target == NULL){ return; } DataObjectComponentReference* ref = sceneObject->getDataObjectComponent(); if(ref == NULL){ info("dataobjectcomponent is null",true); return; } MinefieldDataComponent* mineData = cast<MinefieldDataComponent*>(ref->get()); if(mineData == NULL || !mineData->canExplode()) return; try { if (target->isPlayerCreature() && sceneObject->isInRange(target,mineData->getMaxRange())){ ManagedReference<CreatureObject*> player = cast<CreatureObject*>(entry); if(player == NULL) return; ManagedReference<TangibleObject*> tano = cast<TangibleObject*>(sceneObject); if(tano == NULL) return; if(!player->isAttackableBy(tano)) return; Reference<MinefieldAttackTask*> task = new MinefieldAttackTask(sceneObject, player); task->execute(); } } catch (Exception& e) { } return; }
void MinefieldZoneComponent::notifyPositionUpdate(SceneObject* sceneObject, QuadTreeEntry* entry) const { ManagedReference<SceneObject*> target = cast<SceneObject*>(entry); if(!sceneObject->isMinefield() || target == NULL){ return; } DataObjectComponentReference* ref = sceneObject->getDataObjectComponent(); if(ref == NULL){ info("dataobjectcomponent is null",true); return; } MinefieldDataComponent* mineData = cast<MinefieldDataComponent*>(ref->get()); if (mineData == NULL) return; try { if (target->isPlayerCreature()) { ManagedReference<CreatureObject*> player = cast<CreatureObject*>(entry); if(player == NULL) return; uint64 playerObjID = player->getObjectID(); ManagedReference<TangibleObject*> tano = cast<TangibleObject*>(sceneObject); if(tano == NULL) return; if(!player->isAttackableBy(tano) && !mineData->hasNotifiedPlayer(playerObjID)) return; if (sceneObject->isInRange(target, mineData->getMaxRange())) { if (mineData->canExplode() && sceneObject->getContainerObjectsSize() > 0) { Reference<MinefieldAttackTask*> task = new MinefieldAttackTask(sceneObject, player); task->execute(); } if (!mineData->hasNotifiedPlayer(playerObjID)) { mineData->addNotifiedPlayer(playerObjID); player->sendSystemMessage("@faction_perk:minefield_near"); //You have breached the perimeter of an enemy minefield. } } else if (mineData->hasNotifiedPlayer(playerObjID)) { player->sendSystemMessage("@faction_perk:minefield_exit"); //You have left the perimeter of an enemy minefield. mineData->removeNotifiedPlayer(playerObjID); } } } catch (Exception& e) { } return; }