void MinefieldZoneComponent::notifyDissapear(SceneObject* sceneObject, QuadTreeEntry* entry) const { ManagedReference<CreatureObject*> player = cast<CreatureObject*>(entry); if (player == NULL || !player->isPlayerCreature()) return; MinefieldDataComponent* data = cast<MinefieldDataComponent*>(sceneObject->getDataObjectComponent()->get()); if (data == NULL) return; if (data->hasNotifiedPlayer(player->getObjectID())) { data->removeNotifiedPlayer(player->getObjectID()); player->sendSystemMessage("@faction_perk:minefield_exit"); //You have left the perimeter of an enemy minefield. } }
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; }