Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- else if(this->Data()->type == ENF::Aggressive)
- {
- UTIL_PTR_VECTOR_FOREACH(this->map->npcs, NPC, npc)
- {
- int distance = util::path_length(npc->x, npc->y, this->x, this->y);
- if (npc->Data()->type == ENF::Pet && distance > 1 && distance < 5 && npc->alive) //?
- {
- int xdiff = this->x - npc->x;
- int ydiff = this->y - npc->y;
- int absxdiff = std::abs(xdiff);
- int absydiff = std::abs(ydiff);
- if ((absxdiff == 1 && absydiff == 0) || (absxdiff == 0 && absydiff == 1) || (absxdiff == 0 && absydiff == 0))
- {
- //if(attacker != this->owner)
- //this->Attack(this->owner);
- return;
- }
- else if (absxdiff > absydiff)
- {
- if (xdiff < 0)
- {
- this->direction = DIRECTION_RIGHT;
- }
- else
- {
- this->direction = DIRECTION_LEFT;
- }
- }
- else
- {
- if (ydiff < 0)
- {
- this->direction = DIRECTION_DOWN;
- }
- else
- {
- this->direction = DIRECTION_UP;
- }
- }
- if (!this->Walk(this->direction))
- {
- this->Walk(static_cast<Direction>(util::rand(0,3)));
- }
- return;
- }
- }
- if (this->Data()->type == ENF::Aggressive || this->Data()->type == ENF::Passive)
- {
- UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character)
- {
- UTIL_PTR_VECTOR_FOREACH(this->map->npcs, NPC, npc)
- {
- int distance = util::path_length(npc->x, npc->y, this->x, this->y);
- if ((distance > 0 && distance < 2 && npc->Data()->type == ENF::Pet && npc->alive))
- {
- if(distance < 2)
- {
- int xdiff = this->x - npc->x;
- int ydiff = this->y - npc->y;
- if (std::abs(xdiff) > std::abs(ydiff))
- {
- if (xdiff < 0)
- {
- this->direction = DIRECTION_RIGHT;
- }
- else
- {
- this->direction = DIRECTION_LEFT;
- }
- }
- else
- {
- if (ydiff < 0)
- {
- this->direction = DIRECTION_DOWN;
- }
- else
- {
- this->direction = DIRECTION_UP;
- }
- }
- PacketBuilder builder(PACKET_NPC, PACKET_PLAYER);
- builder.AddByte(255);
- builder.AddChar(this->index);
- builder.AddChar(1 + (character->hp == 0));
- builder.AddChar(this->direction);
- builder.AddShort(0);
- builder.AddThree(0);
- builder.AddThree(int(double(character->hp) / double(character->maxhp) * 100.0));
- builder.AddByte(255);
- builder.AddByte(255);
- UTIL_PTR_LIST_FOREACH(this->map->characters, Character, character)
- {
- if (*character == npc->owner || !character->InRange(this))
- {
- continue;
- }
- character->player->client->SendBuilder(builder);
- }
- npc->owner->player->client->SendBuilder(builder);
- }
- int amount = util::rand(this->Data()->mindam, this->Data()->maxdam + static_cast<int>(this->map->world->config["NPCAdjustMaxDam"]));
- double rand = util::rand(0.0, 1.0);
- // Checks if target is facing you
- bool critical = std::abs(int(npc->direction) - npc->owner->direction) != 2 || rand < static_cast<double>(this->map->world->config["CriticalRate"]);
- std::tr1::unordered_map<std::string, double> formula_vars;
- npc->owner->FormulaVars(formula_vars);
- npc->FormulaVars(formula_vars, "target_");
- formula_vars["modifier"] = this->map->world->config["MobRate"];
- formula_vars["damage"] = amount;
- formula_vars["critical"] = critical;
- amount = rpn_eval(rpn_parse(this->map->world->formulas_config["damage"]), formula_vars);
- double hit_rate = rpn_eval(rpn_parse(this->map->world->formulas_config["hit_rate"]), formula_vars);
- if (rand > hit_rate)
- {
- amount = 0;
- }
- amount = std::max(amount, 0);
- int limitamount = std::min(amount, int(npc->hp));
- if (this->map->world->config["LimitDamage"])
- {
- amount = limitamount;
- }
- npc->Damage(npc->owner, amount);
- return;
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment