Skip to content

Commit

Permalink
[Feature] Add Strings::BeginsWith() and Strings::EndsWith() (#3471)
Browse files Browse the repository at this point in the history
* [Strings] Add Strings::BeginsWith() and Strings::EndsWith()

# Notes
- These are useful so that we don't have to manually calculate size or perform a substring.

* Update questmgr.cpp

* Update client.cpp
  • Loading branch information
Kinglykrab authored Jul 3, 2023
1 parent 2717fcc commit ee14aed
Show file tree
Hide file tree
Showing 7 changed files with 73 additions and 68 deletions.
23 changes: 23 additions & 0 deletions common/strings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -695,8 +695,31 @@ std::string Strings::ConvertToDigit(int n, const std::string& suffix)
return NUM_TO_ENGLISH_X[n] + suffix;
}
}

bool Strings::BeginsWith(const std::string& subject, const std::string& search)
{
if (subject.length() < search.length()) {
return false;
}

return subject.starts_with(search);
}

bool Strings::EndsWith(const std::string& subject, const std::string& search)
{
if (subject.length() < search.length()) {
return false;
}

return subject.ends_with(search);
}

bool Strings::Contains(const std::string& subject, const std::string& search)
{
if (subject.length() < search.length()) {
return false;
}

return subject.find(search) != std::string::npos;
}

Expand Down
2 changes: 2 additions & 0 deletions common/strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ class Strings {
static bool ToBool(const std::string& bool_string);
static inline bool EqualFold(const std::string &string_one, const std::string &string_two) { return strcasecmp(string_one.c_str(), string_two.c_str()) == 0; }
static std::string Random(size_t length);
static bool BeginsWith(const std::string& subject, const std::string& search);
static bool EndsWith(const std::string& subject, const std::string& search);

template<typename T>
static std::string
Expand Down
90 changes: 32 additions & 58 deletions zone/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5939,90 +5939,64 @@ void Client::AdventureFinish(bool win, int theme, int points)
FastQueuePacket(&outapp);
}

