bool Map::AttackPKSpell(Character *from, int spellid, int targetid) { ESF_Data *spell = this->world->esf->Get(spellid); PacketBuilder builder; UTIL_PTR_LIST_FOREACH(this->characters, Character, character) { if (character->mapid == this->id && !character->nowhere && targetid == character->player->id && from->player->id != character->player->id) { Character *character_ptr = *character; character_ptr->AddRef(); if (from->clas == 9) { int amount = util::rand(spell->mindam * 1.5, spell->maxdam * 1.5); //int amount = util::rand(from->mindam + 0, from->maxdam + 0); int limitamount = std::min(amount, int(character_ptr->hp)); if (static_cast<int>(this->world->config["LimitDamage"])) { amount = limitamount; } if (character_ptr->invincible == false) { character_ptr->hp -= limitamount; builder.SetID(PACKET_CLOTHES, PACKET_ADMIN); builder.AddShort(from->player->id); builder.AddShort(character_ptr->player->id); builder.AddThree(amount); builder.AddChar(from->direction); builder.AddChar(int(double(character_ptr->hp) / double(character_ptr->maxhp) * 100.0)); builder.AddChar(character_ptr->hp == 0); builder.AddShort(spellid); UTIL_PTR_LIST_FOREACH(this->characters, Character, checkchar) { if (character_ptr->InRange(*checkchar)) { checkchar->player->client->SendBuilder(builder); } } } else { builder.SetID(PACKET_CLOTHES, PACKET_ADMIN); builder.AddShort(from->player->id); builder.AddShort(character_ptr->player->id); builder.AddThree(0); builder.AddChar(from->direction); builder.AddChar(int(double(character_ptr->hp) / double(character_ptr->maxhp) * 100.0)); builder.AddChar(character_ptr->hp == 0); builder.AddShort(spellid); UTIL_PTR_LIST_FOREACH(this->characters, Character, checkchar) { if (character_ptr->InRange(*checkchar)) { checkchar->player->client->SendBuilder(builder); } } } if (character_ptr->hp == 0) { Quest *temp_quest = 0; State *state = 0; UTIL_PTR_LIST_FOREACH(from->quests, Character_Quest, quest) { temp_quest = this->world->GetQuest(quest->id); if (!temp_quest) continue; state = temp_quest->GetState(quest->state); if (!state) continue; UTIL_PTR_VECTOR_FOREACH(state->rules, Rule, rule) { if (rule->name.compare("killedplayers") == 0) { quest->killed++; if (quest->killed >= ((int)(*rule->args[0]))) { quest->killed = 0; quest->state = rule->goto_state; from->PerformQuestActions(quest->id); } break; } } } /*std::string msg(character->name + " got KnocKed tHE FuK ouT By "); msg += from->name; this->world->ServerMsg(msg); int item = 1; int amount = 2000; UTIL_PTR_LIST_FOREACH(this->characters, Character, character) { if (character->mapid == this->id && !character->nowhere && character->guild == from->guild) { Character *characterg = *character; characterg->AddRef(); characterg->AddItem(item, amount); PacketBuilder builder(PACKET_ITEM, PACKET_GET); builder.AddShort(0); // UID builder.AddShort(item); builder.AddThree(amount); builder.AddChar(characterg->weight); builder.AddChar(characterg->maxweight); characterg->player->client->SendBuilder(builder); bool stats_updated = false; characterg->exp += 1000; stats_updated = true; if (stats_updated) { bool level_up = false; while (characterg->level < static_cast<int>(this->world->config["MaxLevel"]) && characterg->exp >= this->world->exp_table[characterg->level+1]) { level_up = true; ++from->level; characterg->statpoints += static_cast<int>(this->world->config["StatPerLevel"]); characterg->skillpoints += static_cast<int>(this->world->config["SkillPerLevel"]); characterg->CalculateStats(); } PacketBuilder builder(PACKET_RECOVER, PACKET_REPLY); builder.AddInt(characterg->exp); builder.AddShort(characterg->karma); builder.AddChar(level_up ? characterg->level : 0); characterg->player->client->SendBuilder(builder); } } }*/ std::string msg(character->name + " got KnocKed tHE FuK ouT By "); msg += from->name; this->world->ServerMsg(msg); int item = 1; int amount = 2000; if (from->AddItem(item, amount)) { PacketBuilder builder(PACKET_ITEM, PACKET_GET); builder.AddShort(0); // UID builder.AddShort(item); builder.AddThree(amount); builder.AddChar(from->weight); builder.AddChar(from->maxweight); from->player->client->SendBuilder(builder); } bool stats_updated = false; from->exp += 1000; stats_updated = true; if (stats_updated) { bool level_up = false; while (from->level < static_cast<int>(this->world->config["MaxLevel"]) && from->exp >= this->world->exp_table[from->level+1]) { level_up = true; ++from->level; from->statpoints += static_cast<int>(this->world->config["StatPerLevel"]); from->skillpoints += static_cast<int>(this->world->config["SkillPerLevel"]); from->CalculateStats(); } PacketBuilder builder(PACKET_RECOVER, PACKET_REPLY); builder.AddInt(from->exp); builder.AddShort(from->karma); builder.AddChar(level_up ? from->level : 0); from->player->client->SendBuilder(builder); } character_ptr->hp = int(character_ptr->maxhp * static_cast<double>(this->world->config["DeathRecover"]) / 100.0); if (this->world->config["Deadly"]) { character_ptr->DropAll(from); } character_ptr->PetTransfer(); character_ptr->map->Leave(character_ptr, WARP_ANIMATION_NONE, true); character_ptr->nowhere = true; character_ptr->map = this->world->GetMap(character_ptr->SpawnMap()); character_ptr->mapid = character_ptr->SpawnMap(); character_ptr->x = character_ptr->SpawnX(); character_ptr->y = character_ptr->SpawnY(); character_ptr->PetTransfer(); PacketReader reader(""); character_ptr->player->client->queue.AddAction(PACKET_INTERNAL, PACKET_INTERNAL_NULL, reader, 1.5); character_ptr->player->client->queue.AddAction(PACKET_INTERNAL, PACKET_INTERNAL_WARP, reader, 0.0); } builder.Reset(); builder.SetID(PACKET_RECOVER, PACKET_PLAYER); builder.AddShort(character_ptr->hp); builder.AddShort(character_ptr->tp); character_ptr->player->client->SendBuilder(builder); character_ptr->Release(); return true; } else if (from->clas != 9) { int amount = util::rand(spell->mindam, spell->maxdam); // int amount = util::rand(from->mindam, from->maxdam); int limitamount = std::min(amount, int(character_ptr->hp)); if (static_cast<int>(this->world->config["LimitDamage"])) { amount = limitamount; } if (character_ptr->invincible == false) { character_ptr->hp -= limitamount; builder.SetID(PACKET_CLOTHES, PACKET_ADMIN); builder.AddShort(from->player->id); builder.AddShort(character_ptr->player->id); builder.AddThree(amount); builder.AddChar(from->direction); builder.AddChar(int(double(character_ptr->hp) / double(character_ptr->maxhp) * 100.0)); builder.AddChar(character_ptr->hp == 0); builder.AddShort(spellid); UTIL_PTR_LIST_FOREACH(this->characters, Character, checkchar) { if (character_ptr->InRange(*checkchar)) { checkchar->player->client->SendBuilder(builder); } } } else { builder.SetID(PACKET_CLOTHES, PACKET_ADMIN); builder.AddShort(from->player->id); builder.AddShort(character_ptr->player->id); builder.AddThree(0); builder.AddChar(from->direction); builder.AddChar(int(double(character_ptr->hp) / double(character_ptr->maxhp) * 100.0)); builder.AddChar(character_ptr->hp == 0); builder.AddShort(spellid); UTIL_PTR_LIST_FOREACH(this->characters, Character, checkchar) { if (character_ptr->InRange(*checkchar)) { checkchar->player->client->SendBuilder(builder); } } } if (character_ptr->hp == 0) { Quest *temp_quest = 0; State *state = 0; UTIL_PTR_LIST_FOREACH(from->quests, Character_Quest, quest) { temp_quest = this->world->GetQuest(quest->id); if (!temp_quest) continue; state = temp_quest->GetState(quest->state); if (!state) continue; UTIL_PTR_VECTOR_FOREACH(state->rules, Rule, rule) { if (rule->name.compare("killedplayers") == 0) { quest->killed++; if (quest->killed >= ((int)(*rule->args[0]))) { quest->killed = 0; quest->state = rule->goto_state; from->PerformQuestActions(quest->id); } break; } } } /*std::string msg(character->name + " got KnocKed tHE FuK ouT By "); msg += from->name; this->world->ServerMsg(msg); int item = 1; int amount = 2000; UTIL_PTR_LIST_FOREACH(this->characters, Character, character) { if (character->mapid == this->id && !character->nowhere && character->guild == from->guild) { Character *characterg = *character; characterg->AddRef(); characterg->AddItem(item, amount); PacketBuilder builder(PACKET_ITEM, PACKET_GET); builder.AddShort(0); // UID builder.AddShort(item); builder.AddThree(amount); builder.AddChar(characterg->weight); builder.AddChar(characterg->maxweight); characterg->player->client->SendBuilder(builder); bool stats_updated = false; characterg->exp += 1000; stats_updated = true; if (stats_updated) { bool level_up = false; while (characterg->level < static_cast<int>(this->world->config["MaxLevel"]) && characterg->exp >= this->world->exp_table[characterg->level+1]) { level_up = true; ++from->level; characterg->statpoints += static_cast<int>(this->world->config["StatPerLevel"]); characterg->skillpoints += static_cast<int>(this->world->config["SkillPerLevel"]); characterg->CalculateStats(); } PacketBuilder builder(PACKET_RECOVER, PACKET_REPLY); builder.AddInt(characterg->exp); builder.AddShort(characterg->karma); builder.AddChar(level_up ? characterg->level : 0); characterg->player->client->SendBuilder(builder); } } }*/ std::string msg(character->name + " got KnocKed tHE FuK ouT By "); msg += from->name; this->world->ServerMsg(msg); int item = 1; int amount = 2000; if (from->AddItem(item, amount)) { PacketBuilder builder(PACKET_ITEM, PACKET_GET); builder.AddShort(0); // UID builder.AddShort(item); builder.AddThree(amount); builder.AddChar(from->weight); builder.AddChar(from->maxweight); from->player->client->SendBuilder(builder); } bool stats_updated = false; from->exp += 1000; stats_updated = true; if (stats_updated) { bool level_up = false; while (from->level < static_cast<int>(this->world->config["MaxLevel"]) && from->exp >= this->world->exp_table[from->level+1]) { level_up = true; ++from->level; from->statpoints += static_cast<int>(this->world->config["StatPerLevel"]); from->skillpoints += static_cast<int>(this->world->config["SkillPerLevel"]); from->CalculateStats(); } PacketBuilder builder(PACKET_RECOVER, PACKET_REPLY); builder.AddInt(from->exp); builder.AddShort(from->karma); builder.AddChar(level_up ? from->level : 0); from->player->client->SendBuilder(builder); } character_ptr->hp = int(character_ptr->maxhp * static_cast<double>(this->world->config["DeathRecover"]) / 100.0); if (this->world->config["Deadly"]) { character_ptr->DropAll(from); } character_ptr->PetTransfer(); character_ptr->map->Leave(character_ptr, WARP_ANIMATION_NONE, true); character_ptr->nowhere = true; character_ptr->map = this->world->GetMap(character_ptr->SpawnMap()); character_ptr->mapid = character_ptr->SpawnMap(); character_ptr->x = character_ptr->SpawnX(); character_ptr->y = character_ptr->SpawnY(); character_ptr->PetTransfer(); PacketReader reader(""); character_ptr->player->client->queue.AddAction(PACKET_INTERNAL, PACKET_INTERNAL_NULL, reader, 1.5); character_ptr->player->client->queue.AddAction(PACKET_INTERNAL, PACKET_INTERNAL_WARP, reader, 0.0); } builder.Reset(); builder.SetID(PACKET_RECOVER, PACKET_PLAYER); builder.AddShort(character_ptr->hp); builder.AddShort(character_ptr->tp); character_ptr->player->client->SendBuilder(builder); character_ptr->Release(); return true; } } } return false; }