void ObjectController::sendAdminFeedback(BString reply) const { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if ((player) && (player->isConnected())) { if (reply.getLength()) { gLogger->log(LogManager::NOTICE,"Admin (%s): %s", player->getFirstName().getAnsi(), reply.getAnsi()); reply.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(reply.getUnicode16(), player, true); } else { gLogger->log(LogManager::NOTICE,"Admin (%s):", player->getFirstName().getAnsi()); } } else { if (reply.getDataLength()) { gLogger->log(LogManager::NOTICE,"Admin (anon): %s", reply.getAnsi()); } else { gLogger->log(LogManager::NOTICE,"Admin (anon):"); } } }
void ObjectController::_handleFindFriendDBReply(uint64 retCode,string friendName) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); friendName.convert(BSTRType_Unicode16); if(retCode == 0) { gMessageLib->sendSystemMessage(player,L"","cmnty","friend_location_failed_noname","","",L"",0,"","",friendName.getUnicode16()); return; } PlayerObject* searchObject = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(retCode)); if(!searchObject) { gMessageLib->sendSystemMessage(player,L"","cmnty","friend_location_failed","","",L"",0,"","",friendName.getUnicode16()); return; } //are we on our targets friendlist??? if(!searchObject->checkFriendList(player->getFirstName().getCrc())) { gMessageLib->sendSystemMessage(player,L"","cmnty","friend_location_failed","","",L"",0,"","",friendName.getUnicode16()); return; } Datapad* thePad = dynamic_cast<Datapad*>(searchObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Datapad)); if(thePad && thePad->getCapacity()) { //the datapad automatically checks for waypoint caspacity and gives the relevant error messages thePad->requestNewWaypoint(searchObject->getFirstName().getAnsi(),searchObject->mPosition,static_cast<uint16>(gWorldManager->getZoneId()),Waypoint_blue); } }
//====================================================================================================================== // // Modifies the Admin List // void ObjectController::_handleTransferStructure(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { // requirement we have the structure targeted AND give the name of the recipient on the commandline // OR we have the recipient targeted and stand NEXT to the structure were about to transfer //do we have a valid donor ? PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if(!player) { return; } // is the player online and near 30m ? // we get the players id as targetid if yes, otherwise we get the name as string // however, we do not want players that are not online //now get the target player PlayerObject* recipient = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(targetId)); if(!recipient) { gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "no_transfer_target"), player); return; } //do we have a valid structure ??? check our target first uint64 id = player->getTargetId(); Object* object = gWorldManager->getObjectById(id); PlayerStructure* structure = dynamic_cast<PlayerStructure*>(object); if(!structure) { // we need to get the nearest structure that we own // for now dustoff gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "command_no_building"), player); return; } //is the structure in Range??? float fTransferDistance = gWorldConfig->getConfiguration<float>("Player_Transfer_Structure_Distance",(float)8.0); if(glm::distance(player->mPosition, structure->mPosition) > fTransferDistance) { gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "command_no_building"), player); return; } StructureAsyncCommand command; command.PlayerId = player->getId(); command.StructureId = structure->getId(); command.RecipientId = recipient->getId(); command.PlayerStr = recipient->getFirstName().getAnsi(); command.Command = Structure_Command_TransferStructure; gStructureManager->checkNameOnPermissionList(structure->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); }
void ObjectController::sendAdminFeedback(BString reply) const { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if ((player) && (player->isConnected())) { if (reply.getLength()) { reply.convert(BSTRType_Unicode16); gMessageLib->SendSystemMessage(reply.getUnicode16(), player, true); } else { DLOG(info) << "Admin :" << player->getFirstName().getAnsi(); } } else { if (reply.getDataLength()) { DLOG(info) << "Admin (anon): " << reply.getAnsi(); } else { } } }
//====================================================================================================================== // // provides the harvester with the current resources // void ObjectController::_handleHarvesterGetResourceData(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if(!player) { return; } //do we have a valid structure ??? uint64 id = targetId; Object* object = gWorldManager->getObjectById(id); PlayerStructure* structure = dynamic_cast<PlayerStructure*>(object); if(!structure) { //gMessageLib->sendSystemMessage(player,L"","player_structure","command_no_building"); return; } //is the structure in Range??? float fTransferDistance = gWorldConfig->getConfiguration<float>("Player_Structure_Operate_Distance",(float)10.0); if(glm::distance(player->mPosition, structure->mPosition) > fTransferDistance) { DLOG(INFO) << " ObjectController::_handleHarvesterGetResourceData Structure not in Range"; return; } HarvesterObject* harvester = dynamic_cast<HarvesterObject*>(structure); StructureAsyncCommand command; command.Command = Structure_Command_GetResourceData; command.PlayerId = player->getId(); command.StructureId = structure->getId(); gStructureManager->checkNameOnPermissionList(structure->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); return; gMessageLib->sendHarvesterResourceData(structure,player); DLOG(INFO) << " ObjectController::_handleHarvesterGetResourceData :: hino 7 baseline"; gMessageLib->sendBaselinesHINO_7(harvester,player); //add the structure to the timer so the resource amounts are updated while we look at the hopper //harvester->getTTS()->todo = ttE_UpdateHopper; //harvester->getTTS()->playerId = player->getId(); //structure->getTTS()->projectedTime = 5000 + Anh_Utils::Clock::getSingleton()->getLocalTime(); //gStructureManager->addStructureforHopperUpdate(harvester->getId()); // this needs to be handled zoneserverside - otherwise the addition of a res will trigger a racecondition // between the sql write query and the sql read please note that the harvesting itself happens through stored procedures // and we cant keep the updatecounters synchronized }
//====================================================================================================================== // // Modifies the Admin List // void ObjectController::_handleNameStructure(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { // requirement we have the structure targeted AND give the name of the recipient on the commandline // OR we have the recipient targeted and stand NEXT to the structure were about to transfer //do we have a valid donor ? PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if(!player) { return; } //do we have a valid structure ??? check our target first uint64 id = player->getTargetId(); Object* object = gWorldManager->getObjectById(id); PlayerStructure* structure = dynamic_cast<PlayerStructure*>(object); if(!structure) { gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "command_no_building"), player); return; } //is the structure in Range??? float fTransferDistance = gWorldConfig->getConfiguration<float>("Player_Structure_Operate_Distance",(float)10.0); if(glm::distance(player->mPosition, structure->mPosition) > fTransferDistance) { gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "command_no_building"), player); return; } //find out where our structure is BString dataStr; message->getStringUnicode16(dataStr); BString nameStr; dataStr.convert(BSTRType_ANSI); sscanf(dataStr.getAnsi(),"%s",nameStr.getAnsi()); if(nameStr.getLength() > 68) { gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "not_valid_name"), player); return; } StructureAsyncCommand command; command.Command = Structure_Command_RenameStructure; command.PlayerId = player->getId(); command.StructureId = structure->getId(); gStructureManager->checkNameOnPermissionList(structure->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); }
void City::onObjectEnter(Object* object) { PlayerObject* player = (PlayerObject*)object; //player->setCityRegionId(this->getId()); addKnownObjectSafe(object); gLogger->log(LogManager::INFORMATION,"%s entered %s (%u players in city)",player->getFirstName().getAnsi(),mCityName.getAnsi(),mKnownPlayers.size()); }
void City::onObjectEnter(Object* object) { PlayerObject* player = (PlayerObject*)object; //player->setCityRegionId(this->getId()); addVisitor(object); DLOG(INFO) << player->getFirstName().getAnsi() << " entered " << mCityName << " (" << mVisitingPlayers.size() << " players in city)"; }
void City::onObjectLeave(Object* object) { PlayerObject* player = (PlayerObject*)object; //if(player->getCityRegionId() == this->getId()) //player->setCityRegionId(0); removeVisitor(object); DLOG(INFO) << player->getFirstName().getAnsi() << " left " << mCityName << " (" << mVisitingPlayers.size() << " players in city)"; }
void City::onObjectLeave(Object* object) { PlayerObject* player = (PlayerObject*)object; //if(player->getCityRegionId() == this->getId()) //player->setCityRegionId(0); removeKnownObject(object); gLogger->log(LogManager::DEBUG,"%s left %s (%u players in city)",player->getFirstName().getAnsi(),mCityName.getAnsi(),mKnownPlayers.size()); }
//====================================================================================================================== // // Discards the contents of a harvesters Hopper // void ObjectController::_handleDiscardHopper(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if(!player) { return; } //do we have a valid structure ??? uint64 id = targetId; Object* object = gWorldManager->getObjectById(id); PlayerStructure* structure = dynamic_cast<PlayerStructure*>(object); if(!structure) { //gMessageLib->sendSystemMessage(player,L"","player_structure","command_no_building"); return; } //is the structure in Range??? float fTransferDistance = gWorldConfig->getConfiguration<float>("Player_Structure_Operate_Distance",(float)10.0); if(glm::distance(player->mPosition, structure->mPosition) > fTransferDistance) { return; } StructureAsyncCommand command; command.Command = Structure_Command_DiscardHopper; command.PlayerId = player->getId(); command.StructureId = structure->getId(); gStructureManager->checkNameOnPermissionList(structure->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); }
bool WorldManager::addObject(Object* object,bool manual) { uint64 key = object->getId(); //make sure objects arnt added several times!!!! if(getObjectById(key)) { gLogger->logMsgF("WorldManager::addObject Object already existant added several times or ID messup ???",MSG_HIGH); return false; } mObjectMap.insert(key,object); // if we want to set the parent manually or the object is from the snapshots and not a building, return if(manual) { return true; } #if defined(_MSC_VER) if(object->getId() < 0x0000000100000000 && object->getType() != ObjType_Building) #else if(object->getId() < 0x0000000100000000LLU && object->getType() != ObjType_Building) #endif { // check if a crafting station - in that case add Item* item = dynamic_cast<Item*> (object); if(item) { if(!(item->getItemFamily() == ItemFamily_CraftingStations)) return true; } else { return true; } } switch(object->getType()) { // player, when a player enters a planet case ObjType_Player: { PlayerObject* player = dynamic_cast<PlayerObject*>(object); gLogger->logMsgF("New Player: %"PRIu64", Total Players on zone : %i",MSG_NORMAL,player->getId(),(getPlayerAccMap())->size() + 1); // insert into the player map mPlayerAccMap.insert(std::make_pair(player->getAccountId(),player)); // insert into cell if(player->getParentId()) { player->setSubZoneId(0); if(CellObject* cell = dynamic_cast<CellObject*>(getObjectById(player->getParentId()))) { cell->addObjectSecure(player); } else { gLogger->logMsgF("WorldManager::addObject: couldn't find cell %"PRIu64"",MSG_HIGH,player->getParentId()); } } // query the rtree for the qt region we are in else { if(QTRegion* region = mSpatialIndex->getQTRegion(player->mPosition.x,player->mPosition.z)) { player->setSubZoneId((uint32)region->getId()); region->mTree->addObject(player); } else { // we should never get here ! gLogger->logMsg("WorldManager::addObject: could not find zone region in map"); return false; } } // initialize initObjectsInRange(player); gMessageLib->sendCreatePlayer(player,player); // add ham to regeneration scheduler player->getHam()->updateRegenRates(); // ERU: Note sure if this is needed here. player->getHam()->checkForRegen(); // onPlayerEntered event, notify scripts string params; params.setLength(sprintf(params.getAnsi(),"%s %s %u",getPlanetNameThis(),player->getFirstName().getAnsi(),static_cast<uint32>(mPlayerAccMap.size()))); mWorldScriptsListener.handleScriptEvent("onPlayerEntered",params); // Start player world position update. Used when player don't get any events from client (player not moving). // addPlayerMovementUpdateTime(player, 1000); } break; case ObjType_Structure: { // HarvesterObject* harvester = dynamic_cast<HarvesterObject*>(object); mStructureList.push_back(object->getId()); mSpatialIndex->InsertPoint(key,object->mPosition.x,object->mPosition.z); } break; case ObjType_Building: { mStructureList.push_back(object->getId()); BuildingObject* building = dynamic_cast<BuildingObject*>(object); mSpatialIndex->InsertRegion(key,building->mPosition.x,building->mPosition.z,building->getWidth(),building->getHeight()); } break; case ObjType_Tangible: { uint64 parentId = object->getParentId(); if(parentId == 0) { mSpatialIndex->InsertPoint(key,object->mPosition.x,object->mPosition.z); } else { CellObject* cell = dynamic_cast<CellObject*>(getObjectById(parentId)); if(cell) cell->addObjectSecure(object); else gLogger->logMsgF("WorldManager::addObject couldn't find cell %"PRIu64"",MSG_NORMAL,parentId); } } break; // TODO: add moving creatures to qtregions case ObjType_NPC: case ObjType_Creature: case ObjType_Lair: { CreatureObject* creature = dynamic_cast<CreatureObject*>(object); if(creature->getCreoGroup() == CreoGroup_Shuttle) mShuttleList.push_back(dynamic_cast<Shuttle*>(creature)); uint64 parentId = creature->getParentId(); if(parentId) { CellObject* cell = dynamic_cast<CellObject*>(getObjectById(parentId)); if(cell) cell->addObjectSecure(creature); else gLogger->logMsgF("WorldManager::addObject: couldn't find cell %"PRIu64"",MSG_HIGH,parentId); } else { switch(creature->getCreoGroup()) { // moving creature, add to QT case CreoGroup_Vehicle : { if(QTRegion* region = mSpatialIndex->getQTRegion(creature->mPosition.x,creature->mPosition.z)) { creature->setSubZoneId((uint32)region->getId()); region->mTree->addObject(creature); } else { gLogger->logMsg("WorldManager::addObject: could not find zone region in map for creature"); return false; } } break; // still creature, add to SI default : { mSpatialIndex->InsertPoint(key,creature->mPosition.x,creature->mPosition.z); } } } } break; case ObjType_Region: { RegionObject* region = dynamic_cast<RegionObject*>(object); mRegionMap.insert(std::make_pair(key,region)); mSpatialIndex->InsertRegion(key,region->mPosition.x,region->mPosition.z,region->getWidth(),region->getHeight()); if(region->getActive()) addActiveRegion(region); } break; case ObjType_Intangible: { gLogger->logMsgF("Object of type ObjType_Intangible UNHANDLED in WorldManager::addObject:",MSG_HIGH); } break; default: { gLogger->logMsgF("Unhandled ObjectType in WorldManager::addObject: PRId32",MSG_HIGH,object->getType()); // Please, when adding new stufff, at least take the time to add a stub for that type. // Better fail always, than have random crashes. assert(false && "WorldManager::addObject Unhandled ObjectType"); } break; } return true; }
void PlayerStructureTerminal::handleObjectMenuSelect(uint8 messageType,Object* srcObject) { PlayerObject* player = (PlayerObject*)srcObject; if ((!player) ||(!player->isConnected())) { gLogger->logMsgF("HarvesterObject::handleObjectMenuSelect::could not find player",MSG_HIGH); return; } switch(messageType) { case radId_serverTerminalPermissionsBanned: { StructureAsyncCommand command; command.Command = Structure_Command_PermissionBan; command.PlayerId = player->getId(); command.StructureId = this->getStructure(); gStructureManager->checkNameOnPermissionList(this->getStructure(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalPermissionsEnter: { StructureAsyncCommand command; command.Command = Structure_Command_PermissionEntry; command.PlayerId = player->getId(); command.StructureId = this->getStructure(); gStructureManager->checkNameOnPermissionList(this->getStructure(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalPermissionsAdmin: { StructureAsyncCommand command; command.Command = Structure_Command_PermissionAdmin; command.PlayerId = player->getId(); command.StructureId = this->getStructure(); gStructureManager->checkNameOnPermissionList(this->getStructure(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalManagementPrivacy: { StructureAsyncCommand command; command.Command = Structure_Command_Privacy; command.PlayerId = player->getId(); command.StructureId = this->getStructure(); gStructureManager->checkNameOnPermissionList(this->getStructure(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalManagementDestroy: { StructureAsyncCommand command; command.Command = Structure_Command_Destroy; command.PlayerId = player->getId(); command.StructureId = this->getStructure(); gStructureManager->checkNameOnPermissionList(this->getStructure(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalManagementStatus: { StructureAsyncCommand command; command.Command = Structure_Command_ViewStatus; command.PlayerId = player->getId(); command.StructureId = this->getStructure(); gStructureManager->checkNameOnPermissionList(this->getStructure(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalManagementPay: { StructureAsyncCommand command; command.Command = Structure_Command_PayMaintenance; command.PlayerId = player->getId(); command.StructureId = this->getStructure(); gStructureManager->checkNameOnPermissionList(this->getStructure(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; default: break; } }
void ObjectController::_handleAdminSysMsg(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { bool status = false; BString dataStr; message->getStringUnicode16(dataStr); PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if ((player) && (player->isConnected())) { // gMessageLib->sendSystemMessage(player, dataStr, true); dataStr.convert(BSTRType_ANSI); gLogger->log(LogManager::DEBUG,"Admin (%s): %s", player->getFirstName().getAnsi(), dataStr.getAnsi()); } else { dataStr.convert(BSTRType_ANSI); gLogger->log(LogManager::DEBUG,"Admin (anon): %s", dataStr.getAnsi()); } int8 rawData[128]; rawData[0] = 0; if (dataStr.getLength()) { int32 elementCount = sscanf(dataStr.getAnsi(), "%80s", rawData); BString adminCommand(rawData); if (elementCount > 0) { int32 commandIndex = this->getAdminCommandFunction(adminCommand); if (commandIndex >= 0) { // We have a valid command name, but strip it. It can be an abreviation. int32 index = indexOfNextField(dataStr); if (index < 0) { // Not all commands have payload. index = dataStr.getLength(); } BString ansiData; ansiData.setLength(dataStr.getLength()); dataStr.substring(ansiData,static_cast<uint16>(index), dataStr.getLength()); // Now ADD a proper spelled command. It HAS to match the crc. BString newCommandString; newCommandString.setLength(adminCommands[commandIndex].command.getLength() + ansiData.getLength() + 1); sprintf(newCommandString.getAnsi(),"%s %s", adminCommands[commandIndex].command.getAnsi(), ansiData.getAnsi()); // Execute the command. BString opcodeStr(adminCommands[commandIndex].command); opcodeStr.toLower(); newCommandString.convert(BSTRType_Unicode16); // Now let's parse it BACK to objectcontroller, so we can continue to maintain access rights control as initial designed. gMessageFactory->StartMessage(); gMessageFactory->addUint32(0); // clientTicks, We do not have these, here. gMessageFactory->addUint32(0); // sequence number, we really need this gMessageFactory->addUint32(opcodeStr.getCrc()); // opCode for new command. gMessageFactory->addUint64(targetId); gMessageFactory->addString(newCommandString); Message* newMessage = gMessageFactory->EndMessage(); newMessage->ResetIndex(); this->enqueueCommandMessage(newMessage); status = true; } else { // Invalid command. sprintf(rawData,"Admin: [%s No such command]", adminCommand.getAnsi()); } } else { sprintf(rawData,"Admin: [Unexpected error]"); } } else { sprintf(rawData,"Admin: [Missing command]"); } // Send reply to caller. if (!status) { this->sendAdminFeedback(rawData); } }
void FactoryObject::handleObjectMenuSelect(uint8 messageType,Object* srcObject) { PlayerObject* player = dynamic_cast<PlayerObject*>(srcObject); if(!player) { gLogger->logMsgF("FactoryObject::handleObjectMenuSelect::could not find player",MSG_HIGH); return; } switch(messageType) { case radId_StopManufacture: { StructureAsyncCommand command; command.Command = Structure_Command_StopFactory; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_StartManufacture: { StructureAsyncCommand command; command.Command = Structure_Command_StartFactory; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverManfHopperInput: { StructureAsyncCommand command; command.Command = Structure_Command_AccessInHopper; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"HOPPER",command); } break; case radId_serverManfHopperOutput: { StructureAsyncCommand command; command.Command = Structure_Command_AccessOutHopper; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"HOPPER",command); } break; case radId_serverManfStationSchematic: { StructureAsyncCommand command; command.Command = Structure_Command_AccessSchem; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_StructureStatus: { StructureAsyncCommand command; command.Command = Structure_Command_ViewStatus; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_depositPower: { StructureAsyncCommand command; command.Command = Structure_Command_DepositPower; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_payMaintenance: { StructureAsyncCommand command; command.Command = Structure_Command_PayMaintenance; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalManagementDestroy: { //is there a manufacturing schematic inside ??? StructureAsyncCommand command; command.Command = Structure_Command_Destroy; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalPermissionsAdmin: { StructureAsyncCommand command; command.Command = Structure_Command_PermissionAdmin; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalPermissionsHopper: { StructureAsyncCommand command; command.Command = Structure_Command_PermissionHopper; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_setName: { StructureAsyncCommand command; command.Command = Structure_Command_RenameStructure; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; } }
void HarvesterObject::handleObjectMenuSelect(uint8 messageType,Object* srcObject) { PlayerObject* player = dynamic_cast<PlayerObject*>(srcObject); if(!player) { gLogger->log(LogManager::DEBUG,"HarvesterObject::handleObjectMenuSelect::could not find player"); return; } switch(messageType) { case radId_StructureStatus: { StructureAsyncCommand command; command.Command = Structure_Command_ViewStatus; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_depositPower: { StructureAsyncCommand command; command.Command = Structure_Command_DepositPower; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_payMaintenance: { StructureAsyncCommand command; command.Command = Structure_Command_PayMaintenance; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalManagementDestroy: { StructureAsyncCommand command; command.Command = Structure_Command_Destroy; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalPermissionsAdmin: { StructureAsyncCommand command; command.Command = Structure_Command_PermissionAdmin; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_serverTerminalPermissionsHopper: { StructureAsyncCommand command; command.Command = Structure_Command_PermissionHopper; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_setName: { StructureAsyncCommand command; command.Command = Structure_Command_RenameStructure; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case radId_operateHarvester: { StructureAsyncCommand command; command.Command = Structure_Command_OperateHarvester; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"HOPPER",command); } break; } }
void ObjectController::handleResourceEmptyHopper(Message* message) { uint64 playerId; uint64 harvesterId; message->getUint64(playerId); message->getUint64(harvesterId); PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if(!player) { return; } //do we have a valid structure ??? Object* object = gWorldManager->getObjectById(harvesterId); PlayerStructure* structure = dynamic_cast<PlayerStructure*>(object); if(!structure) { //gMessageLib->sendSystemMessage(player,L"","player_structure","command_no_building"); return; } //is the structure in Range??? float fTransferDistance = gWorldConfig->getConfiguration<float>("Player_Structure_Operate_Distance",(float)10.0); if(glm::distance(player->mPosition, structure->mPosition) > fTransferDistance) { return; } uint64 resourceId; uint32 amount; uint8 b1, b2; message->getUint64(resourceId); message->getUint32(amount); message->getUint8(b1); message->getUint8(b2); StructureAsyncCommand command; if(b1 == 0) { command.Command = Structure_Command_RetrieveResource; command.PlayerId = player->getId(); command.StructureId = structure->getId(); command.ResourceId = resourceId; command.Amount = amount; command.b1 = b1; command.b2 = b2; } if(b1 == 1) { command.Command = Structure_Command_DiscardResource; command.PlayerId = player->getId(); command.StructureId = structure->getId(); command.ResourceId = resourceId; command.Amount = amount; command.b1 = b1; command.b2 = b2; } gStructureManager->checkNameOnPermissionList(structure->getId(),player->getId(),player->getFirstName().getAnsi(),"HOPPER",command); }
void ObjectController::_handleAddFriend(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if(player->getContactListUpdatePending()) return; else player->setContactListUpdatePending(true); string friendName; int8 sql[1024],end[16],*sqlPointer; message->getStringUnicode16(friendName); friendName.convert(BSTRType_ANSI); if(!friendName.getLength()) { player->setContactListUpdatePending(false); return; } if(player->isConnected()) gMessageLib->sendHeartBeat(player->getClient()); friendName.toLower(); // check if he's already our friend if(player->checkFriendList(friendName.getCrc())) { friendName.convert(BSTRType_Unicode16); gMessageLib->sendSystemMessage(player,L"","cmnty","friend_duplicate","","",L"",0,"","",friendName.getUnicode16()); player->setContactListUpdatePending(false); return; } // or ignored if(player->checkIgnoreList(friendName.getCrc())) { friendName.convert(BSTRType_Unicode16); gMessageLib->sendSystemMessage(player,L"","cmnty","friend_fail_is_ignored","","",L"",0,"","",friendName.getUnicode16()); player->setContactListUpdatePending(false); return; } // check our own name string firstName = player->getFirstName().getAnsi(); firstName.toLower(); if(strcmp(firstName.getAnsi(),friendName.getAnsi()) == 0) { player->setContactListUpdatePending(false); return; } // pull the db query ObjControllerAsyncContainer* asyncContainer = new(mDBAsyncContainerPool.malloc()) ObjControllerAsyncContainer(OCQuery_AddFriend); asyncContainer->mString = friendName.getAnsi(); sprintf(sql,"SELECT sf_addFriend(%"PRIu64",'",player->getId()); sprintf(end,"')"); sqlPointer = sql + strlen(sql); sqlPointer += mDatabase->Escape_String(sqlPointer,friendName.getAnsi(),friendName.getLength()); strcat(sql,end); mDatabase->ExecuteSqlAsync(this,asyncContainer,sql); }
//====================================================================================================================== // // Modifies the Admin List // void ObjectController::_handleModifyPermissionList(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); if(!player) { DLOG(INFO) << " ObjectController::_handleModifyPermissionList Player not found"; return; } //find out where our structure is BString dataStr; message->getStringUnicode16(dataStr); BString playerStr,list,action; dataStr.convert(BSTRType_ANSI); int8 s1[64],s2[32],s3[32]; sscanf(dataStr.getAnsi(),"%32s %16s %16s",s1, s2, s3); playerStr = s1; list = s2; action = s3; if(playerStr.getLength() > 40) { gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "permission_40_char"), player); return; } //TODO is target a structure?? used when using the commandline option uint64 id = player->getTargetId(); Object* object = gWorldManager->getObjectById(id); PlayerStructure* structure = dynamic_cast<PlayerStructure*>(object); //if we have no structure that way, see whether we have a structure were we just used the adminlist if(!structure) { id = player->getStructurePermissionId(); Object* object = gWorldManager->getObjectById(id); structure = dynamic_cast<PlayerStructure*>(object); } if(!structure) { return; } //is the structure in Range??? float fAdminListDistance = gWorldConfig->getConfiguration<float>("Player_Admin_List_Distance",(float)32.0); if(player->getParentId()) { if(CellObject* cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(player->getParentId()))) { if(HouseObject* house = dynamic_cast<HouseObject*>(gWorldManager->getObjectById(cell->getParentId()))) { if(house->getId() != structure->getId()) { gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "command_no_building"), player); return; } } } } else if(glm::distance(player->mPosition, structure->mPosition) > fAdminListDistance) { gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "command_no_building"), player); return; } player->setStructurePermissionId(0); StructureAsyncCommand command; command.PlayerId = player->getId(); command.StructureId = structure->getId(); command.List = list; command.PlayerStr = playerStr; if(action == "add") { command.Command = Structure_Command_AddPermission; gStructureManager->checkNameOnPermissionList(structure->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } if(action == "remove") { command.Command = Structure_Command_RemovePermission; gStructureManager->checkNameOnPermissionList(structure->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } }
void WorldManager::destroyObject(Object* object) { switch(object->getType()) { case ObjType_Player: { //destroys knownObjects in the destructor PlayerObject* player = dynamic_cast<PlayerObject*>(object); // moved most of the code to the players destructor // onPlayerLeft event, notify scripts string params; params.setLength(sprintf(params.getAnsi(),"%s %s %u",getPlanetNameThis(),player->getFirstName().getAnsi(),static_cast<uint32>(mPlayerAccMap.size()))); mWorldScriptsListener.handleScriptEvent("onPlayerLeft",params); // gLogger->logMsg("WorldManager::destroyObject: Player Client set to NULL"); delete player->getClient(); player->setClient(NULL); player->setConnectionState(PlayerConnState_Destroying); } break; case ObjType_NPC: case ObjType_Creature: { CreatureObject* creature = dynamic_cast<CreatureObject*>(object); // remove any timers we got running removeCreatureHamToProcess(creature->getHam()->getTaskId()); // remove from cell / SI if (!object->getParentId()) { // Not all objects-creatures of this type are points. if(creature->getSubZoneId()) { if(QTRegion* region = getQTRegion(creature->getSubZoneId())) { creature->setSubZoneId(0); region->mTree->removeObject(creature); } } else { mSpatialIndex->RemovePoint(object->getId(),object->mPosition.x,object->mPosition.z); } } else { if(CellObject* cell = dynamic_cast<CellObject*>(getObjectById(object->getParentId()))) { cell->removeObject(object); } else { //gLogger->logMsgF("WorldManager::destroyObject: couldn't find cell %"PRIu64"",MSG_HIGH,object->getParentId()); } } // destroy known objects object->destroyKnownObjects(); // if its a shuttle, remove it from the shuttle list if(creature->getCreoGroup() == CreoGroup_Shuttle) { ShuttleList::iterator shuttleIt = mShuttleList.begin(); while(shuttleIt != mShuttleList.end()) { if((*shuttleIt)->getId() == creature->getId()) { mShuttleList.erase(shuttleIt); break; } ++shuttleIt; } } } break; case ObjType_Structure: { // cave what do we do with player cities ?? // then the parent Id should be the region object. shouldnt it???? if(object->getSubZoneId()) { if(QTRegion* region = getQTRegion(object->getSubZoneId())) { object->setSubZoneId(0); region->mTree->removeObject(object); } } else { mSpatialIndex->RemovePoint(object->getId(),object->mPosition.x,object->mPosition.z); } object->destroyKnownObjects(); //remove it out of the worldmanagers structurelist now that it is deleted ObjectIDList::iterator itStruct = mStructureList.begin(); while(itStruct != mStructureList.end()) { if((*itStruct)==object->getId()) itStruct = mStructureList.erase(itStruct); else itStruct++; } } break; case ObjType_Building: { BuildingObject* building = dynamic_cast<BuildingObject*>(object); if(building) { if(object->getSubZoneId()) { if(QTRegion* region = getQTRegion(object->getSubZoneId())) { object->setSubZoneId(0); region->mTree->removeObject(object); } } else { //mSpatialIndex->InsertRegion(key,building->mPosition.x,building->mPosition.z,building->getWidth(),building->getHeight()); mSpatialIndex->RemoveRegion(object->getId(),object->mPosition.x-building->getWidth(),object->mPosition.z-building->getHeight(),object->mPosition.x+building->getWidth(),object->mPosition.z+building->getHeight()); } //remove it out of the worldmanagers structurelist now that it is deleted ObjectIDList::iterator itStruct = mStructureList.begin(); while(itStruct != mStructureList.end()) { if((*itStruct)==object->getId()) itStruct = mStructureList.erase(itStruct); else itStruct++; } } else gLogger->logMsgF("WorldManager::destroyObject: nearly did not remove: %"PRIu64"s knownObjectList",MSG_HIGH,object->getId()); object->destroyKnownObjects(); } break; case ObjType_Cell: { //a cell shouldnt have knownobjects ... -that should be checked to make sure it is true object->destroyKnownObjects(); } break; case ObjType_Tangible: { if(TangibleObject* tangible = dynamic_cast<TangibleObject*>(object)) { uint64 parentId = tangible->getParentId(); if(parentId == 0) { mSpatialIndex->RemovePoint(tangible->getId(),tangible->mPosition.x,tangible->mPosition.z); } else { if(CellObject* cell = dynamic_cast<CellObject*>(getObjectById(parentId))) { cell->removeObject(object); } else { // Well, Tangible can have more kind of parents than just cells or SI. For example players or Inventory. // the tangible is owned by its containing object (please note exeption of inventory / player with equipped stuff) // however we should leave the object link in the worldmanagers Objectmap and only store references in the object // we will have great trouble finding items otherwise //gLogger->logMsgF("WorldManager::destroyObject couldn't find cell %"PRIu64"",MSG_NORMAL,parentId); } } } else { gLogger->logMsgF("WorldManager::destroyObject: error removing : %"PRIu64"",MSG_HIGH,object->getId()); } // destroy known objects object->destroyKnownObjects(); } break; case ObjType_Region: { RegionMap::iterator it = mRegionMap.find(object->getId()); if(it != mRegionMap.end()) { mRegionMap.erase(it); } else { gLogger->logMsgF("Worldmanager::destroyObject: Could not find region %"PRIu64"",MSG_NORMAL,object->getId()); } //camp regions are in here, too QTRegionMap::iterator itQ = mQTRegionMap.find(static_cast<uint32>(object->getId())); if(itQ != mQTRegionMap.end()) { mQTRegionMap.erase(itQ); gLogger->logMsgF("Worldmanager::destroyObject: qt region %"PRIu64"",MSG_HIGH,object->getId()); } object->destroyKnownObjects(); } break; case ObjType_Intangible: { gLogger->logMsgF("Object of type ObjType_Intangible almost UNHANDLED in WorldManager::destroyObject:",MSG_HIGH); // intangibles are controllers / pets in the datapad // they are NOT in the world //we really shouldnt have any of thoose object->destroyKnownObjects(); } break; default: { gLogger->logMsgF("Unhandled ObjectType in WorldManager::destroyObject: %u",MSG_HIGH,(uint32)(object->getType())); // Please, when adding new stufff, at least take the time to add a stub for that type. // Better fail always, than have random crashes. assert(false && "WorldManager::destroyObject Unhandled ObjectType"); } break; } object->destroyKnownObjects(); // finally delete it ObjectMap::iterator objMapIt = mObjectMap.find(object->getId()); if(objMapIt != mObjectMap.end()) { mObjectMap.erase(objMapIt); } else { gLogger->logMsgF("WorldManager::destroyObject: error removing from objectmap: %"PRIu64"",MSG_HIGH,object->getId()); } }
void StructureManager::_HandleStructureTransferLotsRecipient(StructureManagerAsyncContainer* asynContainer,DatabaseResult* result) { PlayerStructure* structure = dynamic_cast<PlayerStructure*>(gWorldManager->getObjectById(asynContainer->mStructureId)); PlayerObject* donor = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(asynContainer->mPlayerId)); PlayerObject* recipient = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(asynContainer->mTargetId)); uint8 lots; DataBinding* binding = mDatabase->CreateDataBinding(1); binding->addField(DFT_uint8,0,1); uint64 count; count = result->getRowCount(); if(!count) { gLogger->logMsgF("StructureManager::Transfer Structure Admin List Callback couldnt get recipients lots",MSG_HIGH); mDatabase->DestroyDataBinding(binding); return; } //thats lots in use result->GetNextRow(binding,&lots); uint8 requiredLots = structure->getLotCount(); uint8 freelots = gWorldConfig->getConfiguration("Player_Max_Lots",(uint8)10) - lots; if(freelots >= requiredLots) { //yay we were succesful structure->setOwner(asynContainer->mTargetId); mDatabase->ExecuteSqlAsync(0,0,"UPDATE structures SET structures.owner = %I64u WHERE structures.id = %I64u",asynContainer->mTargetId,asynContainer->mStructureId); mDatabase->ExecuteSqlAsync(0,0,"DELETE FROM structure_admin_data where playerId = %I64u AND StructureID = %I64u",asynContainer->mPlayerId,asynContainer->mStructureId); mDatabase->ExecuteSqlAsync(0,0,"INSERT INTO structure_admin_data VALUES (NULL,%I64u,%I64u,'ADMIN')",asynContainer->mStructureId, asynContainer->mTargetId); //update the administration list if(donor) { gMessageLib->sendSystemMessage(donor,L"","player_structure","ownership_transferred_out","",asynContainer->name); } if(recipient) { gMessageLib->sendSystemMessage(recipient,L"","player_structure","ownership_transferred_in","",donor->getFirstName().getAnsi()); } } else { //say something } mDatabase->DestroyDataBinding(binding); }
void PlayerStructure::handleUIEvent(uint32 action,int32 element,BString inputStr,UIWindow* window) { PlayerObject* player = window->getOwner(); // action is zero for ok !!! if(!player || (action) || player->isIncapacitated() || player->isDead()) { return; } switch(window->getWindowType()) { case SUI_Window_Factory_Schematics: { uint64 ManSchemId = 0; //check for use schematic BString b = window->getOption3(); b.convert(BSTRType_ANSI); if(strcmp(b.getAnsi(),"false") == 0) { WindowAsyncContainerCommand* asyncContainer = (WindowAsyncContainerCommand*)window->getAsyncContainer(); if(!asyncContainer) { return; } if(asyncContainer->SortedList.size()) ManSchemId = asyncContainer->SortedList.at(element); else { SAFE_DELETE(asyncContainer); gMessageLib->SendSystemMessage(::common::OutOfBand("manf_station", "schematic_not_added"), player); return; } SAFE_DELETE(asyncContainer); StructureAsyncCommand command; command.Command = Structure_Command_AddSchem; command.PlayerId = player->getId(); command.StructureId = this->getId(); command.SchematicId = ManSchemId; gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"HOPPER",command); } else if(strcmp(b.getAnsi(),"true") == 0) //remove schematic pressed { WindowAsyncContainerCommand* asyncContainer = (WindowAsyncContainerCommand*)window->getAsyncContainer(); SAFE_DELETE(asyncContainer); StructureAsyncCommand command; command.Command = Structure_Command_RemoveSchem; command.PlayerId = player->getId(); command.StructureId = this->getId(); command.SchematicId = ManSchemId; gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"HOPPER",command); } } break; case SUI_Window_Structure_Status: { //we want to refresh StructureAsyncCommand command; command.Command = Structure_Command_ViewStatus; command.PlayerId = player->getId(); command.StructureId = this->getId(); gStructureManager->checkNameOnPermissionList(this->getId(),player->getId(),player->getFirstName().getAnsi(),"ADMIN",command); } break; case SUI_Window_Structure_Delete: { gStructureManager->createNewStructureDeleteConfirmBox(player,this ); } break; case SUI_Window_Structure_Rename: { inputStr.convert(BSTRType_ANSI); if(!inputStr.getLength()) { //hmmm no answer - remain as it is? return; } if(inputStr.getLength() > 68) { //hmmm no answer - remain as it is? gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "not_valid_name"), player); return; } //inputStr.convert(BSTRType_Unicode16); this->setCustomName(inputStr.getAnsi()); gMessageLib->sendNewHarvesterName(this); //update db!!! // pull the db query int8 sql[255],end[128],*sqlPointer; sprintf(sql,"UPDATE %s.structures SET structures.name = '",gWorldManager->getDatabase()->galaxy()); sprintf(end,"' WHERE structures.ID = %" PRIu64 "",this->getId()); sqlPointer = sql + strlen(sql); sqlPointer += gWorldManager->getDatabase()->escapeString(sqlPointer,inputStr.getAnsi(),inputStr.getLength()); strcat(sql,end); gWorldManager->getDatabase()->executeSqlAsync(0,0,sql); } break; case SUI_Window_Structure_Delete_Confirm: { inputStr.convert(BSTRType_ANSI); if(inputStr.getCrc() == this->getCode().getCrc()) { if((this->checkStatesEither(PlayerStructureState_Destroy))) { //dont start structure destruction more than once return; } this->toggleStateOn(PlayerStructureState_Destroy); //delete it mTTS.todo = ttE_Delete; mTTS.playerId = player->getId(); gStructureManager->addStructureforDestruction(this->getId()); } else { int8 text[255]; sprintf(text,"@player_structure:incorrect_destroy_code"); gUIManager->createNewMessageBox(NULL,"","SWG::ANH",text,player); } //we need to get the input } } }