Advertisement
Guest User

Untitled

a guest
Mar 26th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.51 KB | None | 0 0
  1. bool Map::placeCreature(const Position& centerPos, Creature* creature, bool extendedPos /*= false*/, bool forced /*= false*/)
  2. {
  3. Monster* monster = creature->getMonster();
  4. if(monster && g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL))
  5. {
  6. uint8_t level;
  7. if(!monster->getMonsterType()->hideLevel)
  8. {
  9. if(monster->isSummon())
  10. {
  11. std::string value;
  12. monster->getMaster()->getStorage((std::string)"monster_level", value);
  13.  
  14. uint8_t intValue = atoi(value.c_str());
  15. if(intValue || value == "0")
  16. level = intValue;
  17. else
  18. level = 1;
  19. }
  20. else
  21. level = monster->level;
  22.  
  23. char buffer [10];
  24. monster->name = monster->getName() + " [PDL : " + itoa(level, buffer, 10) + "]";
  25. }
  26. }
  27. bool foundTile = false, placeInPz = false;
  28. Tile* tile = getTile(centerPos);
  29. if(tile && !extendedPos)
  30. {
  31. placeInPz = tile->hasFlag(TILESTATE_PROTECTIONZONE);
  32. uint32_t flags = FLAG_IGNOREBLOCKITEM;
  33. if(creature->isAccountManager())
  34. flags |= FLAG_IGNOREBLOCKCREATURE;
  35.  
  36. ReturnValue ret = tile->__queryAdd(0, creature, 1, flags);
  37. if(forced || ret == RET_NOERROR || ret == RET_PLAYERISNOTINVITED)
  38. foundTile = true;
  39. }
  40.  
  41. size_t shufflePos = 0;
  42. PairVector relList;
  43. if(extendedPos)
  44. {
  45. shufflePos = 8;
  46. relList.push_back(PositionPair(-2, 0));
  47. relList.push_back(PositionPair(0, -2));
  48. relList.push_back(PositionPair(0, 2));
  49. relList.push_back(PositionPair(2, 0));
  50. std::random_shuffle(relList.begin(), relList.end());
  51. }
  52.  
  53. relList.push_back(PositionPair(-1, -1));
  54. relList.push_back(PositionPair(-1, 0));
  55. relList.push_back(PositionPair(-1, 1));
  56. relList.push_back(PositionPair(0, -1));
  57. relList.push_back(PositionPair(0, 1));
  58. relList.push_back(PositionPair(1, -1));
  59. relList.push_back(PositionPair(1, 0));
  60. relList.push_back(PositionPair(1, 1));
  61. std::random_shuffle(relList.begin() + shufflePos, relList.end());
  62.  
  63. uint32_t radius = 1;
  64. Position tryPos;
  65. for(uint32_t n = 1; n <= radius && !foundTile; ++n)
  66. {
  67. for(PairVector::iterator it = relList.begin(); it != relList.end() && !foundTile; ++it)
  68. {
  69. int32_t dx = it->first * n, dy = it->second * n;
  70. tryPos = centerPos;
  71.  
  72. tryPos.x = tryPos.x + dx;
  73. tryPos.y = tryPos.y + dy;
  74. if(!(tile = getTile(tryPos)) || (placeInPz && !tile->hasFlag(TILESTATE_PROTECTIONZONE)))
  75. continue;
  76.  
  77. if(tile->__queryAdd(0, creature, 1, 0) == RET_NOERROR)
  78. {
  79. if(!extendedPos)
  80. {
  81. foundTile = true;
  82. break;
  83. }
  84.  
  85. if(isSightClear(centerPos, tryPos, false))
  86. {
  87. foundTile = true;
  88. break;
  89. }
  90. }
  91. }
  92. }
  93.  
  94. if(!foundTile)
  95. return false;
  96.  
  97. int32_t index = 0;
  98. uint32_t flags = 0;
  99.  
  100. Item* toItem = NULL;
  101. if(Cylinder* toCylinder = tile->__queryDestination(index, creature, &toItem, flags))
  102. {
  103. toCylinder->__internalAddThing(creature);
  104. if(Tile* toTile = toCylinder->getTile())
  105. toTile->qt_node->addCreature(creature);
  106. }
  107.  
  108. return true;
  109. }
  110.  
  111. itoa(level, buffer, 10)
  112.  
  113. std::to_string(level)
  114.  
  115. atoi(value.c_str());
  116.  
  117. std::stoi(value)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement