//====================================================================================================================== // // create player // bool MessageLib::sendCreatePlayer(PlayerObject* playerObject,PlayerObject* targetObject) { if(!_checkPlayer(targetObject)) return(false); sendCreateObjectByCRC(playerObject,targetObject,false); if(targetObject == playerObject) { sendBaselinesCREO_1(playerObject); sendBaselinesCREO_4(playerObject); } sendBaselinesCREO_3(playerObject,targetObject); sendBaselinesCREO_6(playerObject,targetObject); sendCreateObjectByCRC(playerObject,targetObject,true); sendContainmentMessage(playerObject->getPlayerObjId(),playerObject->getId(),4,targetObject); sendBaselinesPLAY_3(playerObject,targetObject); sendBaselinesPLAY_6(playerObject,targetObject); if(targetObject == playerObject) { sendBaselinesPLAY_8(playerObject,targetObject); sendBaselinesPLAY_9(playerObject,targetObject); } //close the yalp sendEndBaselines(playerObject->getPlayerObjId(),targetObject); sendPostureMessage(playerObject,targetObject); if(playerObject->getParentId()) { sendContainmentMessage(playerObject->getId(),playerObject->getParentId(),4,targetObject); } if(targetObject == playerObject) { // tangible objects if(TangibleObject* hair = dynamic_cast<TangibleObject*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Hair))) { //only create the hair as the helmet will be created at a different time if(hair->getTangibleType() == TanType_Hair) { sendCreateTangible(hair,targetObject); } } // create inventory and contents if(dynamic_cast<TangibleObject*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Inventory))) { sendInventory(playerObject); } // mission bag if(TangibleObject* missionBag = dynamic_cast<TangibleObject*>(playerObject->getEquipManager()->getEquippedObject(CreatureEquipSlot_Mission))) { gMessageLib->sendCreateTangible(missionBag,playerObject); //Now iterate through the missions and create them clientside MissionBag* mbag = dynamic_cast<MissionBag*> (missionBag); MissionList::iterator it = mbag->getMissions()->begin(); while(it != mbag->getMissions()->end()) { MissionObject* mission = dynamic_cast<MissionObject*>(*it); sendCreateObjectByCRC(mission, targetObject, false); sendContainmentMessage(mission->getId(), mbag->getId(), 4, targetObject); sendBaselinesMISO_3(mission, targetObject); sendBaselinesMISO_6(mission, targetObject); sendBaselinesMISO_8(mission, targetObject); sendBaselinesMISO_9(mission, targetObject); sendEndBaselines(mission->getId(), targetObject); ++it; } } // datapad Datapad* datapad = playerObject->getDataPad(); if(datapad) { //would be nice to use the tangibles objectcontainer for the datapad //need to get missionobjects intangibles, Man Schematics, waypoints and stuff in though, so better do it manually gMessageLib->sendCreateTangible(datapad,playerObject); //now iterate through the schematics and create them clientside Datapad* dpad = dynamic_cast<Datapad*> (datapad); ManufacturingSchematicList* manufacturingSchematics = dpad->getManufacturingSchematics(); ManufacturingSchematicList::iterator it = manufacturingSchematics->begin(); while(it != manufacturingSchematics->end()) { gMessageLib->sendCreateManufacturingSchematic((dynamic_cast<ManufacturingSchematic*>(*it)),playerObject ,false); ++it; } //Send player's intangibles vehicles,pets,droids...etc DataList* intangibles = dpad->getData(); DataList::iterator ite = intangibles->begin(); while(ite != intangibles->end()) { if(IntangibleObject* itno = dynamic_cast<IntangibleObject*>(*ite)) { gMessageLib->sendCreateInTangible(itno, dpad->getId(), playerObject); //dont add it to the MainObjectMap //gWorldManager->addObject(itno,true); switch(itno->getItnoGroup()) { case ItnoGroup_Vehicle: { // set Owner for vehicles if(VehicleController* vehicle = dynamic_cast<VehicleController*>(itno)) { vehicle->set_owner(playerObject); } } break; default: break; } } ++ite; } //Should send accepted missions here } } //equipped items are already in the creo6 so only send them for ourselves sendEndBaselines(playerObject->getId(),targetObject); sendUpdatePvpStatus(playerObject,targetObject); if(targetObject == playerObject) { // We are actually sending this info from CharacterLoginHandler::handleDispatchMessage at the opCmdSceneReady event. // sendFriendListPlay9(playerObject); // sendIgnoreListPlay9(playerObject); //request the GRUP baselines from chatserver if grouped if(playerObject->getGroupId() != 0) { gMessageLib->sendIsmGroupBaselineRequest(playerObject); } } //Player mounts if(playerObject->checkIfMountCalled()) { if(playerObject->getMount()) { gMessageLib->sendCreateObject(playerObject->getMount(),targetObject); if(playerObject->checkIfMounted()) { gMessageLib->sendContainmentMessage(playerObject->getId(), playerObject->getMount()->getId(), 0xffffffff, targetObject); } } } return(true); }
void ProtocolGameBase::sendAddCreature(const Creature* creature, const Position& pos, int32_t stackpos, bool isLogin) { if (!canSee(pos)) { return; } if (creature != player) { if (stackpos != -1) { NetworkMessage msg; msg.addByte(0x6A); msg.addPosition(pos); msg.addByte(stackpos); bool known; uint32_t removedKnown; checkCreatureAsKnown(creature->getID(), known, removedKnown); AddCreature(msg, creature, known, removedKnown); writeToOutputBuffer(msg); } if (isLogin) { sendMagicEffect(pos, CONST_ME_TELEPORT); } return; } NetworkMessage msg; msg.addByte(0x17); msg.add<uint32_t>(player->getID()); msg.add<uint16_t>(0x32); // beat duration (50) msg.addDouble(Creature::speedA, 3); msg.addDouble(Creature::speedB, 3); msg.addDouble(Creature::speedC, 3); // can report bugs? if (player->getAccountType() >= ACCOUNT_TYPE_TUTOR) { msg.addByte(0x01); } else { msg.addByte(0x00); } msg.addByte(0x00); // can change pvp framing option msg.addByte(0x00); // expert mode button enabled msg.addString("http://static.tibia.com/images/store/"); msg.addByte(3); writeToOutputBuffer(msg); sendPendingStateEntered(); sendEnterWorld(); sendMapDescription(pos); if (isLogin) { sendMagicEffect(pos, CONST_ME_TELEPORT); } sendInventoryItem(CONST_SLOT_HEAD, player->getInventoryItem(CONST_SLOT_HEAD)); sendInventoryItem(CONST_SLOT_NECKLACE, player->getInventoryItem(CONST_SLOT_NECKLACE)); sendInventoryItem(CONST_SLOT_BACKPACK, player->getInventoryItem(CONST_SLOT_BACKPACK)); sendInventoryItem(CONST_SLOT_ARMOR, player->getInventoryItem(CONST_SLOT_ARMOR)); sendInventoryItem(CONST_SLOT_RIGHT, player->getInventoryItem(CONST_SLOT_RIGHT)); sendInventoryItem(CONST_SLOT_LEFT, player->getInventoryItem(CONST_SLOT_LEFT)); sendInventoryItem(CONST_SLOT_LEGS, player->getInventoryItem(CONST_SLOT_LEGS)); sendInventoryItem(CONST_SLOT_FEET, player->getInventoryItem(CONST_SLOT_FEET)); sendInventoryItem(CONST_SLOT_RING, player->getInventoryItem(CONST_SLOT_RING)); sendInventoryItem(CONST_SLOT_AMMO, player->getInventoryItem(CONST_SLOT_AMMO)); sendStats(); sendSkills(); //gameworld light-settings LightInfo lightInfo; g_game.getWorldLightInfo(lightInfo); sendWorldLight(lightInfo); //player light level sendCreatureLight(creature); const std::forward_list<VIPEntry>& vipEntries = IOLoginData::getVIPEntries(player->getAccount()); if (player->isAccessPlayer()) { for (const VIPEntry& entry : vipEntries) { VipStatus_t vipStatus; Player* vipPlayer = g_game.getPlayerByGUID(entry.guid); if (!vipPlayer) { vipStatus = VIPSTATUS_OFFLINE; } else { vipStatus = VIPSTATUS_ONLINE; } sendVIP(entry.guid, entry.name, entry.description, entry.icon, entry.notify, vipStatus); } } else { for (const VIPEntry& entry : vipEntries) { VipStatus_t vipStatus; Player* vipPlayer = g_game.getPlayerByGUID(entry.guid); if (!vipPlayer || vipPlayer->isInGhostMode()) { vipStatus = VIPSTATUS_OFFLINE; } else { vipStatus = VIPSTATUS_ONLINE; } sendVIP(entry.guid, entry.name, entry.description, entry.icon, entry.notify, vipStatus); } } sendBasicData(); sendInventory(); player->sendIcons(); }