Merge pull request #1 from EQEmu/master

Update.
This commit is contained in:
Alex 2020-06-27 20:41:58 -04:00 committed by GitHub
commit 2c7d227f4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 285 additions and 31 deletions

View File

@ -527,3 +527,51 @@ bool isAlphaNumeric(const char *text)
return true; return true;
} }
// Function to convert single digit or two digit number into words
std::string convert2digit(int n, std::string suffix)
{
// if n is zero
if (n == 0) {
return "";
}
// split n if it is more than 19
if (n > 19) {
return NUM_TO_ENGLISH_Y[n / 10] + NUM_TO_ENGLISH_X[n % 10] + suffix;
}
else {
return NUM_TO_ENGLISH_X[n] + suffix;
}
}
// Function to convert a given number (max 9-digits) into words
std::string numberToWords(unsigned long long int n)
{
// string to store word representation of given number
std::string res;
// this handles digits at ones & tens place
res = convert2digit((n % 100), "");
if (n > 100 && n % 100) {
res = "and " + res;
}
// this handles digit at hundreds place
res = convert2digit(((n / 100) % 10), "Hundred ") + res;
// this handles digits at thousands & tens thousands place
res = convert2digit(((n / 1000) % 100), "Thousand ") + res;
// this handles digits at hundred thousands & one millions place
res = convert2digit(((n / 100000) % 100), "Lakh, ") + res;
// this handles digits at ten millions & hundred millions place
res = convert2digit((n / 10000000) % 100, "Crore, ") + res;
// this handles digits at ten millions & hundred millions place
res = convert2digit((n / 1000000000) % 100, "Billion, ") + res;
return res;
}

View File

