From b591311803cb7e0c824058b6e9b94e156af0be49 Mon Sep 17 00:00:00 2001 From: Sarjuuk Date: Thu, 18 Dec 2025 00:54:20 +0100 Subject: [PATCH] Lang/Fixup * fix crash when race mask was resolved to faction * fix id buffer bleeding from resolving class mask into resolving race mask and vice versa * fixes #472 --- endpoints/itemset/itemset.php | 1 + endpoints/mail/mail.php | 20 +++++++++++--------- endpoints/quest/quest.php | 3 ++- endpoints/spell/spell.php | 3 ++- includes/dbtypes/item.class.php | 9 ++++----- includes/dbtypes/itemset.class.php | 4 ++-- localization/lang.class.php | 4 ++-- 7 files changed, 24 insertions(+), 20 deletions(-) diff --git a/endpoints/itemset/itemset.php b/endpoints/itemset/itemset.php index a975d734..c86ae527 100644 --- a/endpoints/itemset/itemset.php +++ b/endpoints/itemset/itemset.php @@ -98,6 +98,7 @@ class ItemsetBaseResponse extends TemplateResponse implements ICache $infobox[] = Lang::game('level').Lang::main('colon').Util::createNumRange($min, $this->subject->getField('maxLevel'), ' - '); // class + $jsg = []; if ($cl = Lang::getClassString($this->subject->getField('classMask'), $jsg, Lang::FMT_MARKUP)) { $this->extendGlobalIds(Type::CHR_CLASS, ...$jsg); diff --git a/endpoints/mail/mail.php b/endpoints/mail/mail.php index ffad7f29..41c20c3d 100644 --- a/endpoints/mail/mail.php +++ b/endpoints/mail/mail.php @@ -71,17 +71,19 @@ class MailBaseResponse extends TemplateResponse implements ICache } else if ($mlr = DB::World()->selectRow('SELECT * FROM mail_level_reward WHERE `mailTemplateId` = ?d', $this->typeId)) // level rewards { - if ($mlr['level']) - $infobox[] = Lang::game('level').Lang::main('colon').$mlr['level']; + if ($mlr['level']) + $infobox[] = Lang::game('level').Lang::main('colon').$mlr['level']; - if ($r = Lang::getRaceString($mlr['raceMask'], $rIds, Lang::FMT_MARKUP)) - { - $infobox[] = Lang::game('races').Lang::main('colon').$r; - $this->extendGlobalIds(Type::CHR_RACE, ...$rIds); - } + $jsg = []; + if ($r = Lang::getRaceString($mlr['raceMask'], $jsg, Lang::FMT_MARKUP)) + { + $this->extendGlobalIds(Type::CHR_RACE, ...$jsg); + $t = count($jsg) == 1 ? Lang::game('race') : Lang::game('races'); + $infobox[] = Util::ucFirst($t).Lang::main('colon').$r; + } - $infobox[] = Lang::mail('sender', ['[npc='.$mlr['senderEntry'].']']); - $this->extendGlobalIds(Type::NPC, $mlr['senderEntry']); + $infobox[] = Lang::mail('sender', ['[npc='.$mlr['senderEntry'].']']); + $this->extendGlobalIds(Type::NPC, $mlr['senderEntry']); } else // achievement or quest { diff --git a/endpoints/quest/quest.php b/endpoints/quest/quest.php index 33be74e6..4b347eb5 100644 --- a/endpoints/quest/quest.php +++ b/endpoints/quest/quest.php @@ -167,8 +167,8 @@ class QuestBaseResponse extends TemplateResponse implements ICache default => Lang::game('si', SIDE_BOTH) // 0, 3 }; - $jsg = []; // races + $jsg = []; if ($_ = Lang::getRaceString($this->subject->getField('reqRaceMask'), $jsg, Lang::FMT_MARKUP)) { $this->extendGlobalIds(Type::CHR_RACE, ...$jsg); @@ -177,6 +177,7 @@ class QuestBaseResponse extends TemplateResponse implements ICache } // classes + $jsg = []; if ($_ = Lang::getClassString($this->subject->getField('reqClassMask'), $jsg, Lang::FMT_MARKUP)) { $this->extendGlobalIds(Type::CHR_CLASS, ...$jsg); diff --git a/endpoints/spell/spell.php b/endpoints/spell/spell.php index b746bc70..a3b4b143 100644 --- a/endpoints/spell/spell.php +++ b/endpoints/spell/spell.php @@ -2369,8 +2369,8 @@ class SpellBaseResponse extends TemplateResponse implements ICache $infobox[] = (in_array($typeCat, [-2, 7, -13]) ? Lang::game('reqLevel', [$_]) : Lang::game('level').Lang::main('colon').$_); } - $jsg = []; // races + $jsg = []; if ($_ = Lang::getRaceString($this->subject->getField('reqRaceMask'), $jsg, Lang::FMT_MARKUP)) { $this->extendGlobalIds(Type::CHR_RACE, ...$jsg); @@ -2379,6 +2379,7 @@ class SpellBaseResponse extends TemplateResponse implements ICache } // classes + $jsg = []; if ($_ = Lang::getClassString($this->subject->getField('reqClassMask'), $jsg, Lang::FMT_MARKUP)) { $this->extendGlobalIds(Type::CHR_CLASS, ...$jsg); diff --git a/includes/dbtypes/item.class.php b/includes/dbtypes/item.class.php index 69603913..b1038688 100644 --- a/includes/dbtypes/item.class.php +++ b/includes/dbtypes/item.class.php @@ -880,23 +880,22 @@ class ItemList extends DBTypeList $x .= Lang::formatTime(abs($dur) * 1000, 'item', 'duration').$rt."
"; } - $jsg = []; // required classes + $jsg = []; if ($classes = Lang::getClassString($this->curTpl['requiredClass'], $jsg)) { foreach ($jsg as $js) - if (empty($this->jsGlobals[Type::CHR_CLASS][$js])) - $this->jsGlobals[Type::CHR_CLASS][$js] = $js; + $this->jsGlobals[Type::CHR_CLASS][$js] ??= $js; $x .= Lang::game('classes').Lang::main('colon').$classes.'
'; } // required races + $jsg = []; if ($races = Lang::getRaceString($this->curTpl['requiredRace'], $jsg)) { foreach ($jsg as $js) - if (empty($this->jsGlobals[Type::CHR_RACE][$js])) - $this->jsGlobals[Type::CHR_RACE][$js] = $js; + $this->jsGlobals[Type::CHR_RACE][$js] ??= $js; $x .= Lang::game('races').Lang::main('colon').$races.'
'; } diff --git a/includes/dbtypes/itemset.class.php b/includes/dbtypes/itemset.class.php index 3ddb1a63..27a83663 100644 --- a/includes/dbtypes/itemset.class.php +++ b/includes/dbtypes/itemset.class.php @@ -101,8 +101,8 @@ class ItemsetList extends DBTypeList { $jsg = []; $cl = Lang::getClassString($_, $jsg); - $nCl = count($jsg); - $x .= Util::ucFirst($nCl > 1 ? Lang::game('classes') : Lang::game('class')).Lang::main('colon').$cl.'
'; + $t = count($jsg) == 1 ? Lang::game('class') : Lang::game('classes'); + $x .= Util::ucFirst($t).Lang::main('colon').$cl.'
'; } if ($_ = $this->getField('contentGroup')) diff --git a/localization/lang.class.php b/localization/lang.class.php index 269a600b..006d2ee1 100644 --- a/localization/lang.class.php +++ b/localization/lang.class.php @@ -447,7 +447,7 @@ class Lang return implode(', ', $tmp); } - public static function getClassString(int $classMask, ?array &$ids = [], int $fmt = self::FMT_HTML) : string + public static function getClassString(int $classMask, array &$ids = [], int $fmt = self::FMT_HTML) : string { $classMask &= ChrClass::MASK_ALL; // clamp to available classes.. @@ -471,7 +471,7 @@ class Lang return implode(', ', $tmp); } - public static function getRaceString(int $raceMask, ?array &$ids = [], int $fmt = self::FMT_HTML) : string + public static function getRaceString(int $raceMask, array &$ids = [], int $fmt = self::FMT_HTML) : string { $raceMask &= ChrRace::MASK_ALL; // clamp to available races..