void GroupObjectImplementation::removeMember(CreatureObject* member) { bool wasLeader = getLeader() == member; if (hasSquadLeader()) { if (wasLeader) removeGroupModifiers(); else removeGroupModifiers(member); } for (int i = 0; i < groupMembers.size(); i++) { CreatureObject* scno = groupMembers.get(i).get().get(); if (scno == member) { GroupObjectDeltaMessage6* grp = new GroupObjectDeltaMessage6(_this.getReferenceUnsafeStaticCast()); grp->startUpdate(1); groupMembers.remove(i, grp); grp->close(); broadcastMessage(grp); } } if (member->isPlayerCreature()) { // Remove member's pets RemovePetsFromGroupTask* task = new RemovePetsFromGroupTask(member, _this.getReferenceUnsafeStaticCast()); task->execute(); //Close any open Group SUIs. ManagedReference<PlayerObject*> ghost = member->getPlayerObject(); if (ghost != NULL) { ghost->closeSuiWindowType(SuiWindowType::GROUP_LOOT_RULE); ghost->closeSuiWindowType(SuiWindowType::GROUP_LOOT_CHANGED); ghost->closeSuiWindowType(SuiWindowType::GROUP_LOOT_PICK_LOOTER); ghost->removeWaypointBySpecialType(WaypointObject::SPECIALTYPE_NEARESTMISSIONFORGROUP); } //Reset Master Looter if needed. if (getMasterLooterID() == member->getObjectID()) { ManagedReference<CreatureObject*> groupLeader = getLeader(); GroupManager::instance()->changeMasterLooter(_this.getReferenceUnsafeStaticCast(), groupLeader, false); } if (wasLeader && hasSquadLeader()) { addGroupModifiers(); } Zone* zone = member->getZone(); if (zone != NULL) { scheduleUpdateNearestMissionForGroup(zone->getPlanetCRC()); } } updatePvPStatusNearCreature(member); calcGroupLevel(); }
void GroupObjectImplementation::makeLeader(SceneObject* player) { if (groupMembers.size() < 2 || !player->isPlayerCreature()) return; //SceneObject* obj = groupMembers.get(); Reference<SceneObject*> temp = groupMembers.get(0).get(); for (int i = 0; i < groupMembers.size(); ++i) { if (groupMembers.get(i) == player) { GroupObjectDeltaMessage6* grp = new GroupObjectDeltaMessage6(_this.get()); grp->startUpdate(1); if (hasSquadLeader()) removeGroupModifiers(); groupMembers.set(0, player, grp, 2); groupMembers.set(i, temp.get(), grp, 0); grp->close(); broadcastMessage(grp); if (hasSquadLeader()) addGroupModifiers(); return; } } }
void GroupObjectImplementation::removeGroupModifiers() { for (int i = 0; i < groupMembers.size(); i++) { CreatureObject* player = getGroupMember(i); if (!player->isPlayerCreature()) continue; removeGroupModifiers(player); } }
void GroupObjectImplementation::removeGroupModifiers() { for (int i = 0; i < groupMembers.size(); i++) { CreatureObject* crea = getGroupMember(i).castTo<CreatureObject*>().get(); if (crea == NULL) continue; if (!crea->isPlayerCreature()) continue; ManagedReference<CreatureObject*> player = cast<CreatureObject*>( crea); removeGroupModifiers(player); } }
void GroupObjectImplementation::disband() { // this locked ManagedReference<ChatRoom* > chat = chatRoom; for (int i = 0; i < groupMembers.size(); i++) { if (groupMembers.get(i) == NULL) { continue; } Reference<CreatureObject*> groupMember = getGroupMember(i).castTo<CreatureObject*>(); try { Locker clocker(groupMember, _this.get()); if (groupMember->isPlayerCreature()) { if (chat != NULL) { chat->removePlayer(groupMember, false); chat->sendDestroyTo(groupMember); ChatRoom* room = chat->getParent(); room->sendDestroyTo(groupMember); } if (groupMember->getPlayerObject() != NULL) { PlayerObject* ghost = groupMember->getPlayerObject(); ghost->removeWaypointBySpecialType(WaypointObject::SPECIALTYPE_NEARESTMISSIONFORGROUP); } } groupMember->updateGroup(NULL); //play->updateGroupId(0); //sendClosestWaypointDestroyTo(play); //removeSquadLeaderBonuses(play); } catch (Exception& e) { System::out << "Exception in GroupObject::disband(Player* player)\n"; } } destroyChatRoom(); if (hasSquadLeader()) removeGroupModifiers(); groupMembers.removeAll(); //The mission waypoints should not be destroyed. They belong to the players. //missionWaypoints.removeAll(); }
void GroupObjectImplementation::removeMember(SceneObject* member) { ManagedReference<SceneObject*> obj = member; for (int i = 0; i < groupMembers.size(); i++) { SceneObject* scno = groupMembers.get(i).get().get(); if (scno == member) { GroupObjectDeltaMessage6* grp = new GroupObjectDeltaMessage6(_this.get()); grp->startUpdate(1); groupMembers.remove(i, grp); grp->close(); broadcastMessage(grp); } } if (member->isPlayerCreature()) { // Remove member's pets CreatureObject* playerCreature = cast<CreatureObject*>(member); RemovePetsFromGroupTask* task = new RemovePetsFromGroupTask(playerCreature, _this.get()); task->execute(); //Close any open Group SUIs. ManagedReference<PlayerObject*> ghost = playerCreature->getPlayerObject(); if (ghost != NULL) { ghost->closeSuiWindowType(SuiWindowType::GROUP_LOOT_RULE); ghost->closeSuiWindowType(SuiWindowType::GROUP_LOOT_CHANGED); ghost->closeSuiWindowType(SuiWindowType::GROUP_LOOT_PICK_LOOTER); } //Reset Master Looter if needed. if (getMasterLooterID() == playerCreature->getObjectID()) { ManagedReference<CreatureObject*> groupLeader = (getLeader()).castTo<CreatureObject*>(); GroupManager::instance()->changeMasterLooter(_this.get(), groupLeader, false); } if (hasSquadLeader()) { removeGroupModifiers(playerCreature); } if (playerCreature->getPlayerObject() != NULL) { PlayerObject* ghost = playerCreature->getPlayerObject(); ghost->removeWaypointBySpecialType(WaypointObject::SPECIALTYPE_NEARESTMISSIONFORGROUP); } scheduleUpdateNearestMissionForGroup(playerCreature->getPlanetCRC()); } calcGroupLevel(); }
void GroupObjectImplementation::disband() { //Group is locked for (int i = 0; i < groupMembers.size(); i++) { if (groupMembers.get(i) == NULL) continue; Reference<CreatureObject*> groupMember = getGroupMember(i); try { Locker clocker(groupMember, _this.getReferenceUnsafeStaticCast()); if (groupMember->isPlayerCreature()) { PlayerObject* ghost = groupMember->getPlayerObject(); if (ghost != NULL) { ghost->removeWaypointBySpecialType(WaypointObject::SPECIALTYPE_NEARESTMISSIONFORGROUP); } } groupMember->updateGroup(NULL); } catch (Exception& e) { System::out << "Exception in GroupObject::disband(Player* player)\n"; } } if (hasSquadLeader()) removeGroupModifiers(); while (groupMembers.size() > 0) { CreatureObject* member = groupMembers.get(0).get().get(); updatePvPStatusNearCreature(member); groupMembers.remove(0); } destroyChatRoom(); }