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;
}