@ -43,6 +43,20 @@ std::vector<std::string> split(std::string str_to_split, char delimiter);
const std::string StringFormat(const char* format, ...); const std::string StringFormat(const char* format, ...);
const std::string vStringFormat(const char* format, va_list args); const std::string vStringFormat(const char* format, va_list args);
std::string implode(std::string glue, std::vector<std::string> src); std::string implode(std::string glue, std::vector<std::string> src);
std::string convert2digit(int n, std::string suffix);
std::string numberToWords(unsigned long long int n);
// For converstion of numerics into English
// Used for grid nodes, as NPC names remove numerals.
// But general purpose
const std::string NUM_TO_ENGLISH_X[] = { "", "One ", "Two ", "Three ", "Four ",
"Five ", "Six ", "Seven ", "Eight ", "Nine ", "Ten ", "Eleven ",
"Twelve ", "Thirteen ", "Fourteen ", "Fifteen ",
"Sixteen ", "Seventeen ", "Eighteen ", "Nineteen " };
const std::string NUM_TO_ENGLISH_Y[] = { "", "", "Twenty ", "Thirty ", "Forty ",
"Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety " };
/** /**
* @param str * @param str
@ -189,5 +203,8 @@ uint32 hextoi(const char* num);
uint64 hextoi64(const char* num); uint64 hextoi64(const char* num);
void MakeLowerString(const char *source, char *target); void MakeLowerString(const char *source, char *target);
void RemoveApostrophes(std::string &s); void RemoveApostrophes(std::string &s);
std::string convert2digit(int n, std::string suffix);
std::string numberToWords(unsigned long long int n);
#endif #endif

View File

@ -204,9 +204,10 @@ int command_init(void)
command_add("equipitem", "[slotid(0-21)] - Equip the item on your cursor into the specified slot", 50, command_equipitem) || command_add("equipitem", "[slotid(0-21)] - Equip the item on your cursor into the specified slot", 50, command_equipitem) ||
command_add("face", "- Change the face of your target", 80, command_face) || command_add("face", "- Change the face of your target", 80, command_face) ||
command_add("faction", "[Find (criteria | all ) | Review (criteria | all) | Reset (id)] - Resets Player's Faction", 80, command_faction) || command_add("faction", "[Find (criteria | all ) | Review (criteria | all) | Reset (id)] - Resets Player's Faction", 80, command_faction) ||
command_add("findaliases", "[search term]- Searches for available command aliases, by alias or command", 0, command_findaliases) || command_add("findaliases", "[search criteria]- Searches for available command aliases, by alias or command", 0, command_findaliases) ||
command_add("findnpctype", "[search criteria] - Search database NPC types", 100, command_findnpctype) || command_add("findnpctype", "[search criteria] - Search database NPC types", 100, command_findnpctype) ||
command_add("findspell", "[searchstring] - Search for a spell", 50, command_findspell) || command_add("findrace", "[search criteria] - Search for a race", 50, command_findrace) ||
command_add("findspell", "[search criteria] - Search for a spell", 50, command_findspell) ||
command_add("findzone", "[search criteria] - Search database zones", 100, command_findzone) || command_add("findzone", "[search criteria] - Search database zones", 100, command_findzone) ||
command_add("fixmob", "[race|gender|texture|helm|face|hair|haircolor|beard|beardcolor|heritage|tattoo|detail] [next|prev] - Manipulate appearance of your target", 80, command_fixmob) || command_add("fixmob", "[race|gender|texture|helm|face|hair|haircolor|beard|beardcolor|heritage|tattoo|detail] [next|prev] - Manipulate appearance of your target", 80, command_fixmob) ||
command_add("flag", "[status] [acctname] - Refresh your admin status, or set an account's admin status if arguments provided", 0, command_flag) || command_add("flag", "[status] [acctname] - Refresh your admin status, or set an account's admin status if arguments provided", 0, command_flag) ||
@ -2438,10 +2439,10 @@ void command_grid(Client *c, const Seperator *sep)
} }
std::string query = StringFormat( std::string query = StringFormat(
"SELECT `x`, `y`, `z`, `heading`, `number`, `pause` " "SELECT `x`, `y`, `z`, `heading`, `number` "
"FROM `grid_entries` " "FROM `grid_entries` "
"WHERE `zoneid` = %u and `gridid` = %i " "WHERE `zoneid` = %u and `gridid` = %i "
"ORDER BY `number` ", "ORDER BY `number`",
zone->GetZoneID(), zone->GetZoneID(),
target->CastToNPC()->GetGrid() target->CastToNPC()->GetGrid()
); );
@ -2471,18 +2472,31 @@ void command_grid(Client *c, const Seperator *sep)
/** /**
* Spawn grid nodes * Spawn grid nodes
*/ */
for (auto row = results.begin(); row != results.end(); ++row) { std::map<std::vector<float>, int32> zoffset;
auto node_position = glm::vec4(atof(row[0]), atof(row[1]), atof(row[2]), atof(row[3]));
NPC *npc = NPC::SpawnGridNodeNPC( for (auto row = results.begin(); row != results.end(); ++row) {
target->GetCleanName(), glm::vec4 node_position = glm::vec4(atof(row[0]), atof(row[1]), atof(row[2]), atof(row[3]));
node_position,
static_cast<uint32>(target->CastToNPC()->GetGrid()), std::vector<float> node_loc {
static_cast<uint32>(atoi(row[4])), node_position.x,
static_cast<uint32>(atoi(row[5])) node_position.y,
); node_position.z
npc->SetFlyMode(GravityBehavior::Flying); };
npc->GMMove(node_position.x, node_position.y, node_position.z, node_position.w);
// If we already have a node at this location, set the z offset
// higher from the existing one so we can see it. Adjust so if
// there is another at the same spot we adjust again.
auto search = zoffset.find(node_loc);
if (search != zoffset.end()) {
search->second = search->second + 3;
}
else {
zoffset[node_loc] = 0.0;
}
node_position.z += zoffset[node_loc];
NPC::SpawnGridNodeNPC(node_position,atoi(row[4]),zoffset[node_loc]);
} }
} }
else if (strcasecmp("delete", sep->arg[1]) == 0) { else if (strcasecmp("delete", sep->arg[1]) == 0) {
@ -2628,6 +2642,46 @@ void command_showskills(Client *c, const Seperator *sep)
c->Message(Chat::White, "Skill [%d] is at [%d] - %u", i, t->GetSkill(i), t->GetRawSkill(i)); c->Message(Chat::White, "Skill [%d] is at [%d] - %u", i, t->GetSkill(i), t->GetRawSkill(i));
} }
void command_findrace(Client *c, const Seperator *sep)
{
if (sep->arg[1][0] == 0) {
c->Message(Chat::White, "Usage: #findrace [race name]");
} else if (Seperator::IsNumber(sep->argplus[1])) {
int search_id = atoi(sep->argplus[1]);
std::string race_name = GetRaceIDName(search_id);
if (race_name != std::string("")) {
c->Message(Chat::White, "Race %d: %s", search_id, race_name.c_str());
return;
}
} else {
const char *search_criteria = sep->argplus[1];
int found_count = 0;
char race_name[64];
char search_string[65];
strn0cpy(search_string, search_criteria, sizeof(search_string));
strupr(search_string);
char *string_location;
for (int race_id = RACE_HUMAN_1; race_id <= RT_PEGASUS_3; race_id++) {
strn0cpy(race_name, GetRaceIDName(race_id), sizeof(race_name));
strupr(race_name);
string_location = strstr(race_name, search_string);
if (string_location != nullptr) {
c->Message(Chat::White, "Race %d: %s", race_id, GetRaceIDName(race_id));
found_count++;
}
if (found_count == 20) {
break;
}
}
if (found_count == 20) {
c->Message(Chat::White, "20 Races found... max reached.");
} else {
c->Message(Chat::White, "%i Race(s) found.", found_count);
}
}
}
void command_findspell(Client *c, const Seperator *sep) void command_findspell(Client *c, const Seperator *sep)
{ {
if (sep->arg[1][0] == 0) if (sep->arg[1][0] == 0)
@ -4169,10 +4223,11 @@ void command_findzone(Client *c, const Seperator *sep)
c->Message( c->Message(
Chat::White, Chat::White,
fmt::format( fmt::format(
"[{}] [{}] [{}] Version ({}) [{}]", "[{}] [{}] [{}] ID ({}) Version ({}) [{}]",
(version == 0 ? command_zone : "zone"), (version == 0 ? command_zone : "zone"),
command_gmzone, command_gmzone,
short_name, short_name,
zone_id,
version, version,
long_name long_name
).c_str() ).c_str()

View File

@ -101,6 +101,7 @@ void command_face(Client *c, const Seperator *sep);
void command_faction(Client *c, const Seperator *sep); void command_faction(Client *c, const Seperator *sep);
void command_findaliases(Client *c, const Seperator *sep); void command_findaliases(Client *c, const Seperator *sep);
void command_findnpctype(Client *c, const Seperator *sep); void command_findnpctype(Client *c, const Seperator *sep);
void command_findrace(Client *c, const Seperator *sep);
void command_findspell(Client *c, const Seperator *sep); void command_findspell(Client *c, const Seperator *sep);
void command_findzone(Client *c, const Seperator *sep); void command_findzone(Client *c, const Seperator *sep);
void command_fixmob(Client *c, const Seperator *sep); void command_fixmob(Client *c, const Seperator *sep);

View File

@ -530,6 +530,32 @@ XS(XS__zone) {
XSRETURN_EMPTY; XSRETURN_EMPTY;
} }
XS(XS__zonegroup);
XS(XS__zonegroup) {
dXSARGS;
if (items != 1)
Perl_croak(aTHX_ "Usage: quest::zonegroup(string zone_name)");
char *zone_name = (char *) SvPV_nolen(ST(0));
quest_manager.ZoneGroup(zone_name);
XSRETURN_EMPTY;
}
XS(XS__zoneraid);
XS(XS__zoneraid) {
dXSARGS;
if (items != 1)
Perl_croak(aTHX_ "Usage: quest::zoneraid(string zone_name)");
char *zone_name = (char *) SvPV_nolen(ST(0));
quest_manager.ZoneRaid(zone_name);
XSRETURN_EMPTY;
}
XS(XS__settimer); XS(XS__settimer);
XS(XS__settimer) { XS(XS__settimer) {
dXSARGS; dXSARGS;
@ -4520,6 +4546,8 @@ EXTERN_C XS(boot_quest) {
newXS(strcpy(buf, "write"), XS__write, file); newXS(strcpy(buf, "write"), XS__write, file);
newXS(strcpy(buf, "ze"), XS__ze, file); newXS(strcpy(buf, "ze"), XS__ze, file);
newXS(strcpy(buf, "zone"), XS__zone, file); newXS(strcpy(buf, "zone"), XS__zone, file);
newXS(strcpy(buf, "zonegroup"), XS__zonegroup, file);
newXS(strcpy(buf, "zoneraid"), XS__zoneraid, file);
XSRETURN_YES; XSRETURN_YES;
} }

View File

@ -1146,6 +1146,18 @@ Lua_EntityList lua_get_entity_list() {
return Lua_EntityList(&entity_list); return Lua_EntityList(&entity_list);
} }
void lua_zone(const char* zone_name) {
quest_manager.Zone(zone_name);
}
void lua_zone_group(const char* zone_name) {
quest_manager.ZoneGroup(zone_name);
}
void lua_zone_raid(const char* zone_name) {
quest_manager.ZoneRaid(zone_name);
}
int lua_get_zone_id() { int lua_get_zone_id() {
if(!zone) if(!zone)
return 0; return 0;
@ -1893,6 +1905,9 @@ luabind::scope lua_register_general() {
luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*,Lua_NPC))&lua_get_qglobals), luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*,Lua_NPC))&lua_get_qglobals),
luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*))&lua_get_qglobals), luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*))&lua_get_qglobals),
luabind::def("get_entity_list", &lua_get_entity_list), luabind::def("get_entity_list", &lua_get_entity_list),
luabind::def("zone", &lua_zone),
luabind::def("zone_group", &lua_zone_group),
luabind::def("zone_raid", &lua_zone_raid),
luabind::def("get_zone_id", &lua_get_zone_id), luabind::def("get_zone_id", &lua_get_zone_id),
luabind::def("get_zone_long_name", &lua_get_zone_long_name), luabind::def("get_zone_long_name", &lua_get_zone_long_name),
luabind::def("get_zone_short_name", &lua_get_zone_short_name), luabind::def("get_zone_short_name", &lua_get_zone_short_name),

