本文整理汇总了C++中PlayerObject::getParentId方法的典型用法代码示例。如果您正苦于以下问题:C++ PlayerObject::getParentId方法的具体用法?C++ PlayerObject::getParentId怎么用?C++ PlayerObject::getParentId使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类PlayerObject
的用法示例。
在下文中一共展示了PlayerObject::getParentId方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: handleObjectMenuSelect
void TicketCollector::handleObjectMenuSelect(uint8 messageType,Object* srcObject)
{
if(messageType == radId_itemUse)
{
PlayerObject* playerObject = dynamic_cast<PlayerObject*>(srcObject);
// don't use while incapped or dead or in combat
if(playerObject->isIncapacitated() || playerObject->isDead() || playerObject->states.checkState(CreatureState_Combat))
{
return;
}
// in range check for shuttle not for the droid
if(playerObject->getParentId() != mParentId || (glm::distance(playerObject->mPosition, mShuttle->mPosition) > 25.0f))
{
gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "boarding_too_far"), playerObject);
return;
}
if(playerObject->checkUIWindow("handleTicketSelect"))
{
gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "boarding_ticket_selection"), playerObject);
return;
}
if(mShuttle)
{
mShuttle->useShuttle(playerObject);
}
}
else
DLOG(info) << "TravelTerminal: Unhandled MenuSelect: " << messageType;
}
示例2: _handleBoardTransport
void ObjectController::_handleBoardTransport(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
PlayerObject* playerObject = dynamic_cast<PlayerObject*>(mObject);
ObjectSet inRangeObjects;
float boardingRange = 25.0;
if(playerObject->states.getPosture() == CreaturePosture_SkillAnimating)
{
gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), playerObject);
return;
}
BString str;
message->getStringUnicode16(str);
str.convert(BSTRType_ANSI);
str.toLower();
if((str.getCrc() != BString("transport").getCrc()))
{
gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "boarding_what_shuttle"), playerObject);
return;
}
gSpatialIndexManager->getObjectsInRange(playerObject,&inRangeObjects,ObjType_Creature | ObjType_NPC, boardingRange, true);
// iterate through the results
ObjectSet::iterator it = inRangeObjects.begin();
while(it != inRangeObjects.end())
{
if(Shuttle* shuttle = dynamic_cast<Shuttle*>(*it))
{
// in range check
if(playerObject->getParentId() != shuttle->getParentId())
{
gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "boarding_too_far"), playerObject);
return;
}
if (!shuttle->availableInPort())
{
gMessageLib->SendSystemMessage(::common::OutOfBand("travel", "shuttle_not_available"), playerObject);
return;
}
shuttle->useShuttle(playerObject);
return;
}
++it;
}
gMessageLib->SendSystemMessage(::common::OutOfBand("structure/structure_messages", "boarding_what_shuttle"), playerObject);
}
示例3: _handleMount
void ObjectController::_handleMount(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
// The very idea with using ID's instead of object refs are that you can TEST them without using the object itself.
// And some parameter validation...
if (targetId == 0)
{
DLOG(info) << "ObjectController::_handleMount : Cannot find vehicle ID :(";
return;
}
PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
if (player && player->getMount() && (player->getParentId() == 0))
{
// Do we have a valid target?
if (!player->checkIfMounted())
{
// verify its player's mount
MountObject* pet = dynamic_cast<MountObject*>(gWorldManager->getObjectById(targetId));
if (pet && (pet->owner() == player->getId()))
{
// get the mount Vehicle object by the id (Creature object id - 1 )
if(VehicleController* vehicle = dynamic_cast<VehicleController*>(gWorldManager->getObjectById(pet->controller())))
{
//The /mount command can work up to 32m on live
if(glm::distance(vehicle->body()->mPosition, player->mPosition) <= 32) {
//change locomotion
vehicle->MountPlayer();
} else {
gMessageLib->SendSystemMessage(L"Your target is too far away to mount.", player);
}
}
else
{
DLOG(info) << "ObjectController::_handleMount : Cannot find vehicle";
}
}
} else {
gMessageLib->SendSystemMessage(L"You cannot mount this because you are already mounted.", player);
}
}
}
示例4: _handleDismount
void ObjectController::_handleDismount(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
// The very idea with using ID's instead of object refs are that you can TEST them without using the object itself.
// And some parameter validation...
PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
if (player && player->getMount() && (player->getParentId() == 0))
{
if (player->checkIfMounted())
{
// verify its player's mount
MountObject* pet = NULL;
if (targetId == 0)
{
// No object targeted, assume the one we are riding. - what else should we dismount ???
pet = player->getMount();
}
else
{
pet = dynamic_cast<MountObject*>(gWorldManager->getObjectById(targetId));
}
if (pet && (pet->owner() == player->getId()))
{
// get the pets controller for a swoop its the vehicle
if(VehicleController* vehicle = dynamic_cast<VehicleController*>(gWorldManager->getObjectById(pet->controller())))
{
vehicle->DismountPlayer();
}
}
}
else
{
gMessageLib->SendSystemMessage(L"You are not mounted to perform this action.", player);
}
}
}
示例5: handleObjectMenuSelect
void ElevatorTerminal::handleObjectMenuSelect(uint8 messageType,Object* srcObject)
{
PlayerObject* playerObject = dynamic_cast<PlayerObject*>(srcObject);
if(!playerObject || !playerObject->isConnected() || playerObject->getSamplingState() || playerObject->isIncapacitated() || playerObject->isDead())
{
return;
}
if(messageType == radId_elevatorUp)
{
gMessageLib->sendPlayClientEffectObjectMessage(gWorldManager->getClientEffect(mEffectUp),"",playerObject);
// remove player from current position, elevators can only be inside
CellObject* cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(playerObject->getParentId()));
if(cell)
{
cell->removeObject(playerObject);
}
else
{
gLogger->logMsgF("could not find cell %"PRIu64"",MSG_HIGH,playerObject->getParentId());
}
// put him into new one
playerObject->mDirection = mDstDirUp;
playerObject->mPosition = mDstPosUp;
playerObject->setParentId(mDstCellUp);
cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(mDstCellUp));
if(cell)
{
cell->addObjectSecure(playerObject);
}
else
{
gLogger->logMsgF("could not find cell %"PRIu64"",MSG_HIGH,mDstCellUp);
}
gMessageLib->sendDataTransformWithParent(playerObject);
}
else if(messageType == radId_elevatorDown)
{
gMessageLib->sendPlayClientEffectObjectMessage(gWorldManager->getClientEffect(mEffectDown),"",playerObject);
// remove player from current position, elevators can only be inside
CellObject* cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(playerObject->getParentId()));
if(cell)
{
cell->removeObject(playerObject);
}
else
{
gLogger->logMsgF("could not find cell %"PRIu64"",MSG_HIGH,playerObject->getParentId());
}
// put him into new one
playerObject->mDirection = mDstDirDown;
playerObject->mPosition = mDstPosDown;
playerObject->setParentId(mDstCellDown);
cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(mDstCellDown));
if(cell)
{
cell->addObjectSecure(playerObject);
}
else
{
gLogger->logMsgF("could not find cell %"PRIu64"",MSG_HIGH,mDstCellDown);
}
gMessageLib->sendDataTransformWithParent(playerObject);
}
else
{
gLogger->logMsgF("ElevatorTerminal: Unhandled MenuSelect: %u",MSG_HIGH,messageType);
}
}
示例6: handleDataTransformWithParent
void ObjectController::handleDataTransformWithParent(Message* message,bool inRangeUpdate)
{
// FIXME: for now assume we only get messages from players
PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
glm::vec3 pos;
glm::quat dir;
uint32 inMoveCount;
uint32 tickCount;
uint64 parentId;
float speed;
bool updateAll = false;
// get tick and move counters
tickCount = message->getUint32();
inMoveCount = message->getUint32();
// only process if its in sequence
if (player->getInMoveCount() <= inMoveCount)
{
uint64 oldParentId = player->getParentId();
//uint32 ticks = tickCount - player->getClientTickCount();
// update tick and move counters
player->setClientTickCount(tickCount);
player->setInMoveCount(inMoveCount);
// get new direction, position, parent and speed
parentId = message->getUint64();
dir.x = message->getFloat();
dir.y = message->getFloat();
dir.z = message->getFloat();
dir.w = message->getFloat();
pos.x = message->getFloat();
pos.y = message->getFloat();
pos.z = message->getFloat();
speed = message->getFloat();
// gLogger->logMsgF("Position inside = %f, %f, %f",MSG_NORMAL, pos.x, pos.y, pos.z);
// gLogger->logMsgF("Direction = %f, %f, %f, %f",MSG_NORMAL, dir.x, dir.y, dir.z, dir.w);
// stop entertaining, if we were
if(player->getPerformingState() != PlayerPerformance_None && player->getPosture() != CreaturePosture_SkillAnimating)
{
gEntertainerManager->stopEntertaining(player);
}
// if we changed cell
if (oldParentId != parentId)
{
CellObject* cell = NULL;
// gLogger->logMsgF("We changed cell from (%"PRIu64") to (%"PRIu64")",MSG_NORMAL, oldParentId, parentId);
// Remove us from whatever we where in before.
// (4 for add and 0 for remove)
gMessageLib->broadcastContainmentMessage(player->getId(),oldParentId,0,player);
// only remove us from si, if we just entered the building
if (oldParentId != 0)
{
if((cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(oldParentId))))
{
cell->removeObject(player);
// Done above.. gMessageLib->broadcastContainmentMessage(player->getId(),parentId,4,player);
}
else
{
gLogger->logMsgF("Error removing %"PRIu64" from cell(%"PRIu64")",MSG_NORMAL,player->getId(),oldParentId);
}
}
else
{
updateAll = true; // We just entered the building.
// remove us from qt
if(player->getSubZoneId())
{
if(QTRegion* region = gWorldManager->getQTRegion(player->getSubZoneId()))
{
player->setSubZoneId(0);
region->mTree->removeObject(player);
//If our player is mounted lets update his mount aswell
if(player->checkIfMounted() && player->getMount())
{
player->getMount()->setSubZoneId(0);
region->mTree->removeObject(player->getMount());
//Can't ride into a building with a mount! :-p
//However, its easy to do so we have handling incase the client is tricked.
// the vehicle is the INTANGIBLE Datapad Controller
// the *vehicle* itself is the BODY
if(Vehicle* datapad_pet = dynamic_cast<Vehicle*>(gWorldManager->getObjectById(player->getMount()->getPetController())))
{
//.........这里部分代码省略.........
示例7: HandleItemMoveDown_
//======================================================================================================================
//
// moves an item
//
void ObjectController::HandleItemMoveDown_(
uint64 targetId,
Message* message,
ObjectControllerCmdProperties* cmdProperties) {
PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
if (!player) {
assert(false && "ObjectController::HandleItemMoveDown_ Player not found");
return;
}
// Verify that there was a target passed.
if (!targetId) {
gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "move_what"), player);
return;
}
Object* object = gWorldManager->getObjectById(targetId);
if(!object) {
assert(false && "ObjectController::HandleItemMoveDown_ item not found");
return;
}
// Verify that the item and player are in the same structure.
// Verify that the item and player are in the same structure.
CellObject* playerCell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(player->getParentId()));
if(!playerCell) {
gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "move_what"), player);
return;
}
uint64 playerStructure = playerCell->getParentId();
CellObject* objectCell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(object->getParentId()));
if(!objectCell) {
gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "move_what"), player);
return;
}
uint64 objectStructure = objectCell->getParentId();
if (objectStructure != playerStructure) {
gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "move_what"), player);
return;
}
// Verify that the player has appropriate rights on this structure.
if (playerCell) {
if (BuildingObject* building = dynamic_cast<BuildingObject*>(gWorldManager->getObjectById(playerCell->getParentId()))) {
if (!building->hasAdminRights(player->getId())) {
gMessageLib->SendSystemMessage(::common::OutOfBand("player_structure", "admin_move_only"), player);
return;
}
} else {
assert(false && "ObjectController::HandleItemMoveDown_ no structure");
return;
}
} else {
//were just outside??
return;
}
object->mPosition.y -= MOVE_INCREMENT;
gMessageLib->sendDataTransformWithParent053(object);
object->updateWorldPosition();
}
示例8: playerWorldUpdate
uint64 ObjectController::playerWorldUpdate(bool forcedUpdate)
{
PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
// If we already are busy, don't start another update.
// ie if this is called by the worldmanager timer because we still have unupdated objects
// in our resultmap
if (!(mUpdatingObjects || mDestroyOutOfRangeObjects || forcedUpdate))
{
// If we have been inactive for too long, let's update the world.
if (player->getCurrentSpeed() == 0.0)
{
//is this the amount of full updates already running ?
if (++mFullUpdateTrigger >= 15) // We only check this when we are running idle with low frequency
{
// gLogger->logMsg("... sitting still to long!");
// Let's update the world
forcedUpdate = true;
mFullUpdateTrigger = 0;
}
}
else
{
mFullUpdateTrigger = 0;
}
}
// Are we inside or outside?
if (player->getParentId() != 0)
{
// We are inside.
if (mUpdatingObjects || forcedUpdate)
{
// Just entered the building?
// if (!mUpdatingObjects)
// We need to abort any pending operation if we get a forcedUpdate (meaning entered, changed or left a cell or subzone).
if (forcedUpdate)
{
// Update all.
// gLogger->logMsg("ObjController::handleDataTransformWithParent: _findInRangeObjectsInside(true)");
_findInRangeObjectsInside(true);
}
}
else
{
// This is the faster update, stil based on SI though.
_findInRangeObjectsInside(false);
}
// Update some of the objects we found.
mUpdatingObjects = !_updateInRangeObjectsInside();
}
else
{
// We are outside.
bool OutOfUpdateRange = false;
// If we "just stopped" and not busy with updating, make a full update.
if (!mUpdatingObjects && !mDestroyOutOfRangeObjects)
{
// We are not "busy" processing anything from previous sessions.
if (player->getCurrentSpeed() == 0.0)
{
if (mMovementInactivityTrigger > 0)
{
if (--mMovementInactivityTrigger == 0)
{
// gLogger->logMsg("We are not moving...");
// We are not moving, but how far are we from last full update pos?
if (glm::distance(player->mPosition, player->getLastUpdatePosition()) < 16)
{
// Force a full update, inclusive of saving current "update pos".
// gLogger->logMsg("... forced update!");
OutOfUpdateRange = true;
}
else
{
// gLogger->logMsgF("... but to close to last update pos, %.1f",MSG_NORMAL, player->mPosition.distance2D(player->getLastUpdatePosition()));
}
}
}
}
else
{
mMovementInactivityTrigger = 2; // We only check this when we are running idle with slow frequency
// Need to be standstill for this amount of seconds * 5 (or whatever time we use for slow updates) before we update.
}
}
// Position check for SI-update.
OutOfUpdateRange |= !(glm::distance(player->mPosition, player->getLastUpdatePosition()) < 64.0f);
//OutOfUpdateRange |= !(player->mPosition.inRange2D(player->getLastUpdatePosition(),64.0f));
// gLogger->logMsgF("Distance = %f",MSG_NORMAL, player->mPosition.distance2D(player->getLastUpdatePosition()));
if (mUpdatingObjects || forcedUpdate || OutOfUpdateRange)
{
// More than 64 m from where we loaded SI, reload it.
// We need to abort any pending operation if we get a forcedUpdate (meaning entered, changed or left a cell or subzone).
if ((forcedUpdate) || OutOfUpdateRange)
//.........这里部分代码省略.........
示例9: checkContainingContainer
bool ObjectController::checkContainingContainer(uint64 containingContainer, uint64 playerId)
{
Object* container = gWorldManager->getObjectById(containingContainer);
if(!container)
{
//it might be our inventory or the inventory of a creature were looting
//PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(playerId));
if(containingContainer == (playerId + INVENTORY_OFFSET))
{
//its our inventory ... - return true
return true;
}
return false;
}
if(containingContainer == playerId)
{
//its us
return true;
}
uint64 ownerId = gSpatialIndexManager->getObjectMainParent(container);
Object* object = dynamic_cast<Object*>(gWorldManager->getObjectById(ownerId));
//it might be the inventory
if(!object)
{
//Hack ourselves an inventory .... - its not part of the world ObjectMap
if((ownerId - INVENTORY_OFFSET) == playerId)
{
object = gWorldManager->getObjectById(playerId);
}
}
if(BuildingObject* building = dynamic_cast<BuildingObject*>(object))
{
if(building->hasAdminRights(playerId) || gWorldConfig->isTutorial())
{
return true;
}
return false;
}
if(CellObject* cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(ownerId)))
{
if(BuildingObject* building = dynamic_cast<BuildingObject*>(gWorldManager->getObjectById(cell->getParentId())))
{
if(building->hasAdminRights(playerId))
{
//now test whether we are in the same building
PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(playerId));
if(CellObject* playercell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(player->getParentId())))
{
if(BuildingObject* playerparent = dynamic_cast<BuildingObject*>(gWorldManager->getObjectById(playercell->getParentId())))
{
//still get in a range check ???
return true;
}
}
}
}
return false;
}
if(PlayerObject* player = dynamic_cast<PlayerObject*>(object))
{
if(player->getId() == playerId)
{
return true;
}
else
return false;
}
//todo handle factory hoppers
//todo handle loot permissions
if(CreatureObject* creature = dynamic_cast<CreatureObject*>(object))
{
}
return true;
}
示例10: _updateInRangeObjectsInside
bool ObjectController::_updateInRangeObjectsInside()
{
PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
CellObject* playerCell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(player->getParentId()));
// make sure we got a cell
if (!playerCell)
{
gLogger->logMsgF("Error getting cell %"PRIu64" for %"PRIu64" type %u",MSG_NORMAL,player->getParentId(),player->getId(),player->getType());
return true; // We are done, nothing we can do...
}
// We may wan't to limit the amount of messages sent in one session.
uint32 updatedObjects = 0;
const uint32 objectSendLimit = 50;
//what do we do if the object has been deleted in the meantime?
//TODO
while ((mObjectSetIt != mInRangeObjects.end()) && (updatedObjects < objectSendLimit))
{
// Object* object = (*mObjectSetIt);
// Needed since object may be invalid due to the multi-session approach of this function.
Object* object = dynamic_cast<Object*>(*mObjectSetIt);
// Create objects that are in the same building as we are OR outside near the building.
if ((object) && (!player->checkKnownObjects(object)))
{
bool validObject = true; // Assume it's an object we shall add.
// Object inside a building ?
if (object->getParentId())
{
validObject = false;
// Yes, get the objects cell.
CellObject* objectCell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(object->getParentId()));
if (objectCell)
{
// Are we in the same building?
if (objectCell->getParentId() == playerCell->getParentId())
{
// We are in the same building as the object.
validObject = true;
}
}
else
{
gLogger->logMsgF("Error getting cell %"PRIu64" for %"PRIu64" type %u",MSG_NORMAL,object->getParentId(),object->getId(),object->getType());
}
}
if (validObject)
{
// send the according create for the type of object
#if defined(_MSC_VER)
if (object->getId() > 0x0000000100000000)
#else
if (object->getId() > 0x0000000100000000LLU)
#endif
{
//if its an instance and per chance *our* instance
if (object->getPrivateOwner()&&object->isOwnedBy(player))
{
gMessageLib->sendCreateObject(object,player);
player->addKnownObjectSafe(object);
object->addKnownObjectSafe(player);
updatedObjects++;
}
else
{
//if(!player->checkKnownObjects(object))
//{
gMessageLib->sendCreateObject(object,player);
player->addKnownObjectSafe(object);
object->addKnownObjectSafe(player);
updatedObjects++;
//}
}
}
}
}
++mObjectSetIt;
}
return (mObjectSetIt == mInRangeObjects.end());
}
示例11: if
//======================================================================================================================
//
// Modifies the Admin List
//
void ObjectController::_handleModifyPermissionList(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
CreatureObject* creature = dynamic_cast<CreatureObject*>(mObject); PlayerObject* player = creature->GetGhost();
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->GetCreature()->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->GetCreature()->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.getAnsi();
if(action == "add")
{
command.Command = Structure_Command_AddPermission;
gStructureManager->checkNameOnPermissionList(structure->getId(),player->getId(),player->GetCreature()->getFirstName(),"ADMIN",command);
//addNametoPermissionList(command.StructureId, command.PlayerId, command.PlayerStr, command.List);
}
if(action == "remove")
{
command.Command = Structure_Command_RemovePermission;
gStructureManager->checkNameOnPermissionList(structure->getId(),player->getId(),player->GetCreature()->getFirstName(),"ADMIN",command);
}
}
示例12: _handleNPCConversationStart
void ObjectController::_handleNPCConversationStart(uint64 targetId,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
NPCObject* npc = dynamic_cast<NPCObject*>(gWorldManager->getObjectById(targetId));
if(!npc)
{
DLOG(info) << "ObjController::_handleNPCConversationStart: Couldn't find object " << targetId;
return;
}
// in range check
uint64 playerParentId = player->getParentId();
uint64 npcParentId = npc->getParentId();
bool inRange = true;
uint64 playerBuildingId = 0;
uint64 npcBuildingId = 0;
//get building Ids if they are in buildings
if(playerParentId)
{
playerBuildingId = gWorldManager->getObjectById(playerParentId)->getParentId();
}
if(npcParentId)
{
npcBuildingId = gWorldManager->getObjectById(npcParentId)->getParentId();
}
// not inside same parent, or out of range
float distance = glm::distance(player->getWorldPosition(), npc->getWorldPosition());
if ((npcBuildingId != playerParentId) || distance > 10.0f)
{
inRange = false;
}
// we are out of range
if(!inRange)
{
float distance = glm::distance(player->mPosition, npc->mPosition);
char buffer[100];
sprintf(buffer, "You are out of range (%f m).", distance);
BString msg(buffer);
msg.convert(BSTRType_Unicode16);
gMessageLib->SendSystemMessage(msg.getUnicode16(), player);
// gMessageLib->sendSystemMessage(player,L"","system_msg","out_of_range");
return;
}
//check to see if he is part of a mission
/*if(gMissionManager->checkDeliverMission(player,npc) ||
gMissionManager->checkCraftingMission(player,npc)
) return;*/
// we don't want him to talk
if(npc->hasInternalAttribute("no_chat"))
return;
// initiate a conversation dialog
if(npc->hasInternalAttribute("base_conversation"))
{
// Let the npc have your attention, and some npc-movement.
npc->prepareConversation(player);
gConversationManager->startConversation(npc,player);
}
// say some chatter
else
{
// spam protection
uint64 localTime = Anh_Utils::Clock::getSingleton()->getLocalTime();
if(npc->getLastConversationTarget() == player->getId())
{
if(localTime - npc->getLastConversationRequest() < NPC_CHAT_SPAM_PROTECTION_TIME)
{
return;
}
else
{
npc->setLastConversationRequest(localTime);
}
}
else
{
npc->setLastConversationRequest(localTime);
npc->setLastConversationTarget(player->getId());
}
// Let the npc have your attention, and some npc-movement.
// Nope... npc->prepareConversation(player);
std::wstring npc_chat;
uint32_t animation = 0;
// say a specific preset sentence
if(npc->hasInternalAttribute("npc_chat")) {
std::string tmp = npc->getInternalAttribute<std::string>("npc_chat");
npc_chat = std::wstring(tmp.begin(), tmp.end());
} else {
std::pair<std::wstring,uint32> chat = gWorldManager->getRandNpcChatter();
//.........这里部分代码省略.........
示例13: handleDataTransform
void ObjectController::handleDataTransform(Message* message,bool inRangeUpdate)
{
PlayerObject* player = dynamic_cast<PlayerObject*>(mObject);
if (!player)
{
gLogger->logMsgF("ObjectController::handleDataTransform Object is NOT A PLAYER, id = %"PRIu64"", MSG_HIGH, mObject->getId());
return;
}
glm::vec3 pos;
glm::quat dir;
uint32 inMoveCount;
uint32 tickCount;
float speed;
bool updateAll = false;
// get tick and move counters
tickCount = message->getUint32();
inMoveCount = message->getUint32();
// gLogger->logMsg("ObjectController::handleDataTransform");
//uint64 localTimeStart = Anh_Utils::Clock::getSingleton()->getLocalTime();
// only process if its in sequence
if(player->getInMoveCount() >= inMoveCount)
{
return;
}
//uint32 ticks = tickCount - player->getClientTickCount();
// update tick and move counters...
player->setLastMoveTick(tickCount);
player->setClientTickCount(tickCount);
player->setInMoveCount(inMoveCount);
if(player->checkIfMounted() && player->getMount())
{
//Player is mounted lets update his mount too
player->getMount()->setLastMoveTick(tickCount);
//player->getMount()->setInMoveCount((inMoveCount+1));
player->getMount()->setInMoveCount((inMoveCount)); // + 1 or nor does not matter, as long as we update inMoveCount.
}
// get new direction, position and speed
dir.x = message->getFloat();
dir.y = message->getFloat();
dir.z = message->getFloat();
dir.w = message->getFloat();
pos.x = message->getFloat();
pos.y = message->getFloat();
pos.z = message->getFloat();
speed = message->getFloat();
// gLogger->logMsgF("Position outside = %.2f, %.2f, %.2f",MSG_NORMAL, pos.x, pos.y, pos.z);
/*
if (Heightmap::isHeightmapCacheAvaliable())
{
gLogger->logMsgF("Heightmap value = %.2f",MSG_NORMAL, Heightmap::Instance()->getCachedHeightAt2DPosition(pos.x, pos.z));
}
*/
// gLogger->logMsgF("Direction = %f, %f, %f, %f",MSG_NORMAL, dir.x, dir.y, dir.z, dir.w);
// stop entertaining, if we were
// important is, that if we move we change our posture to NOT skill animating anymore!
// so only stop entertaining when we are performing and NOT skillanimationg
if(player->getPerformingState() != PlayerPerformance_None && player->getPosture() != CreaturePosture_SkillAnimating)
{
gEntertainerManager->stopEntertaining(player);
}
// if we just left a building
if(player->getParentId() != 0)
{
updateAll = true;
// Testing with 4 for add and 0 for remove.
// Remove us from previous cell.
gMessageLib->broadcastContainmentMessage(player->getId(),player->getParentId(),0,player);
// remove us from the last cell we were in
if(CellObject* cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(player->getParentId())))
{
cell->removeObject(player);
}
else
{
gLogger->logMsgF("Error removing %"PRIu64" from cell(%"PRIu64")",MSG_HIGH,player->getId(),player->getParentId());
}
// we are outside again
player->setParentId(0);
player->mPosition = pos;
// Add us to the world.
gMessageLib->broadcastContainmentMessage(player->getId(),0,4,player);
//.........这里部分代码省略.........
示例14: handleRequestSurvey
bool ArtisanManager::handleRequestSurvey(Object* playerObject,Object* target,Message* message,ObjectControllerCmdProperties* cmdProperties)
{
PlayerObject* player = dynamic_cast<PlayerObject*>(playerObject);
std::shared_ptr<SimpleEvent> start_survey_event = nullptr;
if(cmdProperties)
mSurveyMindCost = cmdProperties->mMindCost;
// don't allow survey in buildings
if(player->getParentId())
{
gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_in_structure"), player);
return false;
}
if(player->getPerformingState() != PlayerPerformance_None)
{
gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "wrong_state"), player);
return false;
}
if(player->getSurveyState())
{
gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_cant"), player);
return false;
}
if(player->getSamplingState())
{
gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "survey_sample"), player);
return false;
}
SurveyTool* tool = dynamic_cast<SurveyTool*>(target);
CurrentResource* resource = NULL;
BString resourceName;
message->getStringUnicode16(resourceName);
resourceName.convert(BSTRType_ANSI);
resource = reinterpret_cast<CurrentResource*>(gResourceManager->getResourceByNameCRC(resourceName.getCrc()));
if(tool && resource)
{
player->setSurveyState(true);
// play effect
std::string effect = gWorldManager->getClientEffect(tool->getInternalAttribute<uint32>("survey_effect"));
gMessageLib->sendPlayClientEffectLocMessage(effect,player->mPosition,player);
PlayerObjectSet* playerList = player->getKnownPlayers();
PlayerObjectSet::iterator it = playerList->begin();
while(it != playerList->end())
{
gMessageLib->sendPlayClientEffectLocMessage(effect,player->mPosition,(*it));
++it;
}
uint32 mindCost = mSurveyMindCost;
Ham* hamz = player->getHam();
//are we able to sample in the first place ??
if(!hamz->checkMainPools(0,0,mindCost))
{
int32 myMind = hamz->mAction.getCurrentHitPoints();
//return message for sampling cancel based on HAM
if(myMind < (int32)mindCost)
{
gMessageLib->SendSystemMessage(::common::OutOfBand("error_message", "sample_mind"), player);
}
//message for stop sampling
gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "sample_cancel"), player);
player->getSampleData()->mPendingSurvey = false;
hamz->updateRegenRates();
player->updateMovementProperties();
return false;
}
hamz->performSpecialAction(0,0,(float)mindCost,HamProperty_CurrentHitpoints);
// send system message
resourceName.convert(BSTRType_Unicode16);
gMessageLib->SendSystemMessage(::common::OutOfBand("survey", "start_survey", L"", L"", resourceName.getUnicode16()), player);
// schedule execution
start_survey_event = std::make_shared<SimpleEvent>(EventType("start_survey"),0, 5000,
std::bind(&ArtisanManager::surveyEvent, this, player, resource, tool));
}
else
{
gMessageLib->SendSystemMessage(::common::OutOfBand("ui","survey_nothingfound"));
return false;
}
// notify any listeners
if (start_survey_event)
gEventDispatcher.Notify(start_survey_event);
return true;
}
示例15: addObject
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:
//.........这里部分代码省略.........