void ProtocolSpectator::addDummyCreature(NetworkMessage& msg, const uint32_t& creatureID, const Position& playerPos) { // add dummy creature CreatureType_t creatureType = CREATURETYPE_NPC; if(creatureID <= 0x10000000) { creatureType = CREATURETYPE_PLAYER; } else if(creatureID <= 0x40000000) { creatureType = CREATURETYPE_MONSTER; } msg.addByte(0x6A); msg.addPosition(playerPos); msg.addByte(1); //stackpos msg.add<uint16_t>(0x61); // is not known msg.add<uint32_t>(0); // remove no creature msg.add<uint32_t>(creatureID); // creature id msg.addByte(creatureType); // creature type msg.addString("Dummy"); msg.addByte(0x00); // health percent msg.addByte(DIRECTION_NORTH); // direction AddOutfit(msg, player->getCurrentOutfit()); // outfit msg.addByte(0); // light level msg.addByte(0); // light color msg.add<uint16_t>(200); // speed msg.addByte(SKULL_NONE); // skull type msg.addByte(SHIELD_NONE); // party shield msg.addByte(GUILDEMBLEM_NONE); // guild emblem msg.addByte(creatureType); // creature type msg.addByte(SPEECHBUBBLE_NONE); // speechbubble msg.addByte(0xFF); // MARK_UNMARKED msg.add<uint16_t>(0x00); // helpers msg.addByte(0); // walkThrough }
/**\brief Parse one player out of an xml node */ bool Player::FromXMLNode( xmlDocPtr doc, xmlNodePtr node ) { xmlNodePtr attr; string value; Coordinate pos; if( (attr = FirstChildNamed(node,"name")) ){ SetName(NodeToString(doc,attr)); } if( (attr = FirstChildNamed(node, "planet"))){ string temp; xmlNodePtr name = FirstChildNamed(attr,"name"); lastPlanet = NodeToString(doc,name); Planet* p = Planets::Instance()->GetPlanet( lastPlanet ); if( p != NULL ) { SetWorldPosition( p->GetWorldPosition() ); } }else return false; if( (attr = FirstChildNamed(node,"model")) ){ value = NodeToString(doc,attr); Model* model = Models::Instance()->GetModel( value ); if( NULL!=model) { SetModel( model ); } else { LogMsg(ERR,"No such model as '%s'", value.c_str()); return false; } } else return false; if( (attr = FirstChildNamed(node,"engine")) ){ value = NodeToString(doc,attr); Engine* engine = Engines::Instance()->GetEngine( value ); if( NULL!=engine) { SetEngine( engine ); } else { LogMsg(ERR,"No such engine as '%s'", value.c_str()); return false; } } else return false; if( (attr = FirstChildNamed(node,"credits")) ){ value = NodeToString(doc,attr); SetCredits( atoi(value.c_str()) ); } else return false; for( attr = FirstChildNamed(node,"weapon"); attr!=NULL; attr = NextSiblingNamed(attr,"weapon") ){ AddShipWeapon( NodeToString(doc,attr) ); } for( attr = FirstChildNamed(node,"outfit"); attr!=NULL; attr = NextSiblingNamed(attr,"outfit") ){ AddOutfit( NodeToString(doc,attr) ); } for( attr = FirstChildNamed(node,"cargo"); attr!=NULL; attr = NextSiblingNamed(attr,"cargo") ){ xmlNodePtr type = FirstChildNamed(attr,"type"); xmlNodePtr ammt = FirstChildNamed(attr,"amount"); if(!type || !ammt) return false; if( NodeToInt(doc,ammt) > 0 ) { StoreCommodities( NodeToString(doc,type), NodeToInt(doc,ammt) ); } } for( attr = FirstChildNamed(node,"ammo"); attr!=NULL; attr = NextSiblingNamed(attr,"ammo") ){ xmlNodePtr type = FirstChildNamed(attr,"type"); xmlNodePtr ammt = FirstChildNamed(attr,"amount"); if(!type || !ammt) return false; AmmoType ammoType = Weapon::AmmoNameToType( NodeToString(doc,type) ); int ammoCount = NodeToInt(doc,ammt); if( ammoType < max_ammo ) { AddAmmo( ammoType, ammoCount ); } else return false; } for( attr = FirstChildNamed(node,"Mission"); attr!=NULL; attr = NextSiblingNamed(attr,"Mission") ){ Mission *mission = Mission::FromXMLNode(doc,attr); if( mission != NULL ) { LogMsg(INFO, "Successfully loaded the %s mission of player '%s'", mission->GetName().c_str(), this->GetName().c_str() ); missions.push_back( mission ); } else { LogMsg(INFO, "Aborted loading mission of player '%s'", this->GetName().c_str() ); } } for( attr = FirstChildNamed(node,"favor"); attr!=NULL; attr = NextSiblingNamed(attr,"favor") ){ xmlNodePtr alliance = FirstChildNamed(attr,"alliance"); xmlNodePtr value = FirstChildNamed(attr,"value"); if(!alliance || !value) return false; if( NodeToInt(doc,value) > 0 ) { UpdateFavor( NodeToString(doc,alliance), NodeToInt(doc,value) ); } } for( attr = FirstChildNamed(node,"hiredEscort"); attr!=NULL; attr = NextSiblingNamed(attr,"hiredEscort") ){ xmlNodePtr typePtr = FirstChildNamed(attr, "type"); xmlNodePtr payPtr = FirstChildNamed(attr, "pay"); assert(typePtr && payPtr); if(!typePtr || !payPtr) return false; string type = NodeToString(doc, typePtr); int pay = atoi( NodeToString(doc, payPtr).c_str() ); // Adding it with sprite ID -1 means it's up to player.lua to go ahead and create the correct sprite. this->AddHiredEscort(type, pay, -1); } if(this->ConfigureWeaponSlots(doc, node)){ // great - it worked LogMsg( INFO, "Successfully loaded weapon slots"); } else { LogMsg( ERR, "Weapon slot XML helper failed to configure weapon slots"); } if( (attr = FirstChildNamed(node,"lastLoadTime")) ){ lastLoadTime = NodeToInt(doc,attr); } else { lastLoadTime = (time_t)0; } RemoveLuaControlFunc(); return true; }
void ProtocolGameBase::AddCreature(NetworkMessage& msg, const Creature* creature, bool known, uint32_t remove) { CreatureType_t creatureType = creature->getType(); const Player* otherPlayer = creature->getPlayer(); if (known) { msg.add<uint16_t>(0x62); msg.add<uint32_t>(creature->getID()); } else { msg.add<uint16_t>(0x61); msg.add<uint32_t>(remove); msg.add<uint32_t>(creature->getID()); msg.addByte(creatureType); msg.addString(creature->getName()); } if (creature->isHealthHidden()) { msg.addByte(0x00); } else { msg.addByte(std::ceil((static_cast<double>(creature->getHealth()) / std::max<int32_t>(creature->getMaxHealth(), 1)) * 100)); } msg.addByte(creature->getDirection()); if (!creature->isInGhostMode() && !creature->isInvisible()) { AddOutfit(msg, creature->getCurrentOutfit()); } else { static Outfit_t outfit; AddOutfit(msg, outfit); } LightInfo lightInfo; creature->getCreatureLight(lightInfo); msg.addByte(player->isAccessPlayer() ? 0xFF : lightInfo.level); msg.addByte(lightInfo.color); msg.add<uint16_t>(creature->getStepSpeed() / 2); msg.addByte(player->getSkullClient(creature)); msg.addByte(player->getPartyShield(otherPlayer)); if (!known) { msg.addByte(player->getGuildEmblem(otherPlayer)); } if (creatureType == CREATURETYPE_MONSTER) { const Creature* master = creature->getMaster(); if (master) { const Player* masterPlayer = master->getPlayer(); if (masterPlayer) { if (masterPlayer == player) { creatureType = CREATURETYPE_SUMMON_OWN; } else { creatureType = CREATURETYPE_SUMMON_OTHERS; } } } } msg.addByte(creatureType); // Type (for summons) msg.addByte(creature->getSpeechBubble()); msg.addByte(0xFF); // MARK_UNMARKED if (otherPlayer) { msg.add<uint16_t>(otherPlayer->getHelpers()); } else { msg.add<uint16_t>(0x00); } msg.addByte(player->canWalkthroughEx(creature) ? 0x00 : 0x01); }