void Client::CheckLDoNHail(Mob *target)
void Client::CheckLDoNHail(NPC* n)
{
if(!zone->adv_data)
{
return;
}

if(!target || !target->IsNPC())
{
if (!zone->adv_data || !n || n->GetOwnerID()) {
return;
}

if(target->GetOwnerID() != 0)
{
auto* ds = (ServerZoneAdventureDataReply_Struct*) zone->adv_data;
if (ds->type != Adventure_Rescue || ds->data_id != n->GetNPCTypeID()) {
return;
}

ServerZoneAdventureDataReply_Struct* ds = (ServerZoneAdventureDataReply_Struct*)zone->adv_data;
if(ds->type != Adventure_Rescue)
{
return;
}

if(ds->data_id != target->GetNPCTypeID())
{
return;
}

if(entity_list.CheckNPCsClose(target) != 0)
{
target->Say("You're here to save me? I couldn't possibly risk leaving yet. There are "
"far too many of those horrid things out there waiting to recapture me! Please get"
" rid of some more of those vermin and then we can try to leave.");
if (entity_list.CheckNPCsClose(n)) {
n->Say(
"You're here to save me? I couldn't possibly risk leaving yet. There are "
"far too many of those horrid things out there waiting to recapture me! Please get "
"rid of some more of those vermin and then we can try to leave."
);
return;
}

Mob *pet = GetPet();
if(pet)
{
if(pet->GetPetType() == petCharmed)
{
auto pet = GetPet();
if (pet) {
if (pet->GetPetType() == petCharmed) {
pet->BuffFadeByEffect(SE_Charm);
}
else if(pet->GetPetType() == petNPCFollow)
{
} else if (pet->GetPetType() == petNPCFollow) {
pet->SetOwnerID(0);
}
else
{
} else {
pet->Depop();
}
}

SetPet(target);
target->SetOwnerID(GetID());
target->Say("Wonderful! Someone to set me free! I feared for my life for so long,"
" never knowing when they might choose to end my life. Now that you're here though"
" I can rest easy. Please help me find my way out of here as soon as you can"
" I'll stay close behind you!");
SetPet(n);
n->SetOwnerID(GetID());
n->Say(
"Wonderful! Someone to set me free! I feared for my life for so long, "
"never knowing when they might choose to end my life. Now that you're here though "
"I can rest easy. Please help me find my way out of here as soon as you can "
"I'll stay close behind you!"
);
}

void Client::CheckEmoteHail(Mob *target, const char* message)
void Client::CheckEmoteHail(NPC* n, const char* message)
{
if(
(message[0] != 'H' &&
message[0] != 'h') ||
message[1] != 'a' ||
message[2] != 'i' ||
message[3] != 'l'){
if (
!Strings::BeginsWith(message, "hail") &&
!Strings::BeginsWith(message, "Hail")
) {
return;
}

if(!target || !target->IsNPC())
{
if (!n || n->GetOwnerID()) {
return;
}

if(target->GetOwnerID() != 0)
{
return;
const auto emote_id = n->GetEmoteID();
if (emote_id) {
n->DoNPCEmote(EQ::constants::EmoteEventTypes::Hailed, emote_id);
}
uint32 emoteid = target->GetEmoteID();
if(emoteid != 0)
target->CastToNPC()->DoNPCEmote(EQ::constants::EmoteEventTypes::Hailed, emoteid);
}

void Client::MarkSingleCompassLoc(float in_x, float in_y, float in_z, uint8 count)
Expand Down
4 changes: 2 additions & 2 deletions zone/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -1360,8 +1360,8 @@ class Client : public Mob
uint32 GetLDoNLossesTheme(uint32 t);
uint32 GetLDoNPointsTheme(uint32 t);
void UpdateLDoNWinLoss(uint32 theme_id, bool win = false, bool remove = false);
void CheckLDoNHail(Mob *target);
void CheckEmoteHail(Mob *target, const char* message);
void CheckLDoNHail(NPC* n);
void CheckEmoteHail(NPC* n, const char* message);

void HandleLDoNOpen(NPC *target);
void HandleLDoNSenseTraps(NPC *target, uint16 skill, uint8 type);
Expand Down
10 changes: 8 additions & 2 deletions zone/client_packet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9147,8 +9147,14 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app)
}
else if (inst->IsClassCommon())
{
if (!RuleB(Skills, RequireTomeHandin) && item->ItemType == EQ::item::ItemTypeSpell && (strstr((const char*)item->Name, "Tome of ") || strstr((const char*)item->Name, "Skill: ")))
{
if (
!RuleB(Skills, RequireTomeHandin) &&
item->ItemType == EQ::item::ItemTypeSpell &&
(
Strings::BeginsWith(item->Name, "Tome of ") ||
Strings::BeginsWith(item->Name, "Skill: ")
)
) {
DeleteItemInInventory(slot_id, 1, true);
TrainDiscipline(item->ID);
}
Expand Down
8 changes: 4 additions & 4 deletions zone/effects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -622,8 +622,8 @@ bool Client::TrainDiscipline(uint32 itemid) {
const std::string item_name = item->Name;

if (
item_name.substr(0, 5) != std::string("Tome ") &&
item_name.substr(0, 7) != std::string("Skill: ")
!Strings::BeginsWith(item_name, "Tome of ") &&
!Strings::BeginsWith(item_name, "Skill: ")
) {
Message(Chat::Red, "This item is not a tome.");
//summon them the item back...
Expand Down Expand Up @@ -709,8 +709,8 @@ bool Client::MemorizeSpellFromItem(uint32 item_id) {
const std::string item_name = item->Name;

if (
item_name.substr(0, 7) != std::string("Spell: ") &&
item_name.substr(0, 6) != std::string("Song: ")
!Strings::BeginsWith(item_name, "Spell: ") &&
!Strings::BeginsWith(item_name, "Song: ")
) {
Message(Chat::Red, "This item is not a scroll.");
SummonItem(item_id);
Expand Down
4 changes: 2 additions & 2 deletions zone/questmgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1018,8 +1018,8 @@ bool QuestManager::isdisctome(uint32 item_id) {
const std::string item_name = item->Name;

if (
strcmp(item_name.substr(0, 5).c_str(), "Tome ") &&
strcmp(item_name.substr(0, 7).c_str(), "Skill: ")
!Strings::BeginsWith(item_name, "Tome of ") &&
!Strings::BeginsWith(item_name, "Skill: ")
) {
return false;
}
Expand Down

0 comments on commit ee14aed

Please sign in to comment.