View File

@ -1319,7 +1319,10 @@ void Mob::AI_Process() {
FaceTarget(); FaceTarget();
} }
} }
else if (AI_movement_timer->Check() && target) { // mob/npc waits until call for help complete, others can move
else if (AI_movement_timer->Check() && target &&
(GetOwnerID() || IsBot() ||
CastToNPC()->GetCombatEvent())) {
if (!IsRooted()) { if (!IsRooted()) {
LogAI("Pursuing [{}] while engaged", target->GetName()); LogAI("Pursuing [{}] while engaged", target->GetName());
RunTo(target->GetX(), target->GetY(), target->GetZ()); RunTo(target->GetX(), target->GetY(), target->GetZ());

View File

@ -1068,14 +1068,20 @@ bool NPC::SpawnZoneController()
return true; return true;
} }
NPC * NPC::SpawnGridNodeNPC(std::string name, const glm::vec4 &position, uint32 grid_id, uint32 grid_number, uint32 pause) { void NPC::SpawnGridNodeNPC(const glm::vec4 &position, int32 grid_number, int32 zoffset) {
auto npc_type = new NPCType; auto npc_type = new NPCType;
memset(npc_type, 0, sizeof(NPCType)); memset(npc_type, 0, sizeof(NPCType));
sprintf(npc_type->name, "%u_%u", grid_id, grid_number); std::string str_zoffset = numberToWords(zoffset);
sprintf(npc_type->lastname, "Number: %u Grid: %u Pause: %u", grid_number, grid_id, pause); std::string str_number = numberToWords(grid_number);
npc_type->current_hp = 4000000; strcpy(npc_type->name, str_number.c_str());
if (zoffset != 0) {
strcat(npc_type->name, "(Stacked)");
}
npc_type->current_hp = 4000000;
npc_type->max_hp = 4000000; npc_type->max_hp = 4000000;
npc_type->race = 2254; npc_type->race = 2254;
npc_type->gender = 2; npc_type->gender = 2;
@ -1095,11 +1101,12 @@ NPC * NPC::SpawnGridNodeNPC(std::string name, const glm::vec4 &position, uint32
auto node_position = glm::vec4(position.x, position.y, position.z, position.w); auto node_position = glm::vec4(position.x, position.y, position.z, position.w);
auto npc = new NPC(npc_type, nullptr, node_position, GravityBehavior::Flying); auto npc = new NPC(npc_type, nullptr, node_position, GravityBehavior::Flying);
npc->name[strlen(npc->name)-3] = (char) NULL;
npc->GiveNPCTypeData(npc_type); npc->GiveNPCTypeData(npc_type);
entity_list.AddNPC(npc, true, true); entity_list.AddNPC(npc);
return npc;
} }
NPC * NPC::SpawnNodeNPC(std::string name, std::string last_name, const glm::vec4 &position) { NPC * NPC::SpawnNodeNPC(std::string name, std::string last_name, const glm::vec4 &position) {

View File

@ -112,7 +112,7 @@ public:
virtual ~NPC(); virtual ~NPC();
static NPC *SpawnNodeNPC(std::string name, std::string last_name, const glm::vec4 &position); static NPC *SpawnNodeNPC(std::string name, std::string last_name, const glm::vec4 &position);
static NPC *SpawnGridNodeNPC(std::string name, const glm::vec4 &position, uint32 grid_id, uint32 grid_number, uint32 pause); static void SpawnGridNodeNPC(const glm::vec4 &position, int32 grid_number, int32 zoffset);
//abstract virtual function implementations requird by base abstract class //abstract virtual function implementations requird by base abstract class
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill); virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill);

View File

@ -407,6 +407,84 @@ void QuestManager::Zone(const char *zone_name) {
} }
} }
void QuestManager::ZoneGroup(const char *zone_name) {
QuestManagerCurrentQuestVars();
if (initiator && initiator->IsClient()) {
if (!initiator->GetGroup()) {
auto pack = new ServerPacket(ServerOP_ZoneToZoneRequest, sizeof(ZoneToZone_Struct));
ZoneToZone_Struct* ztz = (ZoneToZone_Struct*) pack->pBuffer;
ztz->response = 0;
ztz->current_zone_id = zone->GetZoneID();
ztz->current_instance_id = zone->GetInstanceID();
ztz->requested_zone_id = database.GetZoneID(zone_name);
ztz->admin = initiator->Admin();
strcpy(ztz->name, initiator->GetName());
ztz->guild_id = initiator->GuildID();
ztz->ignorerestrictions = 3;
worldserver.SendPacket(pack);
safe_delete(pack);
} else {
auto client_group = initiator->GetGroup();
for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) {
if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) {
auto group_member = client_group->members[member_index]->CastToClient();
auto pack = new ServerPacket(ServerOP_ZoneToZoneRequest, sizeof(ZoneToZone_Struct));
ZoneToZone_Struct* ztz = (ZoneToZone_Struct*) pack->pBuffer;
ztz->response = 0;
ztz->current_zone_id = zone->GetZoneID();
ztz->current_instance_id = zone->GetInstanceID();
ztz->requested_zone_id = database.GetZoneID(zone_name);
ztz->admin = group_member->Admin();
strcpy(ztz->name, group_member->GetName());
ztz->guild_id = group_member->GuildID();
ztz->ignorerestrictions = 3;
worldserver.SendPacket(pack);
safe_delete(pack);
}
}
}
}
}
void QuestManager::ZoneRaid(const char *zone_name) {
QuestManagerCurrentQuestVars();
if (initiator && initiator->IsClient()) {
if (!initiator->GetRaid()) {
auto pack = new ServerPacket(ServerOP_ZoneToZoneRequest, sizeof(ZoneToZone_Struct));
ZoneToZone_Struct* ztz = (ZoneToZone_Struct*) pack->pBuffer;
ztz->response = 0;
ztz->current_zone_id = zone->GetZoneID();
ztz->current_instance_id = zone->GetInstanceID();
ztz->requested_zone_id = database.GetZoneID(zone_name);
ztz->admin = initiator->Admin();
strcpy(ztz->name, initiator->GetName());
ztz->guild_id = initiator->GuildID();
ztz->ignorerestrictions = 3;
worldserver.SendPacket(pack);
safe_delete(pack);
} else {
auto client_raid = initiator->GetRaid();
for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) {
if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) {
auto raid_member = client_raid->members[member_index].member->CastToClient();
auto pack = new ServerPacket(ServerOP_ZoneToZoneRequest, sizeof(ZoneToZone_Struct));
ZoneToZone_Struct* ztz = (ZoneToZone_Struct*) pack->pBuffer;
ztz->response = 0;
ztz->current_zone_id = zone->GetZoneID();
ztz->current_instance_id = zone->GetInstanceID();
ztz->requested_zone_id = database.GetZoneID(zone_name);
ztz->admin = raid_member->Admin();
strcpy(ztz->name, raid_member->GetName());
ztz->guild_id = raid_member->GuildID();
ztz->ignorerestrictions = 3;
worldserver.SendPacket(pack);
safe_delete(pack);
}
}
}
}
}
void QuestManager::settimer(const char *timer_name, int seconds) { void QuestManager::settimer(const char *timer_name, int seconds) {
QuestManagerCurrentQuestVars(); QuestManagerCurrentQuestVars();

View File

@ -77,6 +77,8 @@ public:
void selfcast(int spell_id); void selfcast(int spell_id);
void addloot(int item_id, int charges = 0, bool equipitem = true, int aug1 = 0, int aug2 = 0, int aug3 = 0, int aug4 = 0, int aug5 = 0, int aug6 = 0); void addloot(int item_id, int charges = 0, bool equipitem = true, int aug1 = 0, int aug2 = 0, int aug3 = 0, int aug4 = 0, int aug5 = 0, int aug6 = 0);
void Zone(const char *zone_name); void Zone(const char *zone_name);
void ZoneGroup(const char *zone_name);
void ZoneRaid(const char *zone_name);
void settimer(const char *timer_name, int seconds); void settimer(const char *timer_name, int seconds);
void settimerMS(const char *timer_name, int milliseconds); void settimerMS(const char *timer_name, int milliseconds);
void settimerMS(const char *timer_name, int milliseconds, EQ::ItemInstance *inst); void settimerMS(const char *timer_name, int milliseconds, EQ::ItemInstance *inst);

View File

@ -192,7 +192,7 @@ void Mob::DoSpecialAttackDamage(Mob *who, EQ::skills::SkillType skill, int32 bas
DoAttack(who, my_hit); DoAttack(who, my_hit);
who->AddToHateList(this, hate, 0, false); who->AddToHateList(this, hate, 0);
if (my_hit.damage_done > 0 && aabonuses.SkillAttackProc[0] && aabonuses.SkillAttackProc[1] == skill && if (my_hit.damage_done > 0 && aabonuses.SkillAttackProc[0] && aabonuses.SkillAttackProc[1] == skill &&
IsValidSpell(aabonuses.SkillAttackProc[2])) { IsValidSpell(aabonuses.SkillAttackProc[2])) {
float chance = aabonuses.SkillAttackProc[0] / 1000.0f; float chance = aabonuses.SkillAttackProc[0] / 1000.0f;
@ -870,7 +870,7 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, co
} }
if (IsClient() && !CastToClient()->GetFeigned()) if (IsClient() && !CastToClient()->GetFeigned())
other->AddToHateList(this, hate, 0, false); other->AddToHateList(this, hate, 0);
other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQ::skills::SkillArchery); other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQ::skills::SkillArchery);
@ -1200,9 +1200,9 @@ void NPC::DoRangedAttackDmg(Mob* other, bool Launch, int16 damage_mod, int16 cha
if (TotalDmg > 0) { if (TotalDmg > 0) {
TotalDmg += TotalDmg * damage_mod / 100; TotalDmg += TotalDmg * damage_mod / 100;
other->AddToHateList(this, TotalDmg, 0, false); other->AddToHateList(this, TotalDmg, 0);
} else { } else {
other->AddToHateList(this, 0, 0, false); other->AddToHateList(this, 0, 0);
} }
other->Damage(this, TotalDmg, SPELL_UNKNOWN, skillInUse); other->Damage(this, TotalDmg, SPELL_UNKNOWN, skillInUse);
@ -1384,7 +1384,7 @@ void Mob::DoThrowingAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, c
} }
if (IsClient() && !CastToClient()->GetFeigned()) if (IsClient() && !CastToClient()->GetFeigned())
other->AddToHateList(this, WDmg, 0, false); other->AddToHateList(this, WDmg, 0);
other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQ::skills::SkillThrowing); other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQ::skills::SkillThrowing);
@ -2158,7 +2158,7 @@ void Mob::DoMeleeSkillAttackDmg(Mob *other, uint16 weapon_damage, EQ::skills::Sk
CanSkillProc = false; // Disable skill procs CanSkillProc = false; // Disable skill procs
} }
other->AddToHateList(this, hate, 0, false); other->AddToHateList(this, hate, 0);
if (damage > 0 && aabonuses.SkillAttackProc[0] && aabonuses.SkillAttackProc[1] == skillinuse && if (damage > 0 && aabonuses.SkillAttackProc[0] && aabonuses.SkillAttackProc[1] == skillinuse &&
IsValidSpell(aabonuses.SkillAttackProc[2])) { IsValidSpell(aabonuses.SkillAttackProc[2])) {
float chance = aabonuses.SkillAttackProc[0] / 1000.0f; float chance = aabonuses.SkillAttackProc[0] / 1000.0f;