From e2fe765980718ffebfea09e57a271f75a2044b29 Mon Sep 17 00:00:00 2001 From: Sarjuuk Date: Sat, 17 Oct 2020 12:27:59 +0200 Subject: [PATCH] SAI/Compat * add changes from TC of the last three years * reduce redundancy when handling creature text * reserve more space in target, event, action parameters. Move own parameters further back to avoid confict with future param expansion by TC --- includes/defines.php | 41 ++++-- includes/game.php | 99 ++++++++++++++ includes/smartAI.class.php | 250 ++++++++++++++++++++--------------- localization/locale_dede.php | 116 +++++++++------- localization/locale_enus.php | 120 ++++++++++------- localization/locale_eses.php | 120 ++++++++++------- localization/locale_frfr.php | 120 ++++++++++------- localization/locale_ruru.php | 120 ++++++++++------- localization/locale_zhcn.php | 118 ++++++++++------- pages/npc.php | 75 +---------- pages/spell.php | 7 +- template/pages/npc.tpl.php | 4 +- 12 files changed, 698 insertions(+), 492 deletions(-) diff --git a/includes/defines.php b/includes/defines.php index 18459de32..87e52fa33 100644 --- a/includes/defines.php +++ b/includes/defines.php @@ -1313,7 +1313,7 @@ define('SAI_EVENT_UPDATE_IC', 0); // In combat. define('SAI_EVENT_UPDATE_OOC', 1); // Out of combat. -define('SAI_EVENT_HEALT_PCT', 2); // Health Percentage +define('SAI_EVENT_HEALTH_PCT', 2); // Health Percentage define('SAI_EVENT_MANA_PCT', 3); // Mana Percentage define('SAI_EVENT_AGGRO', 4); // On Creature Aggro define('SAI_EVENT_KILL', 5); // On Creature Kill @@ -1389,6 +1389,11 @@ define('SAI_EVENT_DISTANCE_CREATURE', 75); // On creature guid OR any instance of creature entry is within distance. define('SAI_EVENT_DISTANCE_GAMEOBJECT', 76); // On gameobject guid OR any instance of gameobject entry is within distance. define('SAI_EVENT_COUNTER_SET', 77); // If the value of specified counterID is equal to a specified value +// define('SAI_EVENT_SCENE_START', 78); // don't use on 3.3.5a +// define('SAI_EVENT_SCENE_TRIGGER', 79); // don't use on 3.3.5a +// define('SAI_EVENT_SCENE_CANCEL', 80); // don't use on 3.3.5a +// define('SAI_EVENT_SCENE_COMPLETE', 81); // don't use on 3.3.5a +define('SAI_EVENT_SUMMONED_UNIT_DIES', 82); // CreatureId(0 all), CooldownMin, CooldownMax define('SAI_ACTION_NONE', 0); // Do nothing define('SAI_ACTION_TALK', 1); // Param2 in Milliseconds. @@ -1436,7 +1441,7 @@ define('SAI_ACTION_MOUNT_TO_ENTRY_OR_MODEL', 43); // Mount to Creature Entry (param1) OR Mount to Creature Display (param2) Or both = 0 for Unmount define('SAI_ACTION_SET_INGAME_PHASE_MASK', 44); // define('SAI_ACTION_SET_DATA', 45); // Set Data For Target, can be used with SMART_EVENT_DATA_SET -// define('SAI_ACTION_UNUSED_46', 46); // +define('SAI_ACTION_ATTACK_STOP', 46); // define('SAI_ACTION_SET_VISIBILITY', 47); // Makes creature Visible = 1 or Invisible = 0 define('SAI_ACTION_SET_ACTIVE', 48); // define('SAI_ACTION_ATTACK_START', 49); // Allows basic melee swings to creature. @@ -1460,7 +1465,7 @@ define('SAI_ACTION_CREATE_TIMED_EVENT', 67); // define('SAI_ACTION_PLAYMOVIE', 68); // define('SAI_ACTION_MOVE_TO_POS', 69); // PointId is called by SMART_EVENT_MOVEMENTINFORM. Continue this action with the TARGET_TYPE column. Use any target_type, and use target_x, target_y, target_z, target_o as the coordinates -define('SAI_ACTION_ENABLE_TEMP_GOBJ', 70); // Always action_param1>0 For npcs use action_type=133 +define('SAI_ACTION_ENABLE_TEMP_GOBJ', 70); // param1 = duration define('SAI_ACTION_EQUIP', 71); // only slots with mask set will be sent to client, bits are 1, 2, 4, leaving mask 0 is defaulted to mask 7 (send all), Slots1-3 are only used if no Param1 is set define('SAI_ACTION_CLOSE_GOSSIP', 72); // Closes gossip window. define('SAI_ACTION_TRIGGER_TIMED_EVENT', 73); // @@ -1475,7 +1480,7 @@ define('SAI_ACTION_ADD_NPC_FLAG', 82); // define('SAI_ACTION_REMOVE_NPC_FLAG', 83); // define('SAI_ACTION_SIMPLE_TALK', 84); // Makes a player say text. SMART_EVENT_TEXT_OVER is not triggered and whispers can not be used. -define('SAI_ACTION_INVOKER_CAST', 85); // if avaliable, last used invoker will cast spellId with castFlags on targets +define('SAI_ACTION_SELF_CAST', 85); // spellID, castFlags define('SAI_ACTION_CROSS_CAST', 86); // This action is used to make selected caster (in CasterTargetType) to cast spell. Actual target is entered in target_type as normally. define('SAI_ACTION_CALL_RANDOM_TIMED_ACTIONLIST', 87); // Will select one entry from the ones provided. 0 is ignored. define('SAI_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST', 88); // 0 is ignored. @@ -1517,19 +1522,25 @@ define('SAI_ACTION_LOAD_EQUIPMENT', 124); // define('SAI_ACTION_TRIGGER_RANDOM_TIMED_EVENT', 125); // define('SAI_ACTION_REMOVE_ALL_GAMEOBJECTS', 126); // -define('SAI_ACTION_STOP_MOTION', 127); // -// define('SAI_ACTION_PLAY_ANIMKIT', 128); // // don't use on 3.3.5a -// define('SAI_ACTION_SCENE_PLAY', 129); // // don't use on 3.3.5a -// define('SAI_ACTION_SCENE_CANCEL', 130); // // don't use on 3.3.5a +define('SAI_ACTION_PAUSE_MOVEMENT', 127); // MovementSlot (default = 0, active = 1, controlled = 2), PauseTime (ms), Force +// define('SAI_ACTION_PLAY_ANIMKIT', 128); // don't use on 3.3.5a +// define('SAI_ACTION_SCENE_PLAY', 129); // don't use on 3.3.5a +// define('SAI_ACTION_SCENE_CANCEL', 130); // don't use on 3.3.5a define('SAI_ACTION_SPAWN_SPAWNGROUP', 131); // define('SAI_ACTION_DESPAWN_SPAWNGROUP', 132); // -define('SAI_ACTION_RESPAWN_BY_SPAWNID', 133); // Use to respawn npcs and gobs, the target in this case is always=1 and only a single unit could be a target via the spawnId (action_param1, action_param2) +define('SAI_ACTION_RESPAWN_BY_SPAWNID', 133); // type, typeGuid - Use to respawn npcs and gobs, the target in this case is always=1 and only a single unit could be a target via the spawnId (action_param1, action_param2) +define('SAI_ACTION_INVOKER_CAST', 134); // spellID, castFlags +define('SAI_ACTION_PLAY_CINEMATIC', 135); // cinematic +define('SAI_ACTION_SET_MOVEMENT_SPEED', 136); // movementType, speedInteger, speedFraction +define('SAI_ACTION_PLAY_SPELL_VISUAL_KIT', 137); // spellVisualKitId (RESERVED, PENDING CHERRYPICK) +define('SAI_ACTION_OVERRIDE_LIGHT', 138); // zoneId, areaLightId, overrideLightID, transitionMilliseconds +define('SAI_ACTION_OVERRIDE_WEATHER', 139); // zoneId, weatherId, intensity define('SAI_CAST_FLAG_INTERRUPT_PREV', 0x01); define('SAI_CAST_FLAG_TRIGGERED', 0x02); -// define('SAI_CAST_FORCE_CAST', 0x04); // Forces cast even if creature is out of mana or out of range -// define('SAI_CAST_NO_MELEE_IF_OOM', 0x08); // Prevents creature from entering melee if out of mana or out of range -// define('SAI_CAST_FORCE_TARGET_SELF', 0x10); // the target to cast this spell on itself +// define('SAI_CAST_FORCE_CAST', 0x04); // Forces cast even if creature is out of mana or out of range +// define('SAI_CAST_NO_MELEE_IF_OOM', 0x08); // Prevents creature from entering melee if out of mana or out of range +// define('SAI_CAST_FORCE_TARGET_SELF', 0x10); // the target to cast this spell on itself define('SAI_CAST_FLAG_AURA_MISSING', 0x20); define('SAI_CAST_FLAG_COMBAT_MOVE', 0x40); @@ -1577,6 +1588,7 @@ define('SAI_TARGET_LOOT_RECIPIENTS', 27); // All tagging players define('SAI_TARGET_FARTHEST', 28); // Farthest unit on the threat list define('SAI_TARGET_VEHICLE_ACCESSORY', 29); // Vehicle can target unit in given seat +define('SAI_TARGET_CLOSEST_UNSPAWNED_GO', 30); // entry(0any), maxDist define('SAI_TEMPLATE_BASIC', 0); // define('SAI_TEMPLATE_CASTER', 1); // +JOIN: target_param1 as castFlag @@ -1585,6 +1597,11 @@ define('SAI_TEMPLATE_CAGED_GO_PART', 4); // define('SAI_TEMPLATE_CAGED_NPC_PART', 5); // +define('SAI_SPAWN_FLAG_NONE', 0x00); +define('SAI_SPAWN_FLAG_IGNORE_RESPAWN', 0x01); // onSpawnIn - ignore & reset respawn timer +define('SAI_SPAWN_FLAG_FORCE_SPAWN', 0x02); // onSpawnIn - force additional spawn if already in world +define('SAI_SPAWN_FLAG_NOSAVE_RESPAWN', 0x04); // onDespawn - remove respawn time + // profiler queue interactions define('PR_QUEUE_STATUS_ENDED', 0); define('PR_QUEUE_STATUS_WAITING', 1); diff --git a/includes/game.php b/includes/game.php index 3735d3d18..43999dab1 100644 --- a/includes/game.php +++ b/includes/game.php @@ -272,6 +272,105 @@ public static function worldPosToZonePos(int $mapId, float $posX, float $posY, i return $points; } + + public static function getQuotesForCreature(int $creatureId, bool $asHTML = false, string $talkSource = '') : array + { + $nQuotes = 0; + $quotes = []; + $soundIds = []; + + $quoteSrc = DB::World()->select(' + SELECT + ct.GroupID AS ARRAY_KEY, ct.ID as ARRAY_KEY2, + ct.`Type` AS `talkType`, + ct.TextRange AS `range`, + IFNULL(bct.`LanguageID`, ct.`Language`) AS lang, + IFNULL(NULLIF(bct.Text, ""), IFNULL(NULLIF(bct.Text1, ""), IFNULL(ct.`Text`, ""))) AS text_loc0, + {IFNULL(NULLIF(bctl.Text, ""), IFNULL(NULLIF(bctl.Text1, ""), IFNULL(ctl.Text, ""))) AS text_loc?d,} + IF(bct.SoundEntriesID > 0, bct.SoundEntriesID, ct.Sound) AS soundId + FROM + creature_text ct + {LEFT JOIN + creature_text_locale ctl ON ct.CreatureID = ctl.CreatureID AND ct.GroupID = ctl.GroupID AND ct.ID = ctl.ID AND ctl.Locale = ?} + LEFT JOIN + broadcast_text bct ON ct.BroadcastTextId = bct.ID + {LEFT JOIN + broadcast_text_locale bctl ON ct.BroadcastTextId = bctl.ID AND bctl.locale = ?} + WHERE + ct.CreatureID = ?d', + User::$localeId ?: DBSIMPLE_SKIP, + User::$localeId ? Util::$localeStrings[User::$localeId] : DBSIMPLE_SKIP, + User::$localeId ? Util::$localeStrings[User::$localeId] : DBSIMPLE_SKIP, + $creatureId + ); + + foreach ($quoteSrc as $grp => $text) + { + $group = []; + foreach ($text as $t) + { + if ($t['soundId']) + $soundIds[] = $t['soundId']; + + $msg = Util::localizedString($t, 'text'); + if (!$msg) + continue; + + // fixup .. either set %s for emotes or dont >.< + if (in_array($t['talkType'], [2, 16]) && strpos($msg, '%s') === false) + $msg = '%s '.$msg; + + // fixup: bad case-insensivity + $msg = Util::parseHtmlText(str_replace('%S', '%s', htmlentities($msg)), !$asHTML); + + if ($talkSource) + $msg = sprintf($msg, $talkSource); + + // make type css compatible + switch ($t['talkType']) + { + case 1: // yell: + case 14: $t['talkType'] = 1; break; // - dark red + case 2: // emote: + case 16: // " + case 3: // boss emote: + case 41: $t['talkType'] = 4; break; // - orange + case 4: // whisper: + case 15: // " + case 5: // boss whisper: + case 42: $t['talkType'] = 3; break; // - pink-ish + default: $t['talkType'] = 2; // [type: 0, 12] say: yellow-ish + + } + + // prefix + $pre = ''; + if ($t['talkType'] != 4) + $pre = ($talkSource ?: '%s').' '.Lang::npc('textTypes', $t['talkType']).Lang::main('colon').($t['lang'] ? '['.Lang::game('languages', $t['lang']).'] ' : null); + + if ($asHTML) + $msg = '
%s'.($t['range'] ? sprintf(Util::$dfnString, Lang::npc('textRanges', $t['range']), $msg) : $msg).'
'; + else + $msg = '[div][span class=s'.$t['talkType'].']%s'.html_entity_decode($msg).'[/span][/div]'; + + $line = array( + 'range' => $t['range'], + 'text' => $msg, + 'prefix' => $pre + ); + + + $nQuotes++; + $group[] = $line; + } + + if ($group) + $quotes[$grp] = $group; + } + + return [$quotes, $nQuotes, $soundIds]; + } + } ?> diff --git a/includes/smartAI.class.php b/includes/smartAI.class.php index 457dce58d..b4678ff14 100644 --- a/includes/smartAI.class.php +++ b/includes/smartAI.class.php @@ -25,7 +25,7 @@ public function __construct(int $srcType, int $entry, array $miscData = []) $this->entry = $entry; $this->miscData = $miscData; - $raw = DB::World()->select('SELECT id, link, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, target_type, target_param1, target_param2, target_param3, target_param4, target_x, target_y, target_z, target_o FROM smart_scripts WHERE entryorguid = ?d AND source_type = ?d ORDER BY id ASC', $this->entry, $this->srcType); + $raw = DB::World()->select('SELECT id, link, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, event_param5, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, target_type, target_param1, target_param2, target_param3, target_param4, target_x, target_y, target_z, target_o FROM smart_scripts WHERE entryorguid = ?d AND source_type = ?d ORDER BY id ASC', $this->entry, $this->srcType); foreach ($raw as $r) { $this->rawData[$r['id']] = array( @@ -36,7 +36,7 @@ public function __construct(int $srcType, int $entry, array $miscData = []) 'phases' => Util::mask2bits($r['event_phase_mask'], 1) ?: [0], 'chance' => $r['event_chance'], 'flags' => $r['event_flags'], - 'param' => [$r['event_param1'], $r['event_param2'], $r['event_param3'], $r['event_param4'], 0] + 'param' => [$r['event_param1'], $r['event_param2'], $r['event_param3'], $r['event_param4'], $r['event_param5']] ), 'action' => array( 'type' => $r['action_type'], @@ -204,72 +204,15 @@ private function getQuotes(int $creatureId) : void if (isset($this->quotes[$creatureId])) return; - $quoteSrc = DB::World()->select(' - SELECT - ct.CreatureID, ct.GroupID, ct.ID, ct.`Type`, - ct.TextRange AS `range`, - IFNULL(bct.`LanguageID`, ct.`Language`) AS lang, - IFNULL(NULLIF(bct.Text, ""), IFNULL(NULLIF(bct.Text1, ""), IFNULL(ct.`Text`, ""))) AS text_loc0, - {IFNULL(NULLIF(bctl.Text, ""), IFNULL(NULLIF(bctl.Text1, ""), IFNULL(ctl.Text, ""))) AS text_loc?d,} - IF(bct.SoundEntriesID > 0, bct.SoundEntriesID, ct.Sound) AS soundId - FROM - creature_text ct - {LEFT JOIN - creature_text_locale ctl ON ct.CreatureID = ctl.CreatureID AND ct.GroupID = ctl.GroupID AND ct.ID = ctl.ID AND ctl.Locale = ?} - LEFT JOIN - broadcast_text bct ON ct.BroadcastTextId = bct.ID - {LEFT JOIN - broadcast_text_locale bctl ON ct.BroadcastTextId = bctl.ID AND bctl.locale = ?} - WHERE - ct.CreatureID = ?d', - User::$localeId ?: DBSIMPLE_SKIP, - User::$localeId ? Util::$localeStrings[User::$localeId] : DBSIMPLE_SKIP, - User::$localeId ? Util::$localeStrings[User::$localeId] : DBSIMPLE_SKIP, - $creatureId - ); - - foreach ($quoteSrc as $text) - { - $msg = Util::localizedString($text, 'text'); - if (!$msg) - continue; - - // fixup .. either set %s for emotes or dont >.< - if (in_array($text['Type'], [2, 16]) && strpos($msg, '%s') === false) - $msg = '%s '.$msg; - - // fixup: bad case-insensivity - $msg = str_replace('%S', '%s', $msg); - - $line = array( - 'range' => $text['range'], - 'type' => 2, // [type: 0, 12] say: yellow-ish - 'lang' => !empty($text['lang']) ? Lang::game('languages', $text['lang']) : null, - 'text' => Util::parseHtmlText(htmlentities($msg), true) - ); - - switch ($text['Type']) - { - case 1: // yell: - case 14: $line['type'] = 1; break; // - dark red - case 2: // emote: - case 16: // " - case 3: // boss emote: - case 41: $line['type'] = 4; break; // - orange - case 4: // whisper: - case 15: // " - case 5: // boss whisper: - case 42: $line['type'] = 3; break; // - pink-ish - } + [$quotes, , ] = Game::getQuotesForCreature($creatureId); - $this->quotes[$text['CreatureID']][$text['GroupID']][] = $line; - } + $this->quotes[$creatureId] = $quotes; - if (isset($this->quotes[$text['CreatureID']])) - $this->quotes[$text['CreatureID']]['src'] = Util::jsEscape(CreatureList::getName($text['CreatureID'])); + if (!empty($this->quotes[$creatureId])) + $this->quotes[$creatureId]['src'] = Util::jsEscape(CreatureList::getName($creatureId)); } - private function getTalkSource() : int + private function getTalkSource(bool &$emptySource = false) : int { if ($this->itr['action']['type'] != SAI_ACTION_TALK && $this->itr['action']['type'] != SAI_ACTION_SIMPLE_TALK) @@ -286,9 +229,10 @@ private function getTalkSource() : int case SAI_TARGET_CREATURE_DISTANCE: case SAI_TARGET_CLOSEST_CREATURE: return $this->itr['target']['param'][0]; + case SAI_TARGET_CLOSEST_PLAYER: + $emptySource = true; case SAI_TARGET_SELF: case SAI_TARGET_ACTION_INVOKER: - case SAI_TARGET_CLOSEST_PLAYER: case SAI_TARGET_CLOSEST_FRIENDLY: // unsure about this default: return empty($this->miscData['baseEntry']) ? $this->entry : $this->miscData['baseEntry']; @@ -405,6 +349,17 @@ private function goFlags(string $f, int $n) : string return Lang::concat($gf ?: [Lang::smartAI('empty')]); } + private function spawnFlags(string $f, int $n) : string + { + $sf = []; + for ($i = 1; $i <= SAI_SPAWN_FLAG_NOSAVE_RESPAWN; $i <<= 1) + if ($this->itr[$f]['param'][$n] & $i) + if ($x = Lang::smartAI('spawnFlags', $i)) + $sf[] = $x; + + return Lang::concat($sf ?: [Lang::smartAI('empty')]); + } + private function aiTemplate(int $aiNum) : string { if ($standState = Lang::smartAI('aiTpl', $aiNum)) @@ -430,6 +385,9 @@ private function target(array $override = []) : string $getDist = function ($min, $max) { return ($min && $max) ? min($min, $max).' – '.max($min, $max) : max($min, $max); }; $tooltip = '[tooltip name=t-'.$this->rowKey.']'.Lang::smartAI('targetTT', array_merge([$t['type']], $t['param'], $t['pos'])).'[/tooltip][span class=tip tooltip=t-'.$this->rowKey.']%s[/span]'; + // additional parameters + $t['param'] = array_pad($t['param'], 15, ''); + switch ($t['type']) { // direct param use @@ -451,51 +409,55 @@ private function target(array $override = []) : string case SAI_TARGET_CLOSEST_FRIENDLY: // 26 case SAI_TARGET_LOOT_RECIPIENTS: // 27 case SAI_TARGET_FARTHEST: // 28 - case SAI_TARGET_VEHICLE_ACCESSORY: // 29 + break; + case SAI_TARGET_VEHICLE_PASSENGER: // 29 + if ($t['param'][0]) + $t['param'][10] = Lang::concat(Util::mask2bits($t['param'][0])); break; // distance case SAI_TARGET_PLAYER_RANGE: // 17 - $t['param'][3] = $getDist($t['param'][0], $t['param'][1]); + $t['param'][10] = $getDist($t['param'][0], $t['param'][1]); break; case SAI_TARGET_PLAYER_DISTANCE: // 18 - $t['param'][3] = $getDist(0, $t['param'][0]); + $t['param'][10] = $getDist(0, $t['param'][0]); break; // creature link case SAI_TARGET_CREATURE_RANGE: // 9 if ($t['param'][0]) $this->jsGlobals[TYPE_NPC][] = $t['param'][0]; - $t['param'][3] = $getDist($t['param'][1], $t['param'][2]); + $t['param'][10] = $getDist($t['param'][1], $t['param'][2]); break; case SAI_TARGET_CREATURE_GUID: // 10 - if ($t['param'][3] = DB::World()->selectCell('SELECT id FROM creature WHERE guid = ?d', $t['param'][0])) - $this->jsGlobals[TYPE_NPC][] = $t['param'][3]; + if ($t['param'][10] = DB::World()->selectCell('SELECT id FROM creature WHERE guid = ?d', $t['param'][0])) + $this->jsGlobals[TYPE_NPC][] = $t['param'][10]; else trigger_error('SmartAI::resloveTarget - creature with guid '.$t['param'][0].' not in DB'); break; case SAI_TARGET_CREATURE_DISTANCE: // 11 case SAI_TARGET_CLOSEST_CREATURE: // 19 - $t['param'][3] = $getDist(0, $t['param'][1]); + $t['param'][10] = $getDist(0, $t['param'][1]); if ($t['param'][0]) $this->jsGlobals[TYPE_NPC][] = $t['param'][0]; break; // gameobject link case SAI_TARGET_GAMEOBJECT_GUID: // 14 - if ($t['param'][3] = DB::World()->selectCell('SELECT id FROM gameobject WHERE guid = ?d', $t['param'][0])) - $this->jsGlobals[TYPE_OBJECT][] = $t['param'][3]; + if ($t['param'][10] = DB::World()->selectCell('SELECT id FROM gameobject WHERE guid = ?d', $t['param'][0])) + $this->jsGlobals[TYPE_OBJECT][] = $t['param'][10]; else trigger_error('SmartAI::resloveTarget - gameobject with guid '.$t['param'][0].' not in DB'); break; case SAI_TARGET_GAMEOBJECT_RANGE: // 13 - $t['param'][3] = $getDist($t['param'][1], $t['param'][2]); + $t['param'][10] = $getDist($t['param'][1], $t['param'][2]); if ($t['param'][0]) $this->jsGlobals[TYPE_OBJECT][] = $t['param'][0]; break; case SAI_TARGET_GAMEOBJECT_DISTANCE: // 15 case SAI_TARGET_CLOSEST_GAMEOBJECT: // 20 - $t['param'][3] = $getDist(0, $t['param'][1]); + case SAI_TARGET_CLOSEST_UNSPAWNED_GO: // 30 + $t['param'][10] = $getDist(0, $t['param'][1]); if ($t['param'][0]) $this->jsGlobals[TYPE_OBJECT][] = $t['param'][0]; @@ -524,8 +486,7 @@ private function event() : array $tooltip = '[tooltip name=e-'.$this->rowKey.']'.Lang::smartAI('eventTT', array_merge([$e['type'], $e['phases'], $e['chance'], $e['flags']], $e['param'])).'[/tooltip][span tooltip=e-'.$this->rowKey.']%s[/span]'; // additional parameters - $e['param'][5] = ''; - $e['param'][6] = ''; + $e['param'] = array_pad($e['param'], 15, ''); switch ($e['type']) { @@ -551,7 +512,6 @@ private function event() : array case SAI_EVENT_WAYPOINT_ENDED: // 58 - On Creature Waypoint Path Ended case SAI_EVENT_TIMED_EVENT_TRIGGERED: // 59 - case SAI_EVENT_JUST_CREATED: // 63 - - case SAI_EVENT_GOSSIP_HELLO: // 64 - On Right-Click Creature/Gameobject that have gossip enabled. case SAI_EVENT_FOLLOW_COMPLETED: // 65 - case SAI_EVENT_GO_STATE_CHANGED: // 70 - case SAI_EVENT_GO_EVENT_INFORM: // 71 - @@ -560,7 +520,7 @@ private function event() : array case SAI_EVENT_COUNTER_SET: // 77 - If the value of specified counterID is equal to a specified value break; // num range [+ time footer] - case SAI_EVENT_HEALT_PCT: // 2 - Health Percentage + case SAI_EVENT_HEALTH_PCT: // 2 - Health Percentage case SAI_EVENT_MANA_PCT: // 3 - Mana Percentage case SAI_EVENT_RANGE: // 9 - On Target In Range case SAI_EVENT_TARGET_HEALTH_PCT: // 12 - On Target Health Percentage @@ -569,7 +529,7 @@ private function event() : array case SAI_EVENT_DAMAGED_TARGET: // 33 - On Target Damaged case SAI_EVENT_RECEIVE_HEAL: // 53 - On Creature Received Healing case SAI_EVENT_FRIENDLY_HEALTH_PCT: // 74 - - $e['param'][5] = $this->numRange('event', 0); + $e['param'][10] = $this->numRange('event', 0); // do not break; case SAI_EVENT_OOC_LOS: // 10 - On Target In Distance Out of Combat case SAI_EVENT_FRIENDLY_HEALTH: // 14 - On Friendly Health Deficit @@ -583,13 +543,20 @@ private function event() : array case SAI_EVENT_UPDATE_IC: // 0 - In combat. case SAI_EVENT_UPDATE_OOC: // 1 - Out of combat. if ($this->srcType == SAI_SRC_TYPE_ACTIONLIST) - $e['param'][6] = 1; + $e['param'][11] = 1; // do not break; case SAI_EVENT_UPDATE: // 60 - - $e['param'][5] = $this->numRange('event', 0, true); + $e['param'][10] = $this->numRange('event', 0, true); if ($time = $this->numRange('event', 2, true)) $footer = $time; break; + case SAI_EVENT_GOSSIP_HELLO: // 64 - On Right-Click Creature/Gameobject that have gossip enabled. + if ($this->srcType == SAI_SRC_TYPE_OBJECT) + $footer = array( + $e['param'][0] == 1, + $e['param'][0] == 2, + ); + break; case SAI_EVENT_KILL: // 5 - On Creature Kill if ($time = $this->numRange('event', 0, true)) $footer = $time; @@ -605,7 +572,7 @@ private function event() : array $footer = $time; if ($e['param'][1]) - $e['param'][5] = Lang::getMagicSchools($e['param'][1]); + $e['param'][10] = Lang::getMagicSchools($e['param'][1]); if ($e['param'][0]) $this->jsGlobals[TYPE_SPELL][] = $e['param'][0]; @@ -621,6 +588,7 @@ private function event() : array $footer = $time; break; case SAI_EVENT_SUMMONED_UNIT: // 17 - On Creature/Gameobject Summoned Unit + case SAI_EVENT_SUMMONED_UNIT_DIES: // 82 - On Summoned Unit Dies if ($e['param'][0]) $this->jsGlobals[TYPE_NPC][] = $e['param'][0]; // do not break; @@ -633,6 +601,8 @@ private function event() : array case SAI_EVENT_REWARD_QUEST: // 20 - On Target Rewarded Quest if ($e['param'][0]) $this->jsGlobals[TYPE_QUEST][] = $e['param'][0]; + if ($time = $this->numRange('event', 1, true)) + $footer = $time; break; case SAI_EVENT_RECEIVE_EMOTE: // 22 - On Receive Emote. $this->jsGlobals[TYPE_EMOTE][] = $e['param'][0]; @@ -645,7 +615,7 @@ private function event() : array $this->jsGlobals[TYPE_NPC][] = $e['param'][1]; break; case SAI_EVENT_LINK: // 61 - Used to link together multiple events as a chain of events. - $e['param'][5] = LANG::concat(DB::World()->selectCol('SELECT CONCAT("#[b]", id, "[/b]") FROM smart_scripts WHERE link = ?d AND entryorguid = ?d AND source_type = ?d', $this->itr['id'], $this->entry, $this->srcType), false); + $e['param'][10] = LANG::concat(DB::World()->selectCol('SELECT CONCAT("#[b]", id, "[/b]") FROM smart_scripts WHERE link = ?d AND entryorguid = ?d AND source_type = ?d', $this->itr['id'], $this->entry, $this->srcType), false); break; case SAI_EVENT_GOSSIP_SELECT: // 62 - On gossip clicked (gossip_menu_option335). $gmo = DB::World()->selectRow('SELECT gmo.OptionText AS text_loc0 {, gmol.OptionText AS text_loc?d} @@ -658,7 +628,7 @@ private function event() : array ); if ($gmo) - $e['param'][5] = Util::localizedString($gmo, 'text'); + $e['param'][10] = Util::localizedString($gmo, 'text'); else trigger_error('SmartAI::event - could not find gossip menu option for event #'.$e['type']); break; @@ -668,24 +638,24 @@ private function event() : array break; case SAI_EVENT_DISTANCE_CREATURE: // 75 - On creature guid OR any instance of creature entry is within distance. if ($e['param'][0]) - $e['param'][5] = DB::World()->selectCell('SELECT id FROM creature WHERE guid = ?d', $e['param'][0]); + $e['param'][10] = DB::World()->selectCell('SELECT id FROM creature WHERE guid = ?d', $e['param'][0]); // do not break; case SAI_EVENT_DISTANCE_GAMEOBJECT: // 76 - On gameobject guid OR any instance of gameobject entry is within distance. - if ($e['param'][0] && !$e['param'][5]) - $e['param'][5] = DB::World()->selectCell('SELECT id FROM gameobject WHERE guid = ?d', $e['param'][0]); + if ($e['param'][0] && !$e['param'][10]) + $e['param'][10] = DB::World()->selectCell('SELECT id FROM gameobject WHERE guid = ?d', $e['param'][0]); else if ($e['param'][1]) - $e['param'][5] = $e['param'][1]; - else if (!$e['param'][5]) + $e['param'][10] = $e['param'][1]; + else if (!$e['param'][10]) trigger_error('SmartAI::event - entity for event #'.$e['type'].' not defined'); - if ($e['param'][5]) - $this->jsGlobals[TYPE_NPC][] = $e['param'][5]; + if ($e['param'][10]) + $this->jsGlobals[TYPE_NPC][] = $e['param'][10]; if ($e['param'][3]) $footer = Util::formatTime($e['param'][3], true); break; case SAI_EVENT_EVENT_PHASE_CHANGE: // 66 - On event phase mask set - $e['param'][5] = Lang::concat(Util::mask2bits($a['param'][0]), false); + $e['param'][10] = Lang::concat(Util::mask2bits($a['param'][0]), false); break; default: $body = '[span class=q10]Unhandled Event[/span] #'.$e['type']; @@ -714,7 +684,7 @@ private function action() : array $tooltip = '[tooltip name=a-'.$this->rowKey.']'.Lang::smartAI('actionTT', array_merge([$a['type']], $a['param'])).'[/tooltip][span tooltip=a-'.$this->rowKey.']%s[/span]'; // init additional parameters - $a['param'] = array_pad($a['param'], 10, ''); + $a['param'] = array_pad($a['param'], 15, ''); switch ($a['type']) { @@ -733,6 +703,7 @@ private function action() : array case SAI_ACTION_SET_IN_COMBAT_WITH_ZONE: // 38 -> self case SAI_ACTION_SET_INVINCIBILITY_HP_LEVEL: // 42 -> self case SAI_ACTION_SET_DATA: // 45 -> any target + case SAI_ACTION_ATTACK_STOP: // 46 -> self case SAI_ACTION_SET_VISIBILITY: // 47 -> any target case SAI_ACTION_SET_ACTIVE: // 48 -> any target case SAI_ACTION_ATTACK_START: // 49 -> any target @@ -761,7 +732,12 @@ private function action() : array case SAI_ACTION_SET_CAN_FLY: // 119 -> self case SAI_ACTION_SET_SIGHT_DIST: // 121 -> any target case SAI_ACTION_REMOVE_ALL_GAMEOBJECTS: // 126 -> any target - case SAI_ACTION_STOP_MOTION: // 127 -> any target [ye, not gonna resolve this nonsense] + case SAI_ACTION_PLAY_CINEMATIC: // 135 -> player target + break; + case SAI_ACTION_PAUSE_MOVEMENT: // 127 -> any target [ye, not gonna resolve this nonsense] + $a['param'][6] = Util::formatTime($a['param'][1], true); + if ($a['param'][2]) + $footer = true; break; // simple type as param[0] case SAI_ACTION_PLAY_EMOTE: // 5 -> any target @@ -777,6 +753,8 @@ private function action() : array $this->jsGlobals[TYPE_QUEST][] = $a['param'][0]; break; case SAI_ACTION_REMOVEAURASFROMSPELL: // 28 -> any target + if ($a['param'][2]) + $footer = true; case SAI_ACTION_ADD_AURA: // 75 -> any target if ($a['param'][0]) $this->jsGlobals[TYPE_SPELL][] = $a['param'][0]; @@ -826,19 +804,20 @@ private function action() : array break; // misc case SAI_ACTION_TALK: // 1 -> any target - if ($src = $this->getTalkSource()) + $noSrc = false; + if ($src = $this->getTalkSource($noSrc)) { if ($a['param'][6] = isset($this->quotes[$src][$a['param'][0]])) { $quotes = $this->quotes[$src][$a['param'][0]]; - foreach ($quotes as $key => $q) + foreach ($quotes as $quote) { - $_ = ($q['type'] != 4 ? $this->quotes[$src]['src'].' '.Lang::npc('textTypes', $q['type']).Lang::main('colon').($q['lang'] ? '['.$q['lang'].'] ' : null) : null).html_entity_decode($q['text']); - $a['param'][7] .= '[div][span class=s'.$q['type'].']'.sprintf($_, $this->quotes[$src]['src']).'[/span][/div]'; - + $a['param'][7] .= sprintf($quote['text'], $noSrc ? '' : sprintf($quote['prefix'], $this->quotes[$src]['src']), $this->quotes[$src]['src']); if ($a['param'][1]) $footer = [Util::formatTime($a['param'][1], true)]; } + + // todo (low): undestand what action_param2 does } } else @@ -1084,16 +1063,14 @@ private function action() : array break; case SAI_ACTION_SIMPLE_TALK: // 84 -> any target - if ($src = $this->getTalkSource()) + $noSrc = false; + if ($src = $this->getTalkSource($noSrc)) { if (isset($this->quotes[$src][$a['param'][0]])) { $quotes = $this->quotes[$src][$a['param'][0]]; - foreach ($quotes as $key => $q) - { - $_ = ($q['type'] != 4 ? $this->quotes[$src]['src'].' '.Lang::npc('textTypes', $q['type']).Lang::main('colon').($q['lang'] ? '['.$q['lang'].'] ' : null) : null).html_entity_decode($q['text']); - $a['param'][6] .= '[div][span class=s'.$q['type'].']'.sprintf($_, $this->quotes[$src]['src']).'[/span][/div]'; - } + foreach ($quotes as $quote) + $a['param'][6] .= sprintf($quote['text'], $noSrc ? '' : sprintf($quote['prefix'], $this->quotes[$src]['src']), $this->quotes[$src]['src']); } } else @@ -1103,11 +1080,12 @@ private function action() : array case SAI_ACTION_CROSS_CAST: // 86 -> entity by TargetingBlock(param3, param4, param5, param6) cross cast spell at any target $a['param'][6] = $this->target(array( 'type' => $a['param'][2], - 'param' => [$a['param'][3], $a['param'][4], $a['param'][5]], + 'param' => [$a['param'][3], $a['param'][4], $a['param'][5], 0], 'pos' => [0, 0, 0, 0] )); // do not break; - case SAI_ACTION_INVOKER_CAST: // 85 -> any target + case SAI_ACTION_SELF_CAST: // 85 -> self + case SAI_ACTION_INVOKER_CAST: // 134 -> any target $this->jsGlobals[TYPE_SPELL][] = $a['param'][0]; if ($_ = $this->castFlags('action', 1)) $footer = $_; @@ -1270,10 +1248,62 @@ private function action() : array case SAI_ACTION_TRIGGER_RANDOM_TIMED_EVENT: // 125 -> self $a['param'][6] = $this->numRange('action', 0); break; - // todo (med): i know these exist, but have no info how they operate case SAI_ACTION_SPAWN_SPAWNGROUP: // 131 case SAI_ACTION_DESPAWN_SPAWNGROUP: // 132 + $a['param'][6] = DB::World()->selectCell('SELECT `GroupName` FROM spawn_group_template WHERE `groupId` = ?d', $a['param'][0]); + $entities = DB::World()->select('SELECT `spawnType` AS "0", `spawnId` AS "1" FROM spawn_group WHERE `groupId` = ?d', $a['param'][0]); + + $n = 5; + foreach ($entities as [$spawnType, $guid]) + { + $type = TYPE_NPC; + if ($spawnType == 1) + $type == TYPE_GAMEOBJECT; + + $a['param'][7] = $this->spawnFlags('action', 3); + + if ($_ = DB::Aowow()->selectCell('SELECT `typeId` FROM ?_spawns WHERE `type` = ?d AND `guid` = ?d', $type, $guid)) + { + $this->jsGlobals[$type][] = $_; + $a['param'][8] .= '[li]['.Util::$typeStrings[$type].'='.$_.'][small class=q0] (GUID: '.$guid.')[/small][/li]'; + } + else + $a['param'][8] .= '[li]'.Lang::smartAI('entityUNK').'[small class=q0] (GUID: '.$guid.')[/small][/li]'; + + if (!--$n) + break; + } + + if (count($entities) > 5) + $a['param'][8] .= '[li]+'.(count($entities) - 5).'…[/li]'; + + $a['param'][8] = '[ul]'.$a['param'][8].'[/ul]'; + + if ($time = $this->numRange('action', 1, true)) + $footer = [$time]; + break; case SAI_ACTION_RESPAWN_BY_SPAWNID: // 133 + $type = TYPE_NPC; + if ($a['param'][0] == 1) + $type == TYPE_GAMEOBJECT; + + if ($_ = DB::Aowow()->selectCell('SELECT `typeId` FROM ?_spawns WHERE `type` = ?d AND `guid` = ?d', $type, $a['param'][1])) + $a['param'][6] = '['.Util::$typeStrings[$type].'='.$_.']'; + else + $a['param'][6] = Lang::smartAI('entityUNK'); + break; + case SAI_ACTION_SET_MOVEMENT_SPEED: // 136 + $a['param'][6] = $a['param'][1] + $a['param'][2] / pow(10, floor(log10($a['param'][2] ?: 1.0) + 1)); // i know string concatenation is a thing. don't @ me! + break; + case SAI_ACTION_OVERRIDE_LIGHT: // 138 + $this->jsGlobals[TYPE_ZONE][] = $a['param'][0]; + $footer = [Util::formatTime($a['param'][2], true)]; + break; + case SAI_ACTION_OVERRIDE_WEATHER: // 139 + $this->jsGlobals[TYPE_ZONE][] = $a['param'][0]; + if (!($a['param'][6] = Lang::smartAI('weatherStates', $a['param'][1]))) + $a['param'][6] = Lang::smartAI('weatherStateUNK', [$a['param'][1]]); + break; default: $body = Lang::smartAI('actionUNK', [$a['type']]); } diff --git a/localization/locale_dede.php b/localization/locale_dede.php index 3144ed80d..a5562e7f2 100644 --- a/localization/locale_dede.php +++ b/localization/locale_dede.php @@ -79,7 +79,7 @@ 'links' => "Links", 'compare' => "Vergleichen", 'view3D' => "3D-Ansicht", - 'findUpgrades' => "Bessere Gegenstände finden...", + 'findUpgrades' => "Bessere Gegenstände finden…", // miscTools 'errPageTitle' => "Seite nicht gefunden", @@ -431,27 +431,27 @@ 'eventUNK' => '[span class=q10]Unbenkanntes Event #[b class=q1]%d[/b] in Benutzung.[/span]', 'eventTT' => '[b class=q1]EventType %d[/b][br][table][tr][td]PhaseMask[/td][td=header]0x%04X[/td][/tr][tr][td]Chance[/td][td=header]%d%%%%[/td][/tr][tr][td]Flags[/td][td=header]0x%04X[/td][/tr][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]Param5[/td][td=header]%d[/td][/tr][/table]', 'events' => array( - SAI_EVENT_UPDATE_IC => ['(%7$d)?:Im Kampf, ;(%6$s)?Nach %6$s:Sofort;', 'Wiederhole alle %s'], - SAI_EVENT_UPDATE_OOC => ['(%7$d)?:Nicht im Kampf, ;(%6$s)?Nach %6$s:Sofort;', 'Wiederhole alle %s'], - SAI_EVENT_HEALT_PCT => ['Ab %6$s%% Gesundheit', 'Wiederhole alle %s'], - SAI_EVENT_MANA_PCT => ['Ab %6$s%% Mana', 'Wiederhole alle %s'], + SAI_EVENT_UPDATE_IC => ['(%12$d)?:Im Kampf, ;(%11$s)?Nach %11$s:Sofort;', 'Wiederhole alle %s'], + SAI_EVENT_UPDATE_OOC => ['(%12$d)?:Nicht im Kampf, ;(%11$s)?Nach %11$s:Sofort;', 'Wiederhole alle %s'], + SAI_EVENT_HEALTH_PCT => ['Ab %11$s%% Gesundheit', 'Wiederhole alle %s'], + SAI_EVENT_MANA_PCT => ['Ab %11$s%% Mana', 'Wiederhole alle %s'], SAI_EVENT_AGGRO => ['Bei Aggro', null], SAI_EVENT_KILL => ['Beim Töten von (%3$d)?einem Spieler:;(%4$d)?[npc=%4$d]:einer Kreatur;', 'Abklingzeit: %s'], SAI_EVENT_DEATH => ['Im Tod', null], SAI_EVENT_EVADE => ['Beim Entkommen', null], - SAI_EVENT_SPELLHIT => ['Von (%6$s)?%6$s-:;(%1$d)?[spell=%1$d]:Zauber; getroffen', 'Abklingzeit: %s'], - SAI_EVENT_RANGE => ['Ziel innerhalb von %6$sm', 'Wiederhole alle %s'], + SAI_EVENT_SPELLHIT => ['Von (%11$s)?%11$s-:;(%1$d)?[spell=%1$d]:Zauber; getroffen', 'Abklingzeit: %s'], + SAI_EVENT_RANGE => ['Ziel innerhalb von %11$sm', 'Wiederhole alle %s'], /* 10*/ SAI_EVENT_OOC_LOS => ['(%1$d)?Freundlicher:Feindlicher; (%5$d)?Spieler:NPC; kommt ausserhalb des Kampfes innerhalb von %2$dm ins Sichtfeld', 'Abklingzeit: %s'], SAI_EVENT_RESPAWN => ['Beim Wiedereinstieg', null], - SAI_EVENT_TARGET_HEALTH_PCT => ['Ziel hat %6$s%% Gesundheit', 'Wiederhole alle %s'], + SAI_EVENT_TARGET_HEALTH_PCT => ['Ziel hat %11$s%% Gesundheit', 'Wiederhole alle %s'], SAI_EVENT_VICTIM_CASTING => ['Aktuelles Ziel wirkt (%3$d)?[spell=%3$d]:beliebigen Zauber;', 'Wiederhole alle %s'], SAI_EVENT_FRIENDLY_HEALTH => ['Freundlicher NPC innerhalb von %2$dm hat %1$d Gesundheit', 'Wiederhole alle %s'], SAI_EVENT_FRIENDLY_IS_CC => ['Freundlicher NPC innerhalb von %1$dm ist beeinflusst von \'Crowd Control\'', 'Wiederhole alle %s'], SAI_EVENT_FRIENDLY_MISSING_BUFF => ['Freundlichem NPC innerhalb von %2$dm fehlt [spell=%1$d]', 'Wiederhole alle %s'], SAI_EVENT_SUMMONED_UNIT => ['(%1$d)?[npc=%1$d]:Beliebige Kreatur; wurde gerade beschworen', 'Abklingzeit: %s'], - SAI_EVENT_TARGET_MANA_PCT => ['Ziel hat %6$s%% Mana', 'Wiederhole alle %s'], - SAI_EVENT_ACCEPTED_QUEST => ['Gebe (%1$d)?[quest=%1$d]:beliebiges Quest;', null], -/* 20*/ SAI_EVENT_REWARD_QUEST => ['Belohne (%1$d)?[quest=%1$d]:beliebiges Quest;', null], + SAI_EVENT_TARGET_MANA_PCT => ['Ziel hat %11$s%% Mana', 'Wiederhole alle %s'], + SAI_EVENT_ACCEPTED_QUEST => ['Gebe (%1$d)?[quest=%1$d]:beliebiges Quest;', 'Abklingzeit: %s'], +/* 20*/ SAI_EVENT_REWARD_QUEST => ['Belohne (%1$d)?[quest=%1$d]:beliebiges Quest;', 'Abklingzeit: %s'], SAI_EVENT_REACHED_HOME => ['Erreiche \'Heimat\'-Koordinaten', null], SAI_EVENT_RECEIVE_EMOTE => ['Das Ziel von [emote=%1$d] seiend', 'Abklingzeit: %s'], SAI_EVENT_HAS_AURA => ['(%2$d)?Habe %2$d Aufladungen von [spell=%1$d]:Aura von [spell=%1$d] fehlt; ', 'Wiederhole alle %s'], @@ -462,9 +462,9 @@ SAI_EVENT_PASSENGER_REMOVED => ['Ein Passagier steigt ab', 'Abklingzeit: %s'], SAI_EVENT_CHARMED => ['(%1$d)?Bezaubert werden:Bezauberung läuft ab;', null], /* 30*/ SAI_EVENT_CHARMED_TARGET => ['Beim Bezaubern von #target#', null], - SAI_EVENT_SPELLHIT_TARGET => ['#target# wird von (%6$s)?%6$s :;(%1$d)?[spell=%1$d]:Zauber; getroffen', 'Abklingzeit: %s'], - SAI_EVENT_DAMAGED => ['Nehme %6$s Punkte Schaden', 'Wiederhole alle %s'], - SAI_EVENT_DAMAGED_TARGET => ['#target# nahm %6$s Punkte Schaden', 'Wiederhole alle %s'], + SAI_EVENT_SPELLHIT_TARGET => ['#target# wird von (%11$s)?%11$s :;(%1$d)?[spell=%1$d]:Zauber; getroffen', 'Abklingzeit: %s'], + SAI_EVENT_DAMAGED => ['Nehme %11$s Punkte Schaden', 'Wiederhole alle %s'], + SAI_EVENT_DAMAGED_TARGET => ['#target# nahm %11$s Punkte Schaden', 'Wiederhole alle %s'], SAI_EVENT_MOVEMENTINFORM => ['Beginne Bewegung zu Punkt #[b]%2$d[/b](%1$d)? mit MotionType #[b]%1$d[/b]:;', null], SAI_EVENT_SUMMON_DESPAWNED => ['Beschworener NPC [npc=%1$d] verschwindet', 'Abklingzeit: %s'], SAI_EVENT_CORPSE_REMOVED => ['Leiche verschwindet', null], @@ -484,20 +484,20 @@ /* 50*/ null, null, SAI_EVENT_TEXT_OVER => ['(%2$d)?[npc=%2$d]:Beliebige Kreatur; ist fertig mit der Wiedergabe von Textgruppe #[b]%1$d[/b]', null], - SAI_EVENT_RECEIVE_HEAL => ['Erhalte %6$s Punkte Heilung', 'Abklingzeit: %s'], + SAI_EVENT_RECEIVE_HEAL => ['Erhalte %11$s Punkte Heilung', 'Abklingzeit: %s'], SAI_EVENT_JUST_SUMMONED => ['Wurde gerade beschworen', null], SAI_EVENT_WAYPOINT_PAUSED => ['Pausiere Pfad(%2$d)? #[b]%2$d[/b]:; an (%1$d)?Wegpunkt #[b]%1$d[/b]:beliebigem Wegpunkt;', null], SAI_EVENT_WAYPOINT_RESUMED => ['Setze Pfad(%2$d)? #[b]%2$d[/b]:; an (%1$d)?Wegpunkt #[b]%1$d[/b]:beliebigem Wegpunkt; fort', null], SAI_EVENT_WAYPOINT_STOPPED => ['Halte Pfad(%2$d)? #[b]%2$d[/b]:; an (%1$d)?Waypoint #[b]%1$d[/b]:beliebigem Wegpunkt; an', null], SAI_EVENT_WAYPOINT_ENDED => ['Beende aktuellen Pfad(%2$d)? #[b]%2$d[/b]:; an (%1$d)?Waypoint #[b]%1$d[/b]:beliebigem Wegpunkt;', null], SAI_EVENT_TIMED_EVENT_TRIGGERED => ['Geplanted Ereignis #[b]%1$d[/b] löst aus', null], -/* 60*/ SAI_EVENT_UPDATE => ['(%6$s)?Nach %6$s:Sofort;', 'Wiederhole alle %s'], - SAI_EVENT_LINK => ['Nach Ereignis %6$s', null], - SAI_EVENT_GOSSIP_SELECT => ['Wähle Gossip:[br](%6$s)?[span class=q1]%6$s[/span]:Menü #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], +/* 60*/ SAI_EVENT_UPDATE => ['(%11$s)?Nach %11$s:Sofort;', 'Wiederhole alle %s'], + SAI_EVENT_LINK => ['Nach Ereignis %11$s', null], + SAI_EVENT_GOSSIP_SELECT => ['Wähle Gossip:[br](%11$s)?[span class=q1]%11$s[/span]:Menü #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], SAI_EVENT_JUST_CREATED => ['Beim ersten Erscheinen in der Welt', null], - SAI_EVENT_GOSSIP_HELLO => ['Öffne Gossip', null], + SAI_EVENT_GOSSIP_HELLO => ['Öffne Gossip', '(%1$d)?onGossipHello:;(%2$d)?onReportUse:;'], SAI_EVENT_FOLLOW_COMPLETED => ['Ist fertig mit folgen', null], - SAI_EVENT_EVENT_PHASE_CHANGE => ['Ereignisphase wurde geändert und passt auf %6$s', null], + SAI_EVENT_EVENT_PHASE_CHANGE => ['Ereignisphase wurde geändert und passt auf %11$s', null], SAI_EVENT_IS_BEHIND_TARGET => ['Stehe hinter #target#', 'Abklingzeit: %s'], SAI_EVENT_GAME_EVENT_START => ['[event=%1$d] beginnt', null], SAI_EVENT_GAME_EVENT_END => ['[event=%1$d] endet', null], @@ -505,9 +505,9 @@ SAI_EVENT_GO_EVENT_INFORM => ['Taxi-Pfad Ereignis #[b]%1$d[/b] wurde ausgelöst', null], SAI_EVENT_ACTION_DONE => ['Script-Aktion #[b]%1$d[/b] ausgeführt', null], SAI_EVENT_ON_SPELLCLICK => ['Zauber-Klick wurde ausgelöst', null], - SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Gesundheit von #target# ist %6$s%%', 'Wiederhole alle %s'], - SAI_EVENT_DISTANCE_CREATURE => ['[npc=%6$d](%1$d)? mit GUID #%1$d:; nähert sich auf %2$dm', 'Wiederhole alle %s'], - SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%6$d](%1$d)? mit GUID #%1$d:; nähert sich auf %2$dm', 'Wiederhole alle %s'], + SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Gesundheit von #target# ist %11$s%%', 'Wiederhole alle %s'], + SAI_EVENT_DISTANCE_CREATURE => ['[npc=%11$d](%1$d)? mit GUID #%1$d:; nähert sich auf %2$dm', 'Wiederhole alle %s'], + SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%11$d](%1$d)? mit GUID #%1$d:; nähert sich auf %2$dm', 'Wiederhole alle %s'], SAI_EVENT_COUNTER_SET => ['Zähler #[b]%1$d[/b] ist gleich [b]%2$d[/b]', null], ), 'eventFlags' => array( @@ -545,18 +545,18 @@ SAI_ACTION_ALLOW_COMBAT_MOVEMENT => ['(%1$d)?Erlaube:Verbiete; Bewegung im Kampf.', null], SAI_ACTION_SET_EVENT_PHASE => ['Setze Ereignisphase von #target# auf [b]%1$d[/b].', null], SAI_ACTION_INC_EVENT_PHASE => ['(%1$d)?Inkrementiere:Dekrementiere; Ereignisphase von #target#.', null], - SAI_ACTION_EVADE => ['#target# entkommt.', null], + SAI_ACTION_EVADE => ['#target# entkommt (%1$d)?zu letzten gespeicherten Position:zum Respawnpunkt;.', null], SAI_ACTION_FLEE_FOR_ASSIST => ['Fliehe nach Hilfe.', 'Benutze Standard Flucht-Emote'], SAI_ACTION_CALL_GROUPEVENTHAPPENS => ['Erfülle Ziel von [quest=%1$d] für #target#.', null], SAI_ACTION_COMBAT_STOP => ['Beende aktuellen Kampf.', null], - SAI_ACTION_REMOVEAURASFROMSPELL => ['Entferne (%1$d)?alle Auren:Aura [spell=%1$d]; von #target#.', null], + SAI_ACTION_REMOVEAURASFROMSPELL => ['Entferne (%1$d)?alle Auren:Aura [spell=%1$d]; von #target#.', 'Nur eigene Auren'], SAI_ACTION_FOLLOW => ['Folge #target#(%1$d)? mit %1$dm Abstand:;(%3$d)? bis zum Erreichen von [npc=%3$d]:;.', '(%7$d)?Winkel: %7$.2f°:;(%8$d)? Eine Form von Questziel wird erfüllt:;'], /* 30*/ SAI_ACTION_RANDOM_PHASE => ['Wähle zufällige Ereignisphase aus %7$s.', null], SAI_ACTION_RANDOM_PHASE_RANGE => ['Wähle zufällige Ereignisphase zwischen %1$d und %2$d.', null], SAI_ACTION_RESET_GOBJECT => ['Setze #target# zurück.', null], SAI_ACTION_CALL_KILLEDMONSTER => ['Ein Tod von [npc=%1$d] wird #target# zugeschrieben.', null], SAI_ACTION_SET_INST_DATA => ['Setze Instanz (%3$d)?Boss State:Datenfeld; #[b]%1$d[/b] auf [b]%2$d[/b].', null], - null, + null, // SMART_ACTION_SET_INST_DATA64 = 35 SAI_ACTION_UPDATE_TEMPLATE => ['Transformiere zu [npc=%1$d](%2$d)? mit Stufe [b]%2$d[/b]:;.', null], SAI_ACTION_DIE => ['Stirb!', null], SAI_ACTION_SET_IN_COMBAT_WITH_ZONE => ['Beginne Kampf mit allen Einheiten in der Zone.', null], @@ -567,7 +567,7 @@ SAI_ACTION_MOUNT_TO_ENTRY_OR_MODEL => ['Sitze (%7$d)?auf:ab; (%1$d)?[npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], SAI_ACTION_SET_INGAME_PHASE_MASK => ['Setze Sichtbarkeit von #target# auf Phase %7$s.', null], SAI_ACTION_SET_DATA => ['[b]%2$d[/b] wird in Datenfeld #[b]%1$d[/b] von #target# abgelegt.', null], - null, + SAI_ACTION_ATTACK_STOP => ['Beende Angriff.', null], SAI_ACTION_SET_VISIBILITY => ['#target# wird (%1$d)?sichtbar:unsichtbar;.', null], SAI_ACTION_SET_ACTIVE => ['#target# kann(%1$d)?: keine; Grids aktivieren.', null], SAI_ACTION_ATTACK_START => ['Greife #target# an.', null], @@ -606,7 +606,7 @@ SAI_ACTION_ADD_NPC_FLAG => ['Füge NpcFlags %7$s #target# hinzu.', null], SAI_ACTION_REMOVE_NPC_FLAG => ['Entferne NpcFlags %7$s von #target#.', null], SAI_ACTION_SIMPLE_TALK => ['#target# gibt (%7$s)?TextGroup:[span class=q10]unbekannten Text[/span]; #[b]%1$d[/b] für #target# wieder%7$s', null], - SAI_ACTION_INVOKER_CAST => ['Auslöser wirkt [spell=%1$d] auf #target#.', null], + SAI_ACTION_SELF_CAST => ['Selbst wirkt [spell=%1$d] auf #target#.', null], SAI_ACTION_CROSS_CAST => ['%7$s wirkt [spell=%1$d] auf #target#.', null], SAI_ACTION_CALL_RANDOM_TIMED_ACTIONLIST => ['Rufe zufällige Timed Actionlist auf: [html]%7$s[/html]', null], SAI_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST => ['Rufe zufällige Timed Actionlist aus Zahlenbreich auf: [html]%7$s[/html]', null], @@ -649,6 +649,19 @@ SAI_ACTION_TRIGGER_RANDOM_TIMED_EVENT => ['Löse definiertes verzögertes Ereignis innerhalb von %7$s aus.', null], SAI_ACTION_REMOVE_ALL_GAMEOBJECTS => ['Entferne alle Gameobjects von #target#.', null], SAI_ACTION_STOP_MOTION => ['(%1$d)?Entferne motion type #[b]%1$d[/b] von #target#. :;(%2$d)?Beende Bewegung.:;', null], + SAI_ACTION_PAUSE_MOVEMENT => ['Pausiere Bewegung aus Slot #[b]%1$d[/b] für %7$s.', 'Erzwungen'], + null, // SAI_ACTION_PLAY_ANIMKIT = 128, // don't use on 3.3.5a + null, // SAI_ACTION_SCENE_PLAY = 129, // don't use on 3.3.5a +/*130*/ null, // SAI_ACTION_SCENE_CANCEL = 130, // don't use on 3.3.5a + SAI_ACTION_SPAWN_SPAWNGROUP => ['Spawne SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Abklingzeit: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_DESPAWN_SPAWNGROUP => ['Despawne SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Abklingzeit: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_RESPAWN_BY_SPAWNID => ['Respawne %7$s [small class=q0](GUID: %2$d)[/small]', null], // spawnType, spawnId + SAI_ACTION_INVOKER_CAST => ['Auslöser wirkt [spell=%1$d] auf #target#.', null], // spellID, castFlags + SAI_ACTION_PLAY_CINEMATIC => ['Gebe Film #[b]%1$d[/b] für #target# wieder.', null], // cinematic + SAI_ACTION_SET_MOVEMENT_SPEED => ['Setze Geschwindigkeit von MotionType #[b]%1$d[/b] auf [b]%7$.2f[/b]', null], // movementType, speedInteger, speedFraction + null, // SAI_ACTION_PLAY_SPELL_VISUAL_KIT', // spellVisualKitId (RESERVED, PENDING CHERRYPICK) + SAI_ACTION_OVERRIDE_LIGHT => ['Ändere Skybox in [zone=%1$d] auf #[b]%2$d[/b].', 'Übergang: %s'], // zoneId, overrideLightID, transitionMilliseconds + SAI_ACTION_OVERRIDE_WEATHER => ['Ändere Wetter in [zone=%1$d] zu %7$s mit %3$d%% Stärke.', null] // zoneId, weatherId, intensity ), 'targetUNK' => '[span class=q10]unbekanntes Ziel#[b class=q1]%d[/b][/span]', 'targetTT' => '[b class=q1]TargetType %d[/b][br][table][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]X[/td][td=header]%.2f[/td][/tr][tr][td]Y[/td][td=header]%.2f[/td][/tr][tr][td]Z[/td][td=header]%.2f[/td][/tr][tr][td]O[/td][td=header]%.2f[/td][/tr][/table]', @@ -662,18 +675,18 @@ SAI_TARGET_HOSTILE_RANDOM_NOT_TOP => 'zufälliges nicht-Tank Ziel', SAI_TARGET_ACTION_INVOKER => 'Auslöser', SAI_TARGET_POSITION => 'Weltkoordinaten', - SAI_TARGET_CREATURE_RANGE => '(%1$d)?zufällige Instanz von [npc=%1$d]:beliebige Kreatur; innerhalb von %4$sm', -/*10*/ SAI_TARGET_CREATURE_GUID => '(%4$d)?[npc=%4$d]:NPC; mit GUID #%1$d', - SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?zufällige Instanz von [npc=%1$d]:beliebige Kreatur; innerhalb von %4$sm', + SAI_TARGET_CREATURE_RANGE => '(%1$d)?zufällige Instanz von [npc=%1$d]:beliebige Kreatur; innerhalb von %11$sm(%4$d)? (max. %4$d Ziele):;', +/*10*/ SAI_TARGET_CREATURE_GUID => '(%11$d)?[npc=%11$d]:NPC; mit GUID #%1$d', + SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?zufällige Instanz von [npc=%1$d]:beliebige Kreatur; innerhalb von %11$sm(%3$d)? (max. %3$d Ziele):;', SAI_TARGET_STORED => 'vorher gespeichertes Ziel', - SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?zufällige Instanz von [object=%1$d]:beliebiges Objekt; innerhalb von %4$sm', - SAI_TARGET_GAMEOBJECT_GUID => '(%4$d)?[object=%4$d]:Gameobject; mit GUID #%1$d', - SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?zufällige Instanz von [object=%1$d]:beliebiges Objekt; innerhalb von %4$sm', + SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?zufällige Instanz von [object=%1$d]:beliebiges Objekt; innerhalb von %11$sm(%4$d)? (max. %4$d Ziele):;', + SAI_TARGET_GAMEOBJECT_GUID => '(%11$d)?[object=%11$d]:Gameobject; mit GUID #%1$d', + SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?zufällige Instanz von [object=%1$d]:beliebiges Objekt; innerhalb von %11$sm(%3$d)? (max. %3$d Ziele):;', SAI_TARGET_INVOKER_PARTY => 'Gruppe des Auslösenden', - SAI_TARGET_PLAYER_RANGE => 'zufälliger Spieler innerhalb von %4$sm', - SAI_TARGET_PLAYER_DISTANCE => 'zufälliger Spieler innerhalb von %4$sm', - SAI_TARGET_CLOSEST_CREATURE => 'nächste (%3$d)?tote:lebendige; (%1$d)?[npc=%1$d]:beliebige Kreatur; innerhalb von %4$sm', -/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'nächstes (%1$d)?[object=%1$d]:beliebiges Gameobject; innerhalb von %4$sm', + SAI_TARGET_PLAYER_RANGE => 'zufälliger Spieler innerhalb von %11$sm', + SAI_TARGET_PLAYER_DISTANCE => 'zufälliger Spieler innerhalb von %11$sm', + SAI_TARGET_CLOSEST_CREATURE => 'nächste (%3$d)?tote:lebendige; (%1$d)?[npc=%1$d]:beliebige Kreatur; innerhalb von %11$sm', +/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'nächstes (%1$d)?[object=%1$d]:beliebiges Gameobject; innerhalb von %11$sm', SAI_TARGET_CLOSEST_PLAYER => 'nächster Spieler innerhalb von %1$dm', SAI_TARGET_ACTION_INVOKER_VEHICLE => 'Fahrzeug des Auslösenden', SAI_TARGET_OWNER_OR_SUMMONER => 'Besitzer oder Beschwörer des Auslösenden', @@ -682,14 +695,20 @@ SAI_TARGET_CLOSEST_FRIENDLY => 'nächster (%2$d)?freundlicher Spieler:freundliche Kreatur; innerhalb von %1$dm', SAI_TARGET_LOOT_RECIPIENTS => 'alle Spieler mit Lootberechtigung', SAI_TARGET_FARTHEST => 'am weitesten (%2$d)?entferter, kämpfender Spieler:entferte, kämpfende Kreatur; innerhalb von %1$dm(%3$d)? und im Sichtfeld:;', - SAI_TARGET_VEHICLE_ACCESSORY => 'Zusatz im Sitz %1$d des Fahrzeug des Auslösenden' - ), + SAI_TARGET_VEHICLE_PASSENGER => 'Zusatz in (%1$d)?Sitz %11$s:allen Sitzen; des Fahrzeug des Auslösenden', +/*30*/ SAI_TARGET_CLOSEST_UNSPAWNED_GO => '(%1$d)?zufällige, ungespawnte Instanz von [object=%1$d]:beliebiges, ungespawntes Objekt; innerhalb von %11$sm(%3$d)' + ), 'castFlags' => array( SAI_CAST_FLAG_INTERRUPT_PREV => 'Unterbreche aktives wirken', SAI_CAST_FLAG_TRIGGERED => 'Ausgelöst', SAI_CAST_FLAG_AURA_MISSING => 'Aura fehlt', SAI_CAST_FLAG_COMBAT_MOVE => 'Bewegung im Kampf' ), + 'spawnFlags' => array( + SAI_SPAWN_FLAG_IGNORE_RESPAWN => 'Überschreibe und resette Respawnzeit', + SAI_SPAWN_FLAG_FORCE_SPAWN => 'Erzwinge spawn, wenn bereits gespawnt', + SAI_SPAWN_FLAG_NOSAVE_RESPAWN => 'Lösche Respawnzeit bei Despawn' + ), 'GOStates' => ['aktiv', 'bereit', 'alternativ aktiv'], 'summonTypes' => [null, 'Despawn nach Zeit oder wenn Leiche verschwindet', 'Despawn nach Zeit oder beim Sterben', 'Despawn nach Zeit', 'Despawn nach Zeit ausserhalb des Kampfes', 'Despawn beim Sterben', 'Despawn nach Zeit nach dem Tod', 'Despawn wenn Leiche verschwindet', 'Manueller despawn'], 'aiTpl' => ['einfache KI', 'Zauberer', 'Geschütz', 'passive Kreatur', 'Käfig für Kreatur', 'Kreatur im Käfig'], @@ -697,14 +716,17 @@ 'sheaths' => ['alle', 'Nahkampf', 'Fernkampf'], 'saiUpdate' => ['ausserhalb des Kampfes', 'im Kampf', 'immer'], 'lootStates' => ['Nicht bereit', 'Bereit', 'Aktiviert', 'Gerade deaktiviert'], + 'weatherStates' => ['Schön', 'Nebel', 'Niesel', 'leichter Regen', 'Regen', 'starker Rain', 'leichter Schneefall', 'Schneefall', 'starker Schneefall', 22 => 'leichter Sandsturm', 41=> 'Sandsturm', 42 => 'starker Sandsturm', 86 => 'Gewitter', 90 => 'schwarzer Regen', 106 => 'schwarzer Schneefall'], + + 'GOStateUNK' => '[span class=q10]unbekannter Gameobject-Status #[b class=q1]%d[/b][/span]', + 'summonTypeUNK' => '[span class=q10]unbekannter SummonType #[b class=q1]%d[/b][/span]', + 'aiTplUNK' => '[span class=q10]unbekanntes AI-Template #[b class=q1]%d[/b][/span]', + 'reactStateUNK' => '[span class=q10]unbekannter ReactState #[b class=q1]%d[/b][/span]', + 'sheathUNK' => '[span class=q10]unbekannter sheath #[b class=q1]%d[/b][/span]', + 'saiUpdateUNK' => '[span class=q10]unbekannte Updatebedingung #[b class=q1]%d[/b][/span]', + 'lootStateUNK' => '[span class=q10]unbekannter Plündern-Status #[b class=q1]%d[/b][/span]', + 'weatherStateUNK' => '[span class=q10]unbekannter Wetter-Zustand #[b class=q1]%d[/b][/span]', - 'GOStateUNK' => '[span class=q10]unbekannter Gameobject-Status #[b class=q1]%d[/b][/span]', - 'summonTypeUNK' => '[span class=q10]unbekannter SummonType #[b class=q1]%d[/b][/span]', - 'aiTplUNK' => '[span class=q10]unbekanntes AI-Template #[b class=q1]%d[/b][/span]', - 'reactStateUNK' => '[span class=q10]unbekannter ReactState #[b class=q1]%d[/b][/span]', - 'sheathUNK' => '[span class=q10]unbekannter sheath #[b class=q1]%d[/b][/span]', - 'saiUpdateUNK' => '[span class=q10]unbekannte Updatebedingung #[b class=q1]%d[/b][/span]', - 'lootStateUNK' => '[span class=q10]unbekannter Plündern-Status #[b class=q1]%d[/b][/span]', 'empty' => '[span class=q0][/span]' ), diff --git a/localization/locale_enus.php b/localization/locale_enus.php index 7c791639d..1f91ba897 100644 --- a/localization/locale_enus.php +++ b/localization/locale_enus.php @@ -79,7 +79,7 @@ 'links' => "Links", 'compare' => "Compare", 'view3D' => "View in 3D", - 'findUpgrades' => "Find upgrades...", + 'findUpgrades' => "Find upgrades…", // misc Tools 'errPageTitle' => "Page not found", @@ -431,27 +431,27 @@ 'eventUNK' => '[span class=q10]Unknwon event #[b class=q1]%d[/b] in use.[/span]', 'eventTT' => '[b class=q1]EventType %d[/b][br][table][tr][td]PhaseMask[/td][td=header]0x%04X[/td][/tr][tr][td]Chance[/td][td=header]%d%%%%[/td][/tr][tr][td]Flags[/td][td=header]0x%04X[/td][/tr][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]Param5[/td][td=header]%d[/td][/tr][/table]', 'events' => array( - SAI_EVENT_UPDATE_IC => ['(%7$d)?:When in combat, ;(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_UPDATE_OOC => ['(%7$d)?:When out of combat, ;(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_HEALT_PCT => ['At %6$s%% Health', 'Repeat every %s'], - SAI_EVENT_MANA_PCT => ['At %6$s%% Mana', 'Repeat every %s'], + SAI_EVENT_UPDATE_IC => ['(%12$d)?:When in combat, ;(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_UPDATE_OOC => ['(%12$d)?:When out of combat, ;(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_HEALTH_PCT => ['At %11$s%% Health', 'Repeat every %s'], + SAI_EVENT_MANA_PCT => ['At %11$s%% Mana', 'Repeat every %s'], SAI_EVENT_AGGRO => ['On Aggro', null], SAI_EVENT_KILL => ['On killing (%3$d)?player:;(%4$d)?[npc=%4$d]:any creature;', 'Cooldown: %s'], SAI_EVENT_DEATH => ['On death', null], SAI_EVENT_EVADE => ['When evading', null], - SAI_EVENT_SPELLHIT => ['When hit by (%6$s)?%6$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], - SAI_EVENT_RANGE => ['On target at %6$sm', 'Repeat every %s'], + SAI_EVENT_SPELLHIT => ['When hit by (%11$s)?%11$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], + SAI_EVENT_RANGE => ['On target at %11$sm', 'Repeat every %s'], /* 10*/ SAI_EVENT_OOC_LOS => ['While out of combat, (%1$d)?friendly:hostile; (%5$d)?player:unit; enters line of sight within %2$dm', 'Cooldown: %s'], SAI_EVENT_RESPAWN => ['On respawn', null], - SAI_EVENT_TARGET_HEALTH_PCT => ['On target at %6$s%% health', 'Repeat every %s'], + SAI_EVENT_TARGET_HEALTH_PCT => ['On target at %11$s%% health', 'Repeat every %s'], SAI_EVENT_VICTIM_CASTING => ['Current target is casting (%3$d)?[spell=%3$d]:any spell;', 'Repeat every %s'], SAI_EVENT_FRIENDLY_HEALTH => ['Friendly NPC within %2$dm is at %1$d health', 'Repeat every %s'], SAI_EVENT_FRIENDLY_IS_CC => ['Friendly NPC within %1$dm is crowd controlled', 'Repeat every %s'], SAI_EVENT_FRIENDLY_MISSING_BUFF => ['Friendly NPC within %2$dm is missing [spell=%1$d]', 'Repeat every %s'], SAI_EVENT_SUMMONED_UNIT => ['Just summoned (%1$d)?[npc=%1$d]:any creature;', 'Cooldown: %s'], - SAI_EVENT_TARGET_MANA_PCT => ['On target at %6$s%% mana', 'Repeat every %s'], - SAI_EVENT_ACCEPTED_QUEST => ['Giving (%1$d)?[quest=%1$d]:any quest;', null], -/* 20*/ SAI_EVENT_REWARD_QUEST => ['Rewarding (%1$d)?[quest=%1$d]:any quest;', null], + SAI_EVENT_TARGET_MANA_PCT => ['On target at %11$s%% mana', 'Repeat every %s'], + SAI_EVENT_ACCEPTED_QUEST => ['Giving (%1$d)?[quest=%1$d]:any quest;', 'Cooldown: %s'], +/* 20*/ SAI_EVENT_REWARD_QUEST => ['Rewarding (%1$d)?[quest=%1$d]:any quest;', 'Cooldown: %s'], SAI_EVENT_REACHED_HOME => ['Arriving at home coordinates', null], SAI_EVENT_RECEIVE_EMOTE => ['Being targeted with [emote=%1$d]', 'Cooldown: %s'], SAI_EVENT_HAS_AURA => ['(%2$d)?Having %2$d stacks of:Missing aura; [spell=%1$d]', 'Repeat every %s'], @@ -462,9 +462,9 @@ SAI_EVENT_PASSENGER_REMOVED => ['A passenger got off', 'Cooldown: %s'], SAI_EVENT_CHARMED => ['(%1$d)?On being charmed:On charm wearing off;', null], /* 30*/ SAI_EVENT_CHARMED_TARGET => ['When charming #target#', null], - SAI_EVENT_SPELLHIT_TARGET => ['When #target# gets hit by (%6$s)?%6$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], - SAI_EVENT_DAMAGED => ['After taking %6$s points of damage', 'Repeat every %s'], - SAI_EVENT_DAMAGED_TARGET => ['After #target# took %6$s points of damage', 'Repeat every %s'], + SAI_EVENT_SPELLHIT_TARGET => ['When #target# gets hit by (%11$s)?%11$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], + SAI_EVENT_DAMAGED => ['After taking %11$s points of damage', 'Repeat every %s'], + SAI_EVENT_DAMAGED_TARGET => ['After #target# took %11$s points of damage', 'Repeat every %s'], SAI_EVENT_MOVEMENTINFORM => ['Started moving to point #[b]%2$d[/b](%1$d)? using MotionType #[b]%1$d[/b]:;', null], SAI_EVENT_SUMMON_DESPAWNED => ['Summoned [npc=%1$d] despawned', 'Cooldown: %s'], SAI_EVENT_CORPSE_REMOVED => ['On corpse despawn', null], @@ -484,20 +484,20 @@ /* 50*/ null, null, SAI_EVENT_TEXT_OVER => ['(%2$d)?[npc=%2$d]:any creature; is done talking TextGroup #[b]%1$d[/b]', null], - SAI_EVENT_RECEIVE_HEAL => ['Received %6$s points of healing', 'Cooldown: %s'], + SAI_EVENT_RECEIVE_HEAL => ['Received %11$s points of healing', 'Cooldown: %s'], SAI_EVENT_JUST_SUMMONED => ['On being summoned', null], SAI_EVENT_WAYPOINT_PAUSED => ['Pausing path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_RESUMED => ['Resuming path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_STOPPED => ['Stopping path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_ENDED => ['Ending current path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_TIMED_EVENT_TRIGGERED => ['Timed event #[b]%1$d[/b] is triggered', null], -/* 60*/ SAI_EVENT_UPDATE => ['(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_LINK => ['After Event %6$s', null], - SAI_EVENT_GOSSIP_SELECT => ['Selecting Gossip Option:[br](%6$s)?[span class=q1]%6$s[/span]:Menu #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], +/* 60*/ SAI_EVENT_UPDATE => ['(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_LINK => ['After Event %11$s', null], + SAI_EVENT_GOSSIP_SELECT => ['Selecting Gossip Option:[br](%11$s)?[span class=q1]%11$s[/span]:Menu #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], SAI_EVENT_JUST_CREATED => ['On being spawned for the first time', null], - SAI_EVENT_GOSSIP_HELLO => ['Opening Gossip', null], + SAI_EVENT_GOSSIP_HELLO => ['Opening Gossip', '(%1$d)?onGossipHello:;(%2$d)?onReportUse:;'], SAI_EVENT_FOLLOW_COMPLETED => ['Finished following', null], - SAI_EVENT_EVENT_PHASE_CHANGE => ['Event Phase changed and matches %6$s', null], + SAI_EVENT_EVENT_PHASE_CHANGE => ['Event Phase changed and matches %11$s', null], SAI_EVENT_IS_BEHIND_TARGET => ['Facing the backside of #target#', 'Cooldown: %s'], SAI_EVENT_GAME_EVENT_START => ['[event=%1$d] started', null], SAI_EVENT_GAME_EVENT_END => ['[event=%1$d] ended', null], @@ -505,9 +505,9 @@ SAI_EVENT_GO_EVENT_INFORM => ['Taxi path event #[b]%1$d[/b] trigered', null], SAI_EVENT_ACTION_DONE => ['Executed action #[b]%1$d[/b] requested by script', null], SAI_EVENT_ON_SPELLCLICK => ['Spellclick triggered', null], - SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Health of #target# is at %6$s%%', 'Repeat every %s'], - SAI_EVENT_DISTANCE_CREATURE => ['[npc=%6$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], - SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%6$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], + SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Health of #target# is at %12$s%%', 'Repeat every %s'], + SAI_EVENT_DISTANCE_CREATURE => ['[npc=%11$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], + SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%11$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], SAI_EVENT_COUNTER_SET => ['Counter #[b]%1$d[/b] is equal to [b]%2$d[/b]', null], ), 'eventFlags' => array( @@ -525,7 +525,7 @@ null, SAI_ACTION_TALK => ['(%3$d)?Say:#target# says; (%7$d)?TextGroup:[span class=q10]unknown text[/span]; #[b]%1$d[/b] to #target#%8$s', 'Duration: %s'], SAI_ACTION_SET_FACTION => ['(%1$d)?Set faction of #target# to [faction=%7$d]:Reset faction of #target#;.', null], - SAI_ACTION_MORPH_TO_ENTRY_OR_MODEL => ['(%7$d)?Reset apperance.:Take the appearance of;(%1$d)?[npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], + SAI_ACTION_MORPH_TO_ENTRY_OR_MODEL => ['(%7$d)?Reset apperance.:Take the appearance of;(%1$d)? [npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], SAI_ACTION_SOUND => ['Play sound(%2$d)? to invoking player:;:[div float=right width=270px][sound=%1$d][/div]', 'Played by environment.'], SAI_ACTION_PLAY_EMOTE => ['Emote [emote=%1$d] to #target#.', null], SAI_ACTION_FAIL_QUEST => ['Fail [quest=%1$d] for #target#.', null], @@ -545,20 +545,20 @@ SAI_ACTION_ALLOW_COMBAT_MOVEMENT => ['(%1$d)?Enable:Disable; combat movement.', null], SAI_ACTION_SET_EVENT_PHASE => ['Set Event Phase of #target# to [b]%1$d[/b].', null], SAI_ACTION_INC_EVENT_PHASE => ['(%1$d)?Increment:Decrement; Event Phase of #target#.', null], - SAI_ACTION_EVADE => ['#target# enters Evade Mode.', null], + SAI_ACTION_EVADE => ['#target# evades to (%1$d)?last stored:respawn; position.', null], SAI_ACTION_FLEE_FOR_ASSIST => ['Flee for assistance.', 'Use default flee emote'], SAI_ACTION_CALL_GROUPEVENTHAPPENS => ['Satisfy objective of [quest=%1$d] for #target#.', null], SAI_ACTION_COMBAT_STOP => ['End current combat.', null], - SAI_ACTION_REMOVEAURASFROMSPELL => ['Remove (%1$d)?all auras:auras of [spell=%1$d]; from #target#.', null], + SAI_ACTION_REMOVEAURASFROMSPELL => ['Remove (%1$d)?all auras:auras of [spell=%1$d]; from #target#.', 'Only own auras'], SAI_ACTION_FOLLOW => ['Follow #target#(%1$d)? at %1$dm distance:;(%3$d)? until reaching [npc=%3$d]:;.', '(%7$d)?Angle: %7$.2f°:;(%8$d)? Some form of Quest Credit is given:;'], /* 30*/ SAI_ACTION_RANDOM_PHASE => ['Pick random Event Phase from %7$s.', null], SAI_ACTION_RANDOM_PHASE_RANGE => ['Pick random Event Phase between %1$d and %2$d.', null], SAI_ACTION_RESET_GOBJECT => ['Reset #target#.', null], SAI_ACTION_CALL_KILLEDMONSTER => ['A kill of [npc=%1$d] is credited to #target#.', null], SAI_ACTION_SET_INST_DATA => ['Set Instance (%3$d)?Boss State:Data Field; #[b]%1$d[/b] to [b]%2$d[/b].', null], - null, + null, // SMART_ACTION_SET_INST_DATA64 = 35 SAI_ACTION_UPDATE_TEMPLATE => ['Transform to become [npc=%1$d](%2$d)? with level [b]%2$d[/b]:;.', null], - SAI_ACTION_DIE => ['Die...   painfully.', null], + SAI_ACTION_DIE => ['Die…   painfully.', null], SAI_ACTION_SET_IN_COMBAT_WITH_ZONE => ['Set in combat with units in zone.', null], SAI_ACTION_CALL_FOR_HELP => ['Call for help.', 'Use default help emote'], /* 40*/ SAI_ACTION_SET_SHEATH => ['Sheath %7$s weapons.', null], @@ -567,7 +567,7 @@ SAI_ACTION_MOUNT_TO_ENTRY_OR_MODEL => ['(%7$d)?Dismount.:Mount ;(%1$d)?[npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], SAI_ACTION_SET_INGAME_PHASE_MASK => ['Set visibility of #target# to phase %7$s.', null], SAI_ACTION_SET_DATA => ['[b]%2$d[/b] is stored in data field #[b]%1$d[/b] of #target#.', null], - null, + SAI_ACTION_ATTACK_STOP => ['Stop attacking.', null], SAI_ACTION_SET_VISIBILITY => ['#target# becomes (%1$d)?visible:invisible;.', null], SAI_ACTION_SET_ACTIVE => ['#target# becomes Grid (%1$d)?active:inactive;.', null], SAI_ACTION_ATTACK_START => ['Start attacking #target#.', null], @@ -606,7 +606,7 @@ SAI_ACTION_ADD_NPC_FLAG => ['Add %7$s npc flags to #target#.', null], SAI_ACTION_REMOVE_NPC_FLAG => ['Remove %7$s npc flags from #target#.', null], SAI_ACTION_SIMPLE_TALK => ['#target# says (%7$s)?TextGroup:[span class=q10]unknown text[/span]; #[b]%1$d[/b] to #target#%7$s', null], - SAI_ACTION_INVOKER_CAST => ['Invoker casts [spell=%1$d] at #target#.', null], + SAI_ACTION_SELF_CAST => ['Self casts [spell=%1$d] at #target#.', null], SAI_ACTION_CROSS_CAST => ['%7$s casts [spell=%1$d] at #target#.', null], SAI_ACTION_CALL_RANDOM_TIMED_ACTIONLIST => ['Call Timed Actionlist at random: [html]%7$s[/html]', null], SAI_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST => ['Call Timed Actionlist at random from range: [html]%7$s[/html]', null], @@ -648,7 +648,19 @@ SAI_ACTION_LOAD_EQUIPMENT => ['(%2$d)?Unequip non-standard items:Equip %7$s; from equipment template #[b]%1$d[/b] on #target#.', 'Note: creature items do not necessarily have an item template'], SAI_ACTION_TRIGGER_RANDOM_TIMED_EVENT => ['Trigger previously defined timed event in id range %7$s.', null], SAI_ACTION_REMOVE_ALL_GAMEOBJECTS => ['Remove all gameobjects owned by #target#.', null], - SAI_ACTION_STOP_MOTION => ['(%1$d)?Remove motion type #[b]%1$d[/b] from #target#. :;(%2$d)?Stop moving.:;', null], + SAI_ACTION_PAUSE_MOVEMENT => ['Pause movement from slot #[b]%1$d[/b] for %7$s.', 'Forced'], + null, // SAI_ACTION_PLAY_ANIMKIT = 128, // don't use on 3.3.5a + null, // SAI_ACTION_SCENE_PLAY = 129, // don't use on 3.3.5a +/*130*/ null, // SAI_ACTION_SCENE_CANCEL = 130, // don't use on 3.3.5a + SAI_ACTION_SPAWN_SPAWNGROUP => ['Spawn SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Cooldown: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_DESPAWN_SPAWNGROUP => ['Despawn SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Cooldown: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_RESPAWN_BY_SPAWNID => ['Respawn %7$s [small class=q0](GUID: %2$d)[/small]', null], // spawnType, spawnId + SAI_ACTION_INVOKER_CAST => ['Invoker casts [spell=%1$d] at #target#.', null], // spellID, castFlags + SAI_ACTION_PLAY_CINEMATIC => ['Play cinematic #[b]%1$d[/b] for #target#', null], // cinematic + SAI_ACTION_SET_MOVEMENT_SPEED => ['Set speed of MotionType #[b]%1$d[/b] to [b]%7$.2f[/b]', null], // movementType, speedInteger, speedFraction + null, // SAI_ACTION_PLAY_SPELL_VISUAL_KIT', // spellVisualKitId (RESERVED, PENDING CHERRYPICK) + SAI_ACTION_OVERRIDE_LIGHT => ['Change skybox in [zone=%1$d] to #[b]%2$d[/b].', 'Transition: %s'], // zoneId, overrideLightID, transitionMilliseconds + SAI_ACTION_OVERRIDE_WEATHER => ['Change weather in [zone=%1$d] to %7$s at %3$d%% intensity.', null], // zoneId, weatherId, intensity ), 'targetUNK' => '[span class=q10]unknown target #[b class=q1]%d[/b][/span]', 'targetTT' => '[b class=q1]TargetType %d[/b][br][table][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]X[/td][td=header]%.2f[/td][/tr][tr][td]Y[/td][td=header]%.2f[/td][/tr][tr][td]Z[/td][td=header]%.2f[/td][/tr][tr][td]O[/td][td=header]%.2f[/td][/tr][/table]', @@ -662,18 +674,18 @@ SAI_TARGET_HOSTILE_RANDOM_NOT_TOP => 'random non-tank target', SAI_TARGET_ACTION_INVOKER => 'Invoker', SAI_TARGET_POSITION => 'world coordinates', - SAI_TARGET_CREATURE_RANGE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %4$sm', -/*10*/ SAI_TARGET_CREATURE_GUID => '(%4$d)?[npc=%4$d]:NPC; with GUID #%1$d', - SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %4$sm', + SAI_TARGET_CREATURE_RANGE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %11$sm(%4$d)? (max. %4$d targets):;', +/*10*/ SAI_TARGET_CREATURE_GUID => '(%11$d)?[npc=%11$d]:NPC; with GUID #%1$d', + SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %11$sm(%3$d)? (max. %3$d targets):;', SAI_TARGET_STORED => 'previously stored targets', - SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %4$sm', - SAI_TARGET_GAMEOBJECT_GUID => '(%4$d)?[object=%4$d]:gameobject; with GUID #%1$d', - SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %4$sm', + SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %11$sm(%4$d)? (max. %4$d targets):;', + SAI_TARGET_GAMEOBJECT_GUID => '(%11$d)?[object=%11$d]:gameobject; with GUID #%1$d', + SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %11$sm(%3$d)? (max. %3$d targets):;', SAI_TARGET_INVOKER_PARTY => 'Invokers party', - SAI_TARGET_PLAYER_RANGE => 'random player within %4$sm', - SAI_TARGET_PLAYER_DISTANCE => 'random player within %4$sm', - SAI_TARGET_CLOSEST_CREATURE => 'closest (%3$d)?dead:alive; (%1$d)?[npc=%1$d]:arbitrary creature; within %4$sm', -/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'closest (%1$d)?[object=%1$d]:arbitrary gameobject; within %4$sm', + SAI_TARGET_PLAYER_RANGE => 'random player within %11$sm', + SAI_TARGET_PLAYER_DISTANCE => 'random player within %11$sm', + SAI_TARGET_CLOSEST_CREATURE => 'closest (%3$d)?dead:alive; (%1$d)?[npc=%1$d]:arbitrary creature; within %11$sm', +/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'closest (%1$d)?[object=%1$d]:arbitrary gameobject; within %11$sm', SAI_TARGET_CLOSEST_PLAYER => 'closest player within %1$dm', SAI_TARGET_ACTION_INVOKER_VEHICLE => 'Invokers vehicle', SAI_TARGET_OWNER_OR_SUMMONER => 'Invokers owner or summoner', @@ -682,7 +694,8 @@ SAI_TARGET_CLOSEST_FRIENDLY => 'closest friendly (%2$d)?player:creature; within %1$dm', SAI_TARGET_LOOT_RECIPIENTS => 'all players eligible for loot', SAI_TARGET_FARTHEST => 'furthest engaged (%2$d)?player:creature; within %1$dm(%3$d)? and line of sight:;', - SAI_TARGET_VEHICLE_ACCESSORY => 'accessory in Invokers vehicle in seat %1$d' + SAI_TARGET_VEHICLE_PASSENGER => 'accessory in Invokers vehicle in (%1$d)?seat %11$s:all seats;', +/*30*/ SAI_TARGET_CLOSEST_UNSPAWNED_GO => 'closest unspawned (%1$d)?[object=%1$d]:, arbitrary gameobject; within %11$sm' ), 'castFlags' => array( SAI_CAST_FLAG_INTERRUPT_PREV => 'Interrupt current cast', @@ -690,6 +703,11 @@ SAI_CAST_FLAG_AURA_MISSING => 'Aura missing', SAI_CAST_FLAG_COMBAT_MOVE => 'Combat movement' ), + 'spawnFlags' => array( + SAI_SPAWN_FLAG_IGNORE_RESPAWN => 'Override and reset respawn timer', + SAI_SPAWN_FLAG_FORCE_SPAWN => 'Force spawn if already in world', + SAI_SPAWN_FLAG_NOSAVE_RESPAWN => 'Remove respawn time on despawn' + ), 'GOStates' => ['active', 'ready', 'active alternative'], 'summonTypes' => [null, 'Despawn timed or when corpse disappears', 'Despawn timed or when dying', 'Despawn timed', 'Despawn timed out of combat', 'Despawn when dying', 'Despawn timed after death', 'Despawn when corpse disappears', 'Despawn manually'], 'aiTpl' => ['basic AI', 'spell caster', 'turret', 'passive creature', 'cage for creature', 'caged creature'], @@ -697,14 +715,18 @@ 'sheaths' => ['all', 'melee', 'ranged'], 'saiUpdate' => ['out of combat', 'in combat', 'always'], 'lootStates' => ['Not ready', 'Ready', 'Activated', 'Just Deactivated'], + 'weatherStates' => ['Fine', 'Fog', 'Drizzle', 'Light Rain', 'Medium Rain', 'Heavy Rain', 'Light Snow', 'Medium Snow', 'Heavy Snow', 22 => 'Light Sandstorm', 41=> 'Medium Sandstorm', 42 => 'Heavy Sandstorm', 86 => 'Thunders', 90 => 'Black Rain', 106 => 'Black Snow'], + + 'GOStateUNK' => '[span class=q10]unknown gameobject state #[b class=q1]%d[/b][/span]', + 'summonTypeUNK' => '[span class=q10]unknown SummonType #[b class=q1]%d[/b][/span]', + 'aiTplUNK' => '[span class=q10]unknown AI-Template #[b class=q1]%d[/b][/span]', + 'reactStateUNK' => '[span class=q10]unknown ReactState #[b class=q1]%d[/b][/span]', + 'sheathUNK' => '[span class=q10]unknown sheath #[b class=q1]%d[/b][/span]', + 'saiUpdateUNK' => '[span class=q10]unknown update condition #[b class=q1]%d[/b][/span]', + 'lootStateUNK' => '[span class=q10]unknown loot state #[b class=q1]%d[/b][/span]', + 'weatherStateUNK' => '[span class=q10]unknown weather state #[b class=q1]%d[/b][/span]', - 'GOStateUNK' => '[span class=q10]unknown gameobject state #[b class=q1]%d[/b][/span]', - 'summonTypeUNK' => '[span class=q10]unknown SummonType #[b class=q1]%d[/b][/span]', - 'aiTplUNK' => '[span class=q10]unknown AI-Template #[b class=q1]%d[/b][/span]', - 'reactStateUNK' => '[span class=q10]unknown ReactState #[b class=q1]%d[/b][/span]', - 'sheathUNK' => '[span class=q10]unknown sheath #[b class=q1]%d[/b][/span]', - 'saiUpdateUNK' => '[span class=q10]unknown update condition #[b class=q1]%d[/b][/span]', - 'lootStateUNK' => '[span class=q10]unknown loot state #[b class=q1]%d[/b][/span]', + 'entityUNK' => '[b class=q10]unknown entity[/b]', 'empty' => '[span class=q0][/span]' ), diff --git a/localization/locale_eses.php b/localization/locale_eses.php index 7d50c3d9f..e99c2b1bd 100644 --- a/localization/locale_eses.php +++ b/localization/locale_eses.php @@ -79,7 +79,7 @@ 'links' => "Enlaces", 'compare' => "Comparar", 'view3D' => "Ver en 3D", - 'findUpgrades' => "Buscar mejoras...", + 'findUpgrades' => "Buscar mejoras…", // misc Tools 'errPageTitle' => "Página no encontrada", @@ -431,27 +431,27 @@ 'eventUNK' => '[span class=q10]Unknwon event #[b class=q1]%d[/b] in use.[/span]', 'eventTT' => '[b class=q1]EventType %d[/b][br][table][tr][td]PhaseMask[/td][td=header]0x%04X[/td][/tr][tr][td]Chance[/td][td=header]%d%%%%[/td][/tr][tr][td]Flags[/td][td=header]0x%04X[/td][/tr][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]Param5[/td][td=header]%d[/td][/tr][/table]', 'events' => array( - SAI_EVENT_UPDATE_IC => ['(%7$d)?:When in combat, ;(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_UPDATE_OOC => ['(%7$d)?:When out of combat, ;(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_HEALT_PCT => ['At %6$s%% Health', 'Repeat every %s'], - SAI_EVENT_MANA_PCT => ['At %6$s%% Mana', 'Repeat every %s'], + SAI_EVENT_UPDATE_IC => ['(%12$d)?:When in combat, ;(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_UPDATE_OOC => ['(%12$d)?:When out of combat, ;(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_HEALTH_PCT => ['At %11$s%% Health', 'Repeat every %s'], + SAI_EVENT_MANA_PCT => ['At %11$s%% Mana', 'Repeat every %s'], SAI_EVENT_AGGRO => ['On Aggro', null], SAI_EVENT_KILL => ['On killing (%3$d)?player:;(%4$d)?[npc=%4$d]:any creature;', 'Cooldown: %s'], SAI_EVENT_DEATH => ['On death', null], SAI_EVENT_EVADE => ['When evading', null], - SAI_EVENT_SPELLHIT => ['When hit by (%6$s)?%6$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], - SAI_EVENT_RANGE => ['On target at %6$sm', 'Repeat every %s'], + SAI_EVENT_SPELLHIT => ['When hit by (%11$s)?%11$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], + SAI_EVENT_RANGE => ['On target at %11$sm', 'Repeat every %s'], /* 10*/ SAI_EVENT_OOC_LOS => ['While out of combat, (%1$d)?friendly:hostile; (%5$d)?player:unit; enters line of sight within %2$dm', 'Cooldown: %s'], SAI_EVENT_RESPAWN => ['On respawn', null], - SAI_EVENT_TARGET_HEALTH_PCT => ['On target at %6$s%% health', 'Repeat every %s'], + SAI_EVENT_TARGET_HEALTH_PCT => ['On target at %11$s%% health', 'Repeat every %s'], SAI_EVENT_VICTIM_CASTING => ['Current target is casting (%3$d)?[spell=%3$d]:any spell;', 'Repeat every %s'], SAI_EVENT_FRIENDLY_HEALTH => ['Friendly NPC within %2$dm is at %1$d health', 'Repeat every %s'], SAI_EVENT_FRIENDLY_IS_CC => ['Friendly NPC within %1$dm is crowd controlled', 'Repeat every %s'], SAI_EVENT_FRIENDLY_MISSING_BUFF => ['Friendly NPC within %2$dm is missing [spell=%1$d]', 'Repeat every %s'], SAI_EVENT_SUMMONED_UNIT => ['Just summoned (%1$d)?[npc=%1$d]:any creature;', 'Cooldown: %s'], - SAI_EVENT_TARGET_MANA_PCT => ['On target at %6$s%% mana', 'Repeat every %s'], - SAI_EVENT_ACCEPTED_QUEST => ['Giving (%1$d)?[quest=%1$d]:any quest;', null], -/* 20*/ SAI_EVENT_REWARD_QUEST => ['Rewarding (%1$d)?[quest=%1$d]:any quest;', null], + SAI_EVENT_TARGET_MANA_PCT => ['On target at %11$s%% mana', 'Repeat every %s'], + SAI_EVENT_ACCEPTED_QUEST => ['Giving (%1$d)?[quest=%1$d]:any quest;', 'Cooldown: %s'], +/* 20*/ SAI_EVENT_REWARD_QUEST => ['Rewarding (%1$d)?[quest=%1$d]:any quest;', 'Cooldown: %s'], SAI_EVENT_REACHED_HOME => ['Arriving at home coordinates', null], SAI_EVENT_RECEIVE_EMOTE => ['Being targeted with [emote=%1$d]', 'Cooldown: %s'], SAI_EVENT_HAS_AURA => ['(%2$d)?Having %2$d stacks of:Missing aura; [spell=%1$d]', 'Repeat every %s'], @@ -462,9 +462,9 @@ SAI_EVENT_PASSENGER_REMOVED => ['A passenger got off', 'Cooldown: %s'], SAI_EVENT_CHARMED => ['(%1$d)?On being charmed:On charm wearing off;', null], /* 30*/ SAI_EVENT_CHARMED_TARGET => ['When charming #target#', null], - SAI_EVENT_SPELLHIT_TARGET => ['When #target# gets hit by (%6$s)?%6$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], - SAI_EVENT_DAMAGED => ['After taking %6$s points of damage', 'Repeat every %s'], - SAI_EVENT_DAMAGED_TARGET => ['After #target# took %6$s points of damage', 'Repeat every %s'], + SAI_EVENT_SPELLHIT_TARGET => ['When #target# gets hit by (%11$s)?%11$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], + SAI_EVENT_DAMAGED => ['After taking %11$s points of damage', 'Repeat every %s'], + SAI_EVENT_DAMAGED_TARGET => ['After #target# took %11$s points of damage', 'Repeat every %s'], SAI_EVENT_MOVEMENTINFORM => ['Started moving to point #[b]%2$d[/b](%1$d)? using MotionType #[b]%1$d[/b]:;', null], SAI_EVENT_SUMMON_DESPAWNED => ['Summoned [npc=%1$d] despawned', 'Cooldown: %s'], SAI_EVENT_CORPSE_REMOVED => ['On corpse despawn', null], @@ -484,20 +484,20 @@ /* 50*/ null, null, SAI_EVENT_TEXT_OVER => ['(%2$d)?[npc=%2$d]:any creature; is done talking TextGroup #[b]%1$d[/b]', null], - SAI_EVENT_RECEIVE_HEAL => ['Received %6$s points of healing', 'Cooldown: %s'], + SAI_EVENT_RECEIVE_HEAL => ['Received %11$s points of healing', 'Cooldown: %s'], SAI_EVENT_JUST_SUMMONED => ['On being summoned', null], SAI_EVENT_WAYPOINT_PAUSED => ['Pausing path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_RESUMED => ['Resuming path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_STOPPED => ['Stopping path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_ENDED => ['Ending current path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_TIMED_EVENT_TRIGGERED => ['Timed event #[b]%1$d[/b] is triggered', null], -/* 60*/ SAI_EVENT_UPDATE => ['(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_LINK => ['After Event %6$s', null], - SAI_EVENT_GOSSIP_SELECT => ['Selecting Gossip Option:[br](%6$s)?[span class=q1]%6$s[/span]:Menu #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], +/* 60*/ SAI_EVENT_UPDATE => ['(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_LINK => ['After Event %11$s', null], + SAI_EVENT_GOSSIP_SELECT => ['Selecting Gossip Option:[br](%11$s)?[span class=q1]%11$s[/span]:Menu #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], SAI_EVENT_JUST_CREATED => ['On being spawned for the first time', null], - SAI_EVENT_GOSSIP_HELLO => ['Opening Gossip', null], + SAI_EVENT_GOSSIP_HELLO => ['Opening Gossip', '(%1$d)?onGossipHello:;(%2$d)?onReportUse:;'], SAI_EVENT_FOLLOW_COMPLETED => ['Finished following', null], - SAI_EVENT_EVENT_PHASE_CHANGE => ['Event Phase changed and matches %6$s', null], + SAI_EVENT_EVENT_PHASE_CHANGE => ['Event Phase changed and matches %11$s', null], SAI_EVENT_IS_BEHIND_TARGET => ['Facing the backside of #target#', 'Cooldown: %s'], SAI_EVENT_GAME_EVENT_START => ['[event=%1$d] started', null], SAI_EVENT_GAME_EVENT_END => ['[event=%1$d] ended', null], @@ -505,9 +505,9 @@ SAI_EVENT_GO_EVENT_INFORM => ['Taxi path event #[b]%1$d[/b] trigered', null], SAI_EVENT_ACTION_DONE => ['Executed action #[b]%1$d[/b] requested by script', null], SAI_EVENT_ON_SPELLCLICK => ['Spellclick triggered', null], - SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Health of #target# is at %6$s%%', 'Repeat every %s'], - SAI_EVENT_DISTANCE_CREATURE => ['[npc=%6$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], - SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%6$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], + SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Health of #target# is at %12$s%%', 'Repeat every %s'], + SAI_EVENT_DISTANCE_CREATURE => ['[npc=%11$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], + SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%11$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], SAI_EVENT_COUNTER_SET => ['Counter #[b]%1$d[/b] is equal to [b]%2$d[/b]', null], ), 'eventFlags' => array( @@ -525,7 +525,7 @@ null, SAI_ACTION_TALK => ['(%3$d)?Say:#target# says; (%7$d)?TextGroup:[span class=q10]unknown text[/span]; #[b]%1$d[/b] to #target#%8$s', 'Duration: %s'], SAI_ACTION_SET_FACTION => ['(%1$d)?Set faction of #target# to [faction=%7$d]:Reset faction of #target#;.', null], - SAI_ACTION_MORPH_TO_ENTRY_OR_MODEL => ['(%7$d)?Reset apperance.:Take the appearance of;(%1$d)?[npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], + SAI_ACTION_MORPH_TO_ENTRY_OR_MODEL => ['(%7$d)?Reset apperance.:Take the appearance of;(%1$d)? [npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], SAI_ACTION_SOUND => ['Play sound(%2$d)? to invoking player:;:[div float=right width=270px][sound=%1$d][/div]', 'Played by environment.'], SAI_ACTION_PLAY_EMOTE => ['Emote [emote=%1$d] to #target#.', null], SAI_ACTION_FAIL_QUEST => ['Fail [quest=%1$d] for #target#.', null], @@ -545,20 +545,20 @@ SAI_ACTION_ALLOW_COMBAT_MOVEMENT => ['(%1$d)?Enable:Disable; combat movement.', null], SAI_ACTION_SET_EVENT_PHASE => ['Set Event Phase of #target# to [b]%1$d[/b].', null], SAI_ACTION_INC_EVENT_PHASE => ['(%1$d)?Increment:Decrement; Event Phase of #target#.', null], - SAI_ACTION_EVADE => ['#target# enters Evade Mode.', null], + SAI_ACTION_EVADE => ['#target# evades to (%1$d)?last stored:respawn; position.', null], SAI_ACTION_FLEE_FOR_ASSIST => ['Flee for assistance.', 'Use default flee emote'], SAI_ACTION_CALL_GROUPEVENTHAPPENS => ['Satisfy objective of [quest=%1$d] for #target#.', null], SAI_ACTION_COMBAT_STOP => ['End current combat.', null], - SAI_ACTION_REMOVEAURASFROMSPELL => ['Remove (%1$d)?all auras:auras of [spell=%1$d]; from #target#.', null], + SAI_ACTION_REMOVEAURASFROMSPELL => ['Remove (%1$d)?all auras:auras of [spell=%1$d]; from #target#.', 'Only own auras'], SAI_ACTION_FOLLOW => ['Follow #target#(%1$d)? at %1$dm distance:;(%3$d)? until reaching [npc=%3$d]:;.', '(%7$d)?Angle: %7$.2f°:;(%8$d)? Some form of Quest Credit is given:;'], /* 30*/ SAI_ACTION_RANDOM_PHASE => ['Pick random Event Phase from %7$s.', null], SAI_ACTION_RANDOM_PHASE_RANGE => ['Pick random Event Phase between %1$d and %2$d.', null], SAI_ACTION_RESET_GOBJECT => ['Reset #target#.', null], SAI_ACTION_CALL_KILLEDMONSTER => ['A kill of [npc=%1$d] is credited to #target#.', null], SAI_ACTION_SET_INST_DATA => ['Set Instance (%3$d)?Boss State:Data Field; #[b]%1$d[/b] to [b]%2$d[/b].', null], - null, + null, // SMART_ACTION_SET_INST_DATA64 = 35 SAI_ACTION_UPDATE_TEMPLATE => ['Transform to become [npc=%1$d](%2$d)? with level [b]%2$d[/b]:;.', null], - SAI_ACTION_DIE => ['Die...   painfully.', null], + SAI_ACTION_DIE => ['Die…   painfully.', null], SAI_ACTION_SET_IN_COMBAT_WITH_ZONE => ['Set in combat with units in zone.', null], SAI_ACTION_CALL_FOR_HELP => ['Call for help.', 'Use default help emote'], /* 40*/ SAI_ACTION_SET_SHEATH => ['Sheath %7$s weapons.', null], @@ -567,7 +567,7 @@ SAI_ACTION_MOUNT_TO_ENTRY_OR_MODEL => ['(%7$d)?Dismount.:Mount ;(%1$d)?[npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], SAI_ACTION_SET_INGAME_PHASE_MASK => ['Set visibility of #target# to phase %7$s.', null], SAI_ACTION_SET_DATA => ['[b]%2$d[/b] is stored in data field #[b]%1$d[/b] of #target#.', null], - null, + SAI_ACTION_ATTACK_STOP => ['Stop attacking.', null], SAI_ACTION_SET_VISIBILITY => ['#target# becomes (%1$d)?visible:invisible;.', null], SAI_ACTION_SET_ACTIVE => ['#target# becomes Grid (%1$d)?active:inactive;.', null], SAI_ACTION_ATTACK_START => ['Start attacking #target#.', null], @@ -606,7 +606,7 @@ SAI_ACTION_ADD_NPC_FLAG => ['Add %7$s npc flags to #target#.', null], SAI_ACTION_REMOVE_NPC_FLAG => ['Remove %7$s npc flags from #target#.', null], SAI_ACTION_SIMPLE_TALK => ['#target# says (%7$s)?TextGroup:[span class=q10]unknown text[/span]; #[b]%1$d[/b] to #target#%7$s', null], - SAI_ACTION_INVOKER_CAST => ['Invoker casts [spell=%1$d] at #target#.', null], + SAI_ACTION_SELF_CAST => ['Self casts [spell=%1$d] at #target#.', null], SAI_ACTION_CROSS_CAST => ['%7$s casts [spell=%1$d] at #target#.', null], SAI_ACTION_CALL_RANDOM_TIMED_ACTIONLIST => ['Call Timed Actionlist at random: [html]%7$s[/html]', null], SAI_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST => ['Call Timed Actionlist at random from range: [html]%7$s[/html]', null], @@ -648,7 +648,19 @@ SAI_ACTION_LOAD_EQUIPMENT => ['(%2$d)?Unequip non-standard items:Equip %7$s; from equipment template #[b]%1$d[/b] on #target#.', 'Note: creature items do not necessarily have an item template'], SAI_ACTION_TRIGGER_RANDOM_TIMED_EVENT => ['Trigger previously defined timed event in id range %7$s.', null], SAI_ACTION_REMOVE_ALL_GAMEOBJECTS => ['Remove all gameobjects owned by #target#.', null], - SAI_ACTION_STOP_MOTION => ['(%1$d)?Remove motion type #[b]%1$d[/b] from #target#. :;(%2$d)?Stop moving.:;', null], + SAI_ACTION_PAUSE_MOVEMENT => ['Pause movement from slot #[b]%1$d[/b] for %7$s.', 'Forced'], + null, // SAI_ACTION_PLAY_ANIMKIT = 128, // don't use on 3.3.5a + null, // SAI_ACTION_SCENE_PLAY = 129, // don't use on 3.3.5a +/*130*/ null, // SAI_ACTION_SCENE_CANCEL = 130, // don't use on 3.3.5a + SAI_ACTION_SPAWN_SPAWNGROUP => ['Spawn SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Cooldown: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_DESPAWN_SPAWNGROUP => ['Despawn SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Cooldown: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_RESPAWN_BY_SPAWNID => ['Respawn %7$s [small class=q0](GUID: %2$d)[/small]', null], // spawnType, spawnId + SAI_ACTION_INVOKER_CAST => ['Invoker casts [spell=%1$d] at #target#.', null], // spellID, castFlags + SAI_ACTION_PLAY_CINEMATIC => ['Play cinematic #[b]%1$d[/b] for #target#', null], // cinematic + SAI_ACTION_SET_MOVEMENT_SPEED => ['Set speed of MotionType #[b]%1$d[/b] to [b]%7$.2f[/b]', null], // movementType, speedInteger, speedFraction + null, // SAI_ACTION_PLAY_SPELL_VISUAL_KIT', // spellVisualKitId (RESERVED, PENDING CHERRYPICK) + SAI_ACTION_OVERRIDE_LIGHT => ['Change skybox in [zone=%1$d] to #[b]%2$d[/b].', 'Transition: %s'], // zoneId, overrideLightID, transitionMilliseconds + SAI_ACTION_OVERRIDE_WEATHER => ['Change weather in [zone=%1$d] to %7$s at %3$d%% intensity.', null], // zoneId, weatherId, intensity ), 'targetUNK' => '[span class=q10]unknown target #[b class=q1]%d[/b][/span]', 'targetTT' => '[b class=q1]TargetType %d[/b][br][table][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]X[/td][td=header]%.2f[/td][/tr][tr][td]Y[/td][td=header]%.2f[/td][/tr][tr][td]Z[/td][td=header]%.2f[/td][/tr][tr][td]O[/td][td=header]%.2f[/td][/tr][/table]', @@ -662,18 +674,18 @@ SAI_TARGET_HOSTILE_RANDOM_NOT_TOP => 'random non-tank target', SAI_TARGET_ACTION_INVOKER => 'Invoker', SAI_TARGET_POSITION => 'world coordinates', - SAI_TARGET_CREATURE_RANGE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %4$sm', -/*10*/ SAI_TARGET_CREATURE_GUID => '(%4$d)?[npc=%4$d]:NPC; with GUID #%1$d', - SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %4$sm', + SAI_TARGET_CREATURE_RANGE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %11$sm(%4$d)? (max. %4$d targets):;', +/*10*/ SAI_TARGET_CREATURE_GUID => '(%11$d)?[npc=%11$d]:NPC; with GUID #%1$d', + SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %11$sm(%3$d)? (max. %3$d targets):;', SAI_TARGET_STORED => 'previously stored targets', - SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %4$sm', - SAI_TARGET_GAMEOBJECT_GUID => '(%4$d)?[object=%4$d]:gameobject; with GUID #%1$d', - SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %4$sm', + SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %11$sm(%4$d)? (max. %4$d targets):;', + SAI_TARGET_GAMEOBJECT_GUID => '(%11$d)?[object=%11$d]:gameobject; with GUID #%1$d', + SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %11$sm(%3$d)? (max. %3$d targets):;', SAI_TARGET_INVOKER_PARTY => 'Invokers party', - SAI_TARGET_PLAYER_RANGE => 'random player within %4$sm', - SAI_TARGET_PLAYER_DISTANCE => 'random player within %4$sm', - SAI_TARGET_CLOSEST_CREATURE => 'closest (%3$d)?dead:alive; (%1$d)?[npc=%1$d]:arbitrary creature; within %4$sm', -/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'closest (%1$d)?[object=%1$d]:arbitrary gameobject; within %4$sm', + SAI_TARGET_PLAYER_RANGE => 'random player within %11$sm', + SAI_TARGET_PLAYER_DISTANCE => 'random player within %11$sm', + SAI_TARGET_CLOSEST_CREATURE => 'closest (%3$d)?dead:alive; (%1$d)?[npc=%1$d]:arbitrary creature; within %11$sm', +/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'closest (%1$d)?[object=%1$d]:arbitrary gameobject; within %11$sm', SAI_TARGET_CLOSEST_PLAYER => 'closest player within %1$dm', SAI_TARGET_ACTION_INVOKER_VEHICLE => 'Invokers vehicle', SAI_TARGET_OWNER_OR_SUMMONER => 'Invokers owner or summoner', @@ -682,7 +694,8 @@ SAI_TARGET_CLOSEST_FRIENDLY => 'closest friendly (%2$d)?player:creature; within %1$dm', SAI_TARGET_LOOT_RECIPIENTS => 'all players eligible for loot', SAI_TARGET_FARTHEST => 'furthest engaged (%2$d)?player:creature; within %1$dm(%3$d)? and line of sight:;', - SAI_TARGET_VEHICLE_ACCESSORY => 'accessory in Invokers vehicle in seat %1$d' + SAI_TARGET_VEHICLE_PASSENGER => 'accessory in Invokers vehicle in (%1$d)?seat %11$s:all seats;', +/*30*/ SAI_TARGET_CLOSEST_UNSPAWNED_GO => 'closest unspawned (%1$d)?[object=%1$d]:, arbitrary gameobject; within %11$sm' ), 'castFlags' => array( SAI_CAST_FLAG_INTERRUPT_PREV => 'Interrupt current cast', @@ -690,6 +703,11 @@ SAI_CAST_FLAG_AURA_MISSING => 'Aura missing', SAI_CAST_FLAG_COMBAT_MOVE => 'Combat movement' ), + 'spawnFlags' => array( + SAI_SPAWN_FLAG_IGNORE_RESPAWN => 'Override and reset respawn timer', + SAI_SPAWN_FLAG_FORCE_SPAWN => 'Force spawn if already in world', + SAI_SPAWN_FLAG_NOSAVE_RESPAWN => 'Remove respawn time on despawn' + ), 'GOStates' => ['active', 'ready', 'active alternative'], 'summonTypes' => [null, 'Despawn timed or when corpse disappears', 'Despawn timed or when dying', 'Despawn timed', 'Despawn timed out of combat', 'Despawn when dying', 'Despawn timed after death', 'Despawn when corpse disappears', 'Despawn manually'], 'aiTpl' => ['basic AI', 'spell caster', 'turret', 'passive creature', 'cage for creature', 'caged creature'], @@ -697,14 +715,18 @@ 'sheaths' => ['all', 'melee', 'ranged'], 'saiUpdate' => ['out of combat', 'in combat', 'always'], 'lootStates' => ['Not ready', 'Ready', 'Activated', 'Just Deactivated'], + 'weatherStates' => ['Fine', 'Fog', 'Drizzle', 'Light Rain', 'Medium Rain', 'Heavy Rain', 'Light Snow', 'Medium Snow', 'Heavy Snow', 22 => 'Light Sandstorm', 41=> 'Medium Sandstorm', 42 => 'Heavy Sandstorm', 86 => 'Thunders', 90 => 'Black Rain', 106 => 'Black Snow'], + + 'GOStateUNK' => '[span class=q10]unknown gameobject state #[b class=q1]%d[/b][/span]', + 'summonTypeUNK' => '[span class=q10]unknown SummonType #[b class=q1]%d[/b][/span]', + 'aiTplUNK' => '[span class=q10]unknown AI-Template #[b class=q1]%d[/b][/span]', + 'reactStateUNK' => '[span class=q10]unknown ReactState #[b class=q1]%d[/b][/span]', + 'sheathUNK' => '[span class=q10]unknown sheath #[b class=q1]%d[/b][/span]', + 'saiUpdateUNK' => '[span class=q10]unknown update condition #[b class=q1]%d[/b][/span]', + 'lootStateUNK' => '[span class=q10]unknown loot state #[b class=q1]%d[/b][/span]', + 'weatherStateUNK' => '[span class=q10]unknown weather state #[b class=q1]%d[/b][/span]', - 'GOStateUNK' => '[span class=q10]unknown gameobject state #[b class=q1]%d[/b][/span]', - 'summonTypeUNK' => '[span class=q10]unknown SummonType #[b class=q1]%d[/b][/span]', - 'aiTplUNK' => '[span class=q10]unknown AI-Template #[b class=q1]%d[/b][/span]', - 'reactStateUNK' => '[span class=q10]unknown ReactState #[b class=q1]%d[/b][/span]', - 'sheathUNK' => '[span class=q10]unknown sheath #[b class=q1]%d[/b][/span]', - 'saiUpdateUNK' => '[span class=q10]unknown update condition #[b class=q1]%d[/b][/span]', - 'lootStateUNK' => '[span class=q10]unknown loot state #[b class=q1]%d[/b][/span]', + 'entityUNK' => '[b class=q10]unknown entity[/b]', 'empty' => '[span class=q0][/span]' ), diff --git a/localization/locale_frfr.php b/localization/locale_frfr.php index 0a6557ccd..1e7344bb9 100644 --- a/localization/locale_frfr.php +++ b/localization/locale_frfr.php @@ -79,7 +79,7 @@ 'links' => "Liens", 'compare' => "Comparer", 'view3D' => "Voir en 3D", - 'findUpgrades' => "Trouver des améliorations...", + 'findUpgrades' => "Trouver des améliorations…", // misc Tools 'errPageTitle' => "Page non trouvée", @@ -431,27 +431,27 @@ 'eventUNK' => '[span class=q10]Unknwon event #[b class=q1]%d[/b] in use.[/span]', 'eventTT' => '[b class=q1]EventType %d[/b][br][table][tr][td]PhaseMask[/td][td=header]0x%04X[/td][/tr][tr][td]Chance[/td][td=header]%d%%%%[/td][/tr][tr][td]Flags[/td][td=header]0x%04X[/td][/tr][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]Param5[/td][td=header]%d[/td][/tr][/table]', 'events' => array( - SAI_EVENT_UPDATE_IC => ['(%7$d)?:When in combat, ;(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_UPDATE_OOC => ['(%7$d)?:When out of combat, ;(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_HEALT_PCT => ['At %6$s%% Health', 'Repeat every %s'], - SAI_EVENT_MANA_PCT => ['At %6$s%% Mana', 'Repeat every %s'], + SAI_EVENT_UPDATE_IC => ['(%12$d)?:When in combat, ;(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_UPDATE_OOC => ['(%12$d)?:When out of combat, ;(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_HEALTH_PCT => ['At %11$s%% Health', 'Repeat every %s'], + SAI_EVENT_MANA_PCT => ['At %11$s%% Mana', 'Repeat every %s'], SAI_EVENT_AGGRO => ['On Aggro', null], SAI_EVENT_KILL => ['On killing (%3$d)?player:;(%4$d)?[npc=%4$d]:any creature;', 'Cooldown: %s'], SAI_EVENT_DEATH => ['On death', null], SAI_EVENT_EVADE => ['When evading', null], - SAI_EVENT_SPELLHIT => ['When hit by (%6$s)?%6$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], - SAI_EVENT_RANGE => ['On target at %6$sm', 'Repeat every %s'], + SAI_EVENT_SPELLHIT => ['When hit by (%11$s)?%11$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], + SAI_EVENT_RANGE => ['On target at %11$sm', 'Repeat every %s'], /* 10*/ SAI_EVENT_OOC_LOS => ['While out of combat, (%1$d)?friendly:hostile; (%5$d)?player:unit; enters line of sight within %2$dm', 'Cooldown: %s'], SAI_EVENT_RESPAWN => ['On respawn', null], - SAI_EVENT_TARGET_HEALTH_PCT => ['On target at %6$s%% health', 'Repeat every %s'], + SAI_EVENT_TARGET_HEALTH_PCT => ['On target at %11$s%% health', 'Repeat every %s'], SAI_EVENT_VICTIM_CASTING => ['Current target is casting (%3$d)?[spell=%3$d]:any spell;', 'Repeat every %s'], SAI_EVENT_FRIENDLY_HEALTH => ['Friendly NPC within %2$dm is at %1$d health', 'Repeat every %s'], SAI_EVENT_FRIENDLY_IS_CC => ['Friendly NPC within %1$dm is crowd controlled', 'Repeat every %s'], SAI_EVENT_FRIENDLY_MISSING_BUFF => ['Friendly NPC within %2$dm is missing [spell=%1$d]', 'Repeat every %s'], SAI_EVENT_SUMMONED_UNIT => ['Just summoned (%1$d)?[npc=%1$d]:any creature;', 'Cooldown: %s'], - SAI_EVENT_TARGET_MANA_PCT => ['On target at %6$s%% mana', 'Repeat every %s'], - SAI_EVENT_ACCEPTED_QUEST => ['Giving (%1$d)?[quest=%1$d]:any quest;', null], -/* 20*/ SAI_EVENT_REWARD_QUEST => ['Rewarding (%1$d)?[quest=%1$d]:any quest;', null], + SAI_EVENT_TARGET_MANA_PCT => ['On target at %11$s%% mana', 'Repeat every %s'], + SAI_EVENT_ACCEPTED_QUEST => ['Giving (%1$d)?[quest=%1$d]:any quest;', 'Cooldown: %s'], +/* 20*/ SAI_EVENT_REWARD_QUEST => ['Rewarding (%1$d)?[quest=%1$d]:any quest;', 'Cooldown: %s'], SAI_EVENT_REACHED_HOME => ['Arriving at home coordinates', null], SAI_EVENT_RECEIVE_EMOTE => ['Being targeted with [emote=%1$d]', 'Cooldown: %s'], SAI_EVENT_HAS_AURA => ['(%2$d)?Having %2$d stacks of:Missing aura; [spell=%1$d]', 'Repeat every %s'], @@ -462,9 +462,9 @@ SAI_EVENT_PASSENGER_REMOVED => ['A passenger got off', 'Cooldown: %s'], SAI_EVENT_CHARMED => ['(%1$d)?On being charmed:On charm wearing off;', null], /* 30*/ SAI_EVENT_CHARMED_TARGET => ['When charming #target#', null], - SAI_EVENT_SPELLHIT_TARGET => ['When #target# gets hit by (%6$s)?%6$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], - SAI_EVENT_DAMAGED => ['After taking %6$s points of damage', 'Repeat every %s'], - SAI_EVENT_DAMAGED_TARGET => ['After #target# took %6$s points of damage', 'Repeat every %s'], + SAI_EVENT_SPELLHIT_TARGET => ['When #target# gets hit by (%11$s)?%11$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], + SAI_EVENT_DAMAGED => ['After taking %11$s points of damage', 'Repeat every %s'], + SAI_EVENT_DAMAGED_TARGET => ['After #target# took %11$s points of damage', 'Repeat every %s'], SAI_EVENT_MOVEMENTINFORM => ['Started moving to point #[b]%2$d[/b](%1$d)? using MotionType #[b]%1$d[/b]:;', null], SAI_EVENT_SUMMON_DESPAWNED => ['Summoned [npc=%1$d] despawned', 'Cooldown: %s'], SAI_EVENT_CORPSE_REMOVED => ['On corpse despawn', null], @@ -484,20 +484,20 @@ /* 50*/ null, null, SAI_EVENT_TEXT_OVER => ['(%2$d)?[npc=%2$d]:any creature; is done talking TextGroup #[b]%1$d[/b]', null], - SAI_EVENT_RECEIVE_HEAL => ['Received %6$s points of healing', 'Cooldown: %s'], + SAI_EVENT_RECEIVE_HEAL => ['Received %11$s points of healing', 'Cooldown: %s'], SAI_EVENT_JUST_SUMMONED => ['On being summoned', null], SAI_EVENT_WAYPOINT_PAUSED => ['Pausing path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_RESUMED => ['Resuming path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_STOPPED => ['Stopping path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_ENDED => ['Ending current path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_TIMED_EVENT_TRIGGERED => ['Timed event #[b]%1$d[/b] is triggered', null], -/* 60*/ SAI_EVENT_UPDATE => ['(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_LINK => ['After Event %6$s', null], - SAI_EVENT_GOSSIP_SELECT => ['Selecting Gossip Option:[br](%6$s)?[span class=q1]%6$s[/span]:Menu #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], +/* 60*/ SAI_EVENT_UPDATE => ['(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_LINK => ['After Event %11$s', null], + SAI_EVENT_GOSSIP_SELECT => ['Selecting Gossip Option:[br](%11$s)?[span class=q1]%11$s[/span]:Menu #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], SAI_EVENT_JUST_CREATED => ['On being spawned for the first time', null], - SAI_EVENT_GOSSIP_HELLO => ['Opening Gossip', null], + SAI_EVENT_GOSSIP_HELLO => ['Opening Gossip', '(%1$d)?onGossipHello:;(%2$d)?onReportUse:;'], SAI_EVENT_FOLLOW_COMPLETED => ['Finished following', null], - SAI_EVENT_EVENT_PHASE_CHANGE => ['Event Phase changed and matches %6$s', null], + SAI_EVENT_EVENT_PHASE_CHANGE => ['Event Phase changed and matches %11$s', null], SAI_EVENT_IS_BEHIND_TARGET => ['Facing the backside of #target#', 'Cooldown: %s'], SAI_EVENT_GAME_EVENT_START => ['[event=%1$d] started', null], SAI_EVENT_GAME_EVENT_END => ['[event=%1$d] ended', null], @@ -505,9 +505,9 @@ SAI_EVENT_GO_EVENT_INFORM => ['Taxi path event #[b]%1$d[/b] trigered', null], SAI_EVENT_ACTION_DONE => ['Executed action #[b]%1$d[/b] requested by script', null], SAI_EVENT_ON_SPELLCLICK => ['Spellclick triggered', null], - SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Health of #target# is at %6$s%%', 'Repeat every %s'], - SAI_EVENT_DISTANCE_CREATURE => ['[npc=%6$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], - SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%6$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], + SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Health of #target# is at %12$s%%', 'Repeat every %s'], + SAI_EVENT_DISTANCE_CREATURE => ['[npc=%11$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], + SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%11$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], SAI_EVENT_COUNTER_SET => ['Counter #[b]%1$d[/b] is equal to [b]%2$d[/b]', null], ), 'eventFlags' => array( @@ -525,7 +525,7 @@ null, SAI_ACTION_TALK => ['(%3$d)?Say:#target# says; (%7$d)?TextGroup:[span class=q10]unknown text[/span]; #[b]%1$d[/b] to #target#%8$s', 'Duration: %s'], SAI_ACTION_SET_FACTION => ['(%1$d)?Set faction of #target# to [faction=%7$d]:Reset faction of #target#;.', null], - SAI_ACTION_MORPH_TO_ENTRY_OR_MODEL => ['(%7$d)?Reset apperance.:Take the appearance of;(%1$d)?[npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], + SAI_ACTION_MORPH_TO_ENTRY_OR_MODEL => ['(%7$d)?Reset apperance.:Take the appearance of;(%1$d)? [npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], SAI_ACTION_SOUND => ['Play sound(%2$d)? to invoking player:;:[div float=right width=270px][sound=%1$d][/div]', 'Played by environment.'], SAI_ACTION_PLAY_EMOTE => ['Emote [emote=%1$d] to #target#.', null], SAI_ACTION_FAIL_QUEST => ['Fail [quest=%1$d] for #target#.', null], @@ -545,20 +545,20 @@ SAI_ACTION_ALLOW_COMBAT_MOVEMENT => ['(%1$d)?Enable:Disable; combat movement.', null], SAI_ACTION_SET_EVENT_PHASE => ['Set Event Phase of #target# to [b]%1$d[/b].', null], SAI_ACTION_INC_EVENT_PHASE => ['(%1$d)?Increment:Decrement; Event Phase of #target#.', null], - SAI_ACTION_EVADE => ['#target# enters Evade Mode.', null], + SAI_ACTION_EVADE => ['#target# evades to (%1$d)?last stored:respawn; position.', null], SAI_ACTION_FLEE_FOR_ASSIST => ['Flee for assistance.', 'Use default flee emote'], SAI_ACTION_CALL_GROUPEVENTHAPPENS => ['Satisfy objective of [quest=%1$d] for #target#.', null], SAI_ACTION_COMBAT_STOP => ['End current combat.', null], - SAI_ACTION_REMOVEAURASFROMSPELL => ['Remove (%1$d)?all auras:auras of [spell=%1$d]; from #target#.', null], + SAI_ACTION_REMOVEAURASFROMSPELL => ['Remove (%1$d)?all auras:auras of [spell=%1$d]; from #target#.', 'Only own auras'], SAI_ACTION_FOLLOW => ['Follow #target#(%1$d)? at %1$dm distance:;(%3$d)? until reaching [npc=%3$d]:;.', '(%7$d)?Angle: %7$.2f°:;(%8$d)? Some form of Quest Credit is given:;'], /* 30*/ SAI_ACTION_RANDOM_PHASE => ['Pick random Event Phase from %7$s.', null], SAI_ACTION_RANDOM_PHASE_RANGE => ['Pick random Event Phase between %1$d and %2$d.', null], SAI_ACTION_RESET_GOBJECT => ['Reset #target#.', null], SAI_ACTION_CALL_KILLEDMONSTER => ['A kill of [npc=%1$d] is credited to #target#.', null], SAI_ACTION_SET_INST_DATA => ['Set Instance (%3$d)?Boss State:Data Field; #[b]%1$d[/b] to [b]%2$d[/b].', null], - null, + null, // SMART_ACTION_SET_INST_DATA64 = 35 SAI_ACTION_UPDATE_TEMPLATE => ['Transform to become [npc=%1$d](%2$d)? with level [b]%2$d[/b]:;.', null], - SAI_ACTION_DIE => ['Die...   painfully.', null], + SAI_ACTION_DIE => ['Die…   painfully.', null], SAI_ACTION_SET_IN_COMBAT_WITH_ZONE => ['Set in combat with units in zone.', null], SAI_ACTION_CALL_FOR_HELP => ['Call for help.', 'Use default help emote'], /* 40*/ SAI_ACTION_SET_SHEATH => ['Sheath %7$s weapons.', null], @@ -567,7 +567,7 @@ SAI_ACTION_MOUNT_TO_ENTRY_OR_MODEL => ['(%7$d)?Dismount.:Mount ;(%1$d)?[npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], SAI_ACTION_SET_INGAME_PHASE_MASK => ['Set visibility of #target# to phase %7$s.', null], SAI_ACTION_SET_DATA => ['[b]%2$d[/b] is stored in data field #[b]%1$d[/b] of #target#.', null], - null, + SAI_ACTION_ATTACK_STOP => ['Stop attacking.', null], SAI_ACTION_SET_VISIBILITY => ['#target# becomes (%1$d)?visible:invisible;.', null], SAI_ACTION_SET_ACTIVE => ['#target# becomes Grid (%1$d)?active:inactive;.', null], SAI_ACTION_ATTACK_START => ['Start attacking #target#.', null], @@ -606,7 +606,7 @@ SAI_ACTION_ADD_NPC_FLAG => ['Add %7$s npc flags to #target#.', null], SAI_ACTION_REMOVE_NPC_FLAG => ['Remove %7$s npc flags from #target#.', null], SAI_ACTION_SIMPLE_TALK => ['#target# says (%7$s)?TextGroup:[span class=q10]unknown text[/span]; #[b]%1$d[/b] to #target#%7$s', null], - SAI_ACTION_INVOKER_CAST => ['Invoker casts [spell=%1$d] at #target#.', null], + SAI_ACTION_SELF_CAST => ['Self casts [spell=%1$d] at #target#.', null], SAI_ACTION_CROSS_CAST => ['%7$s casts [spell=%1$d] at #target#.', null], SAI_ACTION_CALL_RANDOM_TIMED_ACTIONLIST => ['Call Timed Actionlist at random: [html]%7$s[/html]', null], SAI_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST => ['Call Timed Actionlist at random from range: [html]%7$s[/html]', null], @@ -648,7 +648,19 @@ SAI_ACTION_LOAD_EQUIPMENT => ['(%2$d)?Unequip non-standard items:Equip %7$s; from equipment template #[b]%1$d[/b] on #target#.', 'Note: creature items do not necessarily have an item template'], SAI_ACTION_TRIGGER_RANDOM_TIMED_EVENT => ['Trigger previously defined timed event in id range %7$s.', null], SAI_ACTION_REMOVE_ALL_GAMEOBJECTS => ['Remove all gameobjects owned by #target#.', null], - SAI_ACTION_STOP_MOTION => ['(%1$d)?Remove motion type #[b]%1$d[/b] from #target#. :;(%2$d)?Stop moving.:;', null], + SAI_ACTION_PAUSE_MOVEMENT => ['Pause movement from slot #[b]%1$d[/b] for %7$s.', 'Forced'], + null, // SAI_ACTION_PLAY_ANIMKIT = 128, // don't use on 3.3.5a + null, // SAI_ACTION_SCENE_PLAY = 129, // don't use on 3.3.5a +/*130*/ null, // SAI_ACTION_SCENE_CANCEL = 130, // don't use on 3.3.5a + SAI_ACTION_SPAWN_SPAWNGROUP => ['Spawn SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Cooldown: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_DESPAWN_SPAWNGROUP => ['Despawn SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Cooldown: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_RESPAWN_BY_SPAWNID => ['Respawn %7$s [small class=q0](GUID: %2$d)[/small]', null], // spawnType, spawnId + SAI_ACTION_INVOKER_CAST => ['Invoker casts [spell=%1$d] at #target#.', null], // spellID, castFlags + SAI_ACTION_PLAY_CINEMATIC => ['Play cinematic #[b]%1$d[/b] for #target#', null], // cinematic + SAI_ACTION_SET_MOVEMENT_SPEED => ['Set speed of MotionType #[b]%1$d[/b] to [b]%7$.2f[/b]', null], // movementType, speedInteger, speedFraction + null, // SAI_ACTION_PLAY_SPELL_VISUAL_KIT', // spellVisualKitId (RESERVED, PENDING CHERRYPICK) + SAI_ACTION_OVERRIDE_LIGHT => ['Change skybox in [zone=%1$d] to #[b]%2$d[/b].', 'Transition: %s'], // zoneId, overrideLightID, transitionMilliseconds + SAI_ACTION_OVERRIDE_WEATHER => ['Change weather in [zone=%1$d] to %7$s at %3$d%% intensity.', null], // zoneId, weatherId, intensity ), 'targetUNK' => '[span class=q10]unknown target #[b class=q1]%d[/b][/span]', 'targetTT' => '[b class=q1]TargetType %d[/b][br][table][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]X[/td][td=header]%.2f[/td][/tr][tr][td]Y[/td][td=header]%.2f[/td][/tr][tr][td]Z[/td][td=header]%.2f[/td][/tr][tr][td]O[/td][td=header]%.2f[/td][/tr][/table]', @@ -662,18 +674,18 @@ SAI_TARGET_HOSTILE_RANDOM_NOT_TOP => 'random non-tank target', SAI_TARGET_ACTION_INVOKER => 'Invoker', SAI_TARGET_POSITION => 'world coordinates', - SAI_TARGET_CREATURE_RANGE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %4$sm', -/*10*/ SAI_TARGET_CREATURE_GUID => '(%4$d)?[npc=%4$d]:NPC; with GUID #%1$d', - SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %4$sm', + SAI_TARGET_CREATURE_RANGE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %11$sm(%4$d)? (max. %4$d targets):;', +/*10*/ SAI_TARGET_CREATURE_GUID => '(%11$d)?[npc=%11$d]:NPC; with GUID #%1$d', + SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %11$sm(%3$d)? (max. %3$d targets):;', SAI_TARGET_STORED => 'previously stored targets', - SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %4$sm', - SAI_TARGET_GAMEOBJECT_GUID => '(%4$d)?[object=%4$d]:gameobject; with GUID #%1$d', - SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %4$sm', + SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %11$sm(%4$d)? (max. %4$d targets):;', + SAI_TARGET_GAMEOBJECT_GUID => '(%11$d)?[object=%11$d]:gameobject; with GUID #%1$d', + SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %11$sm(%3$d)? (max. %3$d targets):;', SAI_TARGET_INVOKER_PARTY => 'Invokers party', - SAI_TARGET_PLAYER_RANGE => 'random player within %4$sm', - SAI_TARGET_PLAYER_DISTANCE => 'random player within %4$sm', - SAI_TARGET_CLOSEST_CREATURE => 'closest (%3$d)?dead:alive; (%1$d)?[npc=%1$d]:arbitrary creature; within %4$sm', -/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'closest (%1$d)?[object=%1$d]:arbitrary gameobject; within %4$sm', + SAI_TARGET_PLAYER_RANGE => 'random player within %11$sm', + SAI_TARGET_PLAYER_DISTANCE => 'random player within %11$sm', + SAI_TARGET_CLOSEST_CREATURE => 'closest (%3$d)?dead:alive; (%1$d)?[npc=%1$d]:arbitrary creature; within %11$sm', +/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'closest (%1$d)?[object=%1$d]:arbitrary gameobject; within %11$sm', SAI_TARGET_CLOSEST_PLAYER => 'closest player within %1$dm', SAI_TARGET_ACTION_INVOKER_VEHICLE => 'Invokers vehicle', SAI_TARGET_OWNER_OR_SUMMONER => 'Invokers owner or summoner', @@ -682,7 +694,8 @@ SAI_TARGET_CLOSEST_FRIENDLY => 'closest friendly (%2$d)?player:creature; within %1$dm', SAI_TARGET_LOOT_RECIPIENTS => 'all players eligible for loot', SAI_TARGET_FARTHEST => 'furthest engaged (%2$d)?player:creature; within %1$dm(%3$d)? and line of sight:;', - SAI_TARGET_VEHICLE_ACCESSORY => 'accessory in Invokers vehicle in seat %1$d' + SAI_TARGET_VEHICLE_PASSENGER => 'accessory in Invokers vehicle in (%1$d)?seat %11$s:all seats;', +/*30*/ SAI_TARGET_CLOSEST_UNSPAWNED_GO => 'closest unspawned (%1$d)?[object=%1$d]:, arbitrary gameobject; within %11$sm' ), 'castFlags' => array( SAI_CAST_FLAG_INTERRUPT_PREV => 'Interrupt current cast', @@ -690,6 +703,11 @@ SAI_CAST_FLAG_AURA_MISSING => 'Aura missing', SAI_CAST_FLAG_COMBAT_MOVE => 'Combat movement' ), + 'spawnFlags' => array( + SAI_SPAWN_FLAG_IGNORE_RESPAWN => 'Override and reset respawn timer', + SAI_SPAWN_FLAG_FORCE_SPAWN => 'Force spawn if already in world', + SAI_SPAWN_FLAG_NOSAVE_RESPAWN => 'Remove respawn time on despawn' + ), 'GOStates' => ['active', 'ready', 'active alternative'], 'summonTypes' => [null, 'Despawn timed or when corpse disappears', 'Despawn timed or when dying', 'Despawn timed', 'Despawn timed out of combat', 'Despawn when dying', 'Despawn timed after death', 'Despawn when corpse disappears', 'Despawn manually'], 'aiTpl' => ['basic AI', 'spell caster', 'turret', 'passive creature', 'cage for creature', 'caged creature'], @@ -697,14 +715,18 @@ 'sheaths' => ['all', 'melee', 'ranged'], 'saiUpdate' => ['out of combat', 'in combat', 'always'], 'lootStates' => ['Not ready', 'Ready', 'Activated', 'Just Deactivated'], + 'weatherStates' => ['Fine', 'Fog', 'Drizzle', 'Light Rain', 'Medium Rain', 'Heavy Rain', 'Light Snow', 'Medium Snow', 'Heavy Snow', 22 => 'Light Sandstorm', 41=> 'Medium Sandstorm', 42 => 'Heavy Sandstorm', 86 => 'Thunders', 90 => 'Black Rain', 106 => 'Black Snow'], + + 'GOStateUNK' => '[span class=q10]unknown gameobject state #[b class=q1]%d[/b][/span]', + 'summonTypeUNK' => '[span class=q10]unknown SummonType #[b class=q1]%d[/b][/span]', + 'aiTplUNK' => '[span class=q10]unknown AI-Template #[b class=q1]%d[/b][/span]', + 'reactStateUNK' => '[span class=q10]unknown ReactState #[b class=q1]%d[/b][/span]', + 'sheathUNK' => '[span class=q10]unknown sheath #[b class=q1]%d[/b][/span]', + 'saiUpdateUNK' => '[span class=q10]unknown update condition #[b class=q1]%d[/b][/span]', + 'lootStateUNK' => '[span class=q10]unknown loot state #[b class=q1]%d[/b][/span]', + 'weatherStateUNK' => '[span class=q10]unknown weather state #[b class=q1]%d[/b][/span]', - 'GOStateUNK' => '[span class=q10]unknown gameobject state #[b class=q1]%d[/b][/span]', - 'summonTypeUNK' => '[span class=q10]unknown SummonType #[b class=q1]%d[/b][/span]', - 'aiTplUNK' => '[span class=q10]unknown AI-Template #[b class=q1]%d[/b][/span]', - 'reactStateUNK' => '[span class=q10]unknown ReactState #[b class=q1]%d[/b][/span]', - 'sheathUNK' => '[span class=q10]unknown sheath #[b class=q1]%d[/b][/span]', - 'saiUpdateUNK' => '[span class=q10]unknown update condition #[b class=q1]%d[/b][/span]', - 'lootStateUNK' => '[span class=q10]unknown loot state #[b class=q1]%d[/b][/span]', + 'entityUNK' => '[b class=q10]unknown entity[/b]', 'empty' => '[span class=q0][/span]' ), diff --git a/localization/locale_ruru.php b/localization/locale_ruru.php index 9772f27de..4f8f82fb7 100644 --- a/localization/locale_ruru.php +++ b/localization/locale_ruru.php @@ -79,7 +79,7 @@ 'links' => "Ссылки", 'compare' => "Сравнить", 'view3D' => "Посмотреть в 3D", - 'findUpgrades' => "Найти лучше...", + 'findUpgrades' => "Найти лучше…", // misc Tools 'errPageTitle' => "Страница не найдена", @@ -431,27 +431,27 @@ 'eventUNK' => '[span class=q10]Unknwon event #[b class=q1]%d[/b] in use.[/span]', 'eventTT' => '[b class=q1]EventType %d[/b][br][table][tr][td]PhaseMask[/td][td=header]0x%04X[/td][/tr][tr][td]Chance[/td][td=header]%d%%%%[/td][/tr][tr][td]Flags[/td][td=header]0x%04X[/td][/tr][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]Param5[/td][td=header]%d[/td][/tr][/table]', 'events' => array( - SAI_EVENT_UPDATE_IC => ['(%7$d)?:When in combat, ;(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_UPDATE_OOC => ['(%7$d)?:When out of combat, ;(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_HEALT_PCT => ['At %6$s%% Health', 'Repeat every %s'], - SAI_EVENT_MANA_PCT => ['At %6$s%% Mana', 'Repeat every %s'], + SAI_EVENT_UPDATE_IC => ['(%12$d)?:When in combat, ;(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_UPDATE_OOC => ['(%12$d)?:When out of combat, ;(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_HEALTH_PCT => ['At %11$s%% Health', 'Repeat every %s'], + SAI_EVENT_MANA_PCT => ['At %11$s%% Mana', 'Repeat every %s'], SAI_EVENT_AGGRO => ['On Aggro', null], SAI_EVENT_KILL => ['On killing (%3$d)?player:;(%4$d)?[npc=%4$d]:any creature;', 'Cooldown: %s'], SAI_EVENT_DEATH => ['On death', null], SAI_EVENT_EVADE => ['When evading', null], - SAI_EVENT_SPELLHIT => ['When hit by (%6$s)?%6$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], - SAI_EVENT_RANGE => ['On target at %6$sm', 'Repeat every %s'], + SAI_EVENT_SPELLHIT => ['When hit by (%11$s)?%11$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], + SAI_EVENT_RANGE => ['On target at %11$sm', 'Repeat every %s'], /* 10*/ SAI_EVENT_OOC_LOS => ['While out of combat, (%1$d)?friendly:hostile; (%5$d)?player:unit; enters line of sight within %2$dm', 'Cooldown: %s'], SAI_EVENT_RESPAWN => ['On respawn', null], - SAI_EVENT_TARGET_HEALTH_PCT => ['On target at %6$s%% health', 'Repeat every %s'], + SAI_EVENT_TARGET_HEALTH_PCT => ['On target at %11$s%% health', 'Repeat every %s'], SAI_EVENT_VICTIM_CASTING => ['Current target is casting (%3$d)?[spell=%3$d]:any spell;', 'Repeat every %s'], SAI_EVENT_FRIENDLY_HEALTH => ['Friendly NPC within %2$dm is at %1$d health', 'Repeat every %s'], SAI_EVENT_FRIENDLY_IS_CC => ['Friendly NPC within %1$dm is crowd controlled', 'Repeat every %s'], SAI_EVENT_FRIENDLY_MISSING_BUFF => ['Friendly NPC within %2$dm is missing [spell=%1$d]', 'Repeat every %s'], SAI_EVENT_SUMMONED_UNIT => ['Just summoned (%1$d)?[npc=%1$d]:any creature;', 'Cooldown: %s'], - SAI_EVENT_TARGET_MANA_PCT => ['On target at %6$s%% mana', 'Repeat every %s'], - SAI_EVENT_ACCEPTED_QUEST => ['Giving (%1$d)?[quest=%1$d]:any quest;', null], -/* 20*/ SAI_EVENT_REWARD_QUEST => ['Rewarding (%1$d)?[quest=%1$d]:any quest;', null], + SAI_EVENT_TARGET_MANA_PCT => ['On target at %11$s%% mana', 'Repeat every %s'], + SAI_EVENT_ACCEPTED_QUEST => ['Giving (%1$d)?[quest=%1$d]:any quest;', 'Cooldown: %s'], +/* 20*/ SAI_EVENT_REWARD_QUEST => ['Rewarding (%1$d)?[quest=%1$d]:any quest;', 'Cooldown: %s'], SAI_EVENT_REACHED_HOME => ['Arriving at home coordinates', null], SAI_EVENT_RECEIVE_EMOTE => ['Being targeted with [emote=%1$d]', 'Cooldown: %s'], SAI_EVENT_HAS_AURA => ['(%2$d)?Having %2$d stacks of:Missing aura; [spell=%1$d]', 'Repeat every %s'], @@ -462,9 +462,9 @@ SAI_EVENT_PASSENGER_REMOVED => ['A passenger got off', 'Cooldown: %s'], SAI_EVENT_CHARMED => ['(%1$d)?On being charmed:On charm wearing off;', null], /* 30*/ SAI_EVENT_CHARMED_TARGET => ['When charming #target#', null], - SAI_EVENT_SPELLHIT_TARGET => ['When #target# gets hit by (%6$s)?%6$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], - SAI_EVENT_DAMAGED => ['After taking %6$s points of damage', 'Repeat every %s'], - SAI_EVENT_DAMAGED_TARGET => ['After #target# took %6$s points of damage', 'Repeat every %s'], + SAI_EVENT_SPELLHIT_TARGET => ['When #target# gets hit by (%11$s)?%11$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], + SAI_EVENT_DAMAGED => ['After taking %11$s points of damage', 'Repeat every %s'], + SAI_EVENT_DAMAGED_TARGET => ['After #target# took %11$s points of damage', 'Repeat every %s'], SAI_EVENT_MOVEMENTINFORM => ['Started moving to point #[b]%2$d[/b](%1$d)? using MotionType #[b]%1$d[/b]:;', null], SAI_EVENT_SUMMON_DESPAWNED => ['Summoned [npc=%1$d] despawned', 'Cooldown: %s'], SAI_EVENT_CORPSE_REMOVED => ['On corpse despawn', null], @@ -484,20 +484,20 @@ /* 50*/ null, null, SAI_EVENT_TEXT_OVER => ['(%2$d)?[npc=%2$d]:any creature; is done talking TextGroup #[b]%1$d[/b]', null], - SAI_EVENT_RECEIVE_HEAL => ['Received %6$s points of healing', 'Cooldown: %s'], + SAI_EVENT_RECEIVE_HEAL => ['Received %11$s points of healing', 'Cooldown: %s'], SAI_EVENT_JUST_SUMMONED => ['On being summoned', null], SAI_EVENT_WAYPOINT_PAUSED => ['Pausing path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_RESUMED => ['Resuming path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_STOPPED => ['Stopping path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_ENDED => ['Ending current path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_TIMED_EVENT_TRIGGERED => ['Timed event #[b]%1$d[/b] is triggered', null], -/* 60*/ SAI_EVENT_UPDATE => ['(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_LINK => ['After Event %6$s', null], - SAI_EVENT_GOSSIP_SELECT => ['Selecting Gossip Option:[br](%6$s)?[span class=q1]%6$s[/span]:Menu #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], +/* 60*/ SAI_EVENT_UPDATE => ['(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_LINK => ['After Event %11$s', null], + SAI_EVENT_GOSSIP_SELECT => ['Selecting Gossip Option:[br](%11$s)?[span class=q1]%11$s[/span]:Menu #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], SAI_EVENT_JUST_CREATED => ['On being spawned for the first time', null], - SAI_EVENT_GOSSIP_HELLO => ['Opening Gossip', null], + SAI_EVENT_GOSSIP_HELLO => ['Opening Gossip', '(%1$d)?onGossipHello:;(%2$d)?onReportUse:;'], SAI_EVENT_FOLLOW_COMPLETED => ['Finished following', null], - SAI_EVENT_EVENT_PHASE_CHANGE => ['Event Phase changed and matches %6$s', null], + SAI_EVENT_EVENT_PHASE_CHANGE => ['Event Phase changed and matches %11$s', null], SAI_EVENT_IS_BEHIND_TARGET => ['Facing the backside of #target#', 'Cooldown: %s'], SAI_EVENT_GAME_EVENT_START => ['[event=%1$d] started', null], SAI_EVENT_GAME_EVENT_END => ['[event=%1$d] ended', null], @@ -505,9 +505,9 @@ SAI_EVENT_GO_EVENT_INFORM => ['Taxi path event #[b]%1$d[/b] trigered', null], SAI_EVENT_ACTION_DONE => ['Executed action #[b]%1$d[/b] requested by script', null], SAI_EVENT_ON_SPELLCLICK => ['Spellclick triggered', null], - SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Health of #target# is at %6$s%%', 'Repeat every %s'], - SAI_EVENT_DISTANCE_CREATURE => ['[npc=%6$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], - SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%6$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], + SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Health of #target# is at %12$s%%', 'Repeat every %s'], + SAI_EVENT_DISTANCE_CREATURE => ['[npc=%11$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], + SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%11$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], SAI_EVENT_COUNTER_SET => ['Counter #[b]%1$d[/b] is equal to [b]%2$d[/b]', null], ), 'eventFlags' => array( @@ -525,7 +525,7 @@ null, SAI_ACTION_TALK => ['(%3$d)?Say:#target# says; (%7$d)?TextGroup:[span class=q10]unknown text[/span]; #[b]%1$d[/b] to #target#%8$s', 'Duration: %s'], SAI_ACTION_SET_FACTION => ['(%1$d)?Set faction of #target# to [faction=%7$d]:Reset faction of #target#;.', null], - SAI_ACTION_MORPH_TO_ENTRY_OR_MODEL => ['(%7$d)?Reset apperance.:Take the appearance of;(%1$d)?[npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], + SAI_ACTION_MORPH_TO_ENTRY_OR_MODEL => ['(%7$d)?Reset apperance.:Take the appearance of;(%1$d)? [npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], SAI_ACTION_SOUND => ['Play sound(%2$d)? to invoking player:;:[div float=right width=270px][sound=%1$d][/div]', 'Played by environment.'], SAI_ACTION_PLAY_EMOTE => ['Emote [emote=%1$d] to #target#.', null], SAI_ACTION_FAIL_QUEST => ['Fail [quest=%1$d] for #target#.', null], @@ -545,20 +545,20 @@ SAI_ACTION_ALLOW_COMBAT_MOVEMENT => ['(%1$d)?Enable:Disable; combat movement.', null], SAI_ACTION_SET_EVENT_PHASE => ['Set Event Phase of #target# to [b]%1$d[/b].', null], SAI_ACTION_INC_EVENT_PHASE => ['(%1$d)?Increment:Decrement; Event Phase of #target#.', null], - SAI_ACTION_EVADE => ['#target# enters Evade Mode.', null], + SAI_ACTION_EVADE => ['#target# evades to (%1$d)?last stored:respawn; position.', null], SAI_ACTION_FLEE_FOR_ASSIST => ['Flee for assistance.', 'Use default flee emote'], SAI_ACTION_CALL_GROUPEVENTHAPPENS => ['Satisfy objective of [quest=%1$d] for #target#.', null], SAI_ACTION_COMBAT_STOP => ['End current combat.', null], - SAI_ACTION_REMOVEAURASFROMSPELL => ['Remove (%1$d)?all auras:auras of [spell=%1$d]; from #target#.', null], + SAI_ACTION_REMOVEAURASFROMSPELL => ['Remove (%1$d)?all auras:auras of [spell=%1$d]; from #target#.', 'Only own auras'], SAI_ACTION_FOLLOW => ['Follow #target#(%1$d)? at %1$dm distance:;(%3$d)? until reaching [npc=%3$d]:;.', '(%7$d)?Angle: %7$.2f°:;(%8$d)? Some form of Quest Credit is given:;'], /* 30*/ SAI_ACTION_RANDOM_PHASE => ['Pick random Event Phase from %7$s.', null], SAI_ACTION_RANDOM_PHASE_RANGE => ['Pick random Event Phase between %1$d and %2$d.', null], SAI_ACTION_RESET_GOBJECT => ['Reset #target#.', null], SAI_ACTION_CALL_KILLEDMONSTER => ['A kill of [npc=%1$d] is credited to #target#.', null], SAI_ACTION_SET_INST_DATA => ['Set Instance (%3$d)?Boss State:Data Field; #[b]%1$d[/b] to [b]%2$d[/b].', null], - null, + null, // SMART_ACTION_SET_INST_DATA64 = 35 SAI_ACTION_UPDATE_TEMPLATE => ['Transform to become [npc=%1$d](%2$d)? with level [b]%2$d[/b]:;.', null], - SAI_ACTION_DIE => ['Die...   painfully.', null], + SAI_ACTION_DIE => ['Die…   painfully.', null], SAI_ACTION_SET_IN_COMBAT_WITH_ZONE => ['Set in combat with units in zone.', null], SAI_ACTION_CALL_FOR_HELP => ['Call for help.', 'Use default help emote'], /* 40*/ SAI_ACTION_SET_SHEATH => ['Sheath %7$s weapons.', null], @@ -567,7 +567,7 @@ SAI_ACTION_MOUNT_TO_ENTRY_OR_MODEL => ['(%7$d)?Dismount.:Mount ;(%1$d)?[npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], SAI_ACTION_SET_INGAME_PHASE_MASK => ['Set visibility of #target# to phase %7$s.', null], SAI_ACTION_SET_DATA => ['[b]%2$d[/b] is stored in data field #[b]%1$d[/b] of #target#.', null], - null, + SAI_ACTION_ATTACK_STOP => ['Stop attacking.', null], SAI_ACTION_SET_VISIBILITY => ['#target# becomes (%1$d)?visible:invisible;.', null], SAI_ACTION_SET_ACTIVE => ['#target# becomes Grid (%1$d)?active:inactive;.', null], SAI_ACTION_ATTACK_START => ['Start attacking #target#.', null], @@ -606,7 +606,7 @@ SAI_ACTION_ADD_NPC_FLAG => ['Add %7$s npc flags to #target#.', null], SAI_ACTION_REMOVE_NPC_FLAG => ['Remove %7$s npc flags from #target#.', null], SAI_ACTION_SIMPLE_TALK => ['#target# says (%7$s)?TextGroup:[span class=q10]unknown text[/span]; #[b]%1$d[/b] to #target#%7$s', null], - SAI_ACTION_INVOKER_CAST => ['Invoker casts [spell=%1$d] at #target#.', null], + SAI_ACTION_SELF_CAST => ['Self casts [spell=%1$d] at #target#.', null], SAI_ACTION_CROSS_CAST => ['%7$s casts [spell=%1$d] at #target#.', null], SAI_ACTION_CALL_RANDOM_TIMED_ACTIONLIST => ['Call Timed Actionlist at random: [html]%7$s[/html]', null], SAI_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST => ['Call Timed Actionlist at random from range: [html]%7$s[/html]', null], @@ -648,7 +648,19 @@ SAI_ACTION_LOAD_EQUIPMENT => ['(%2$d)?Unequip non-standard items:Equip %7$s; from equipment template #[b]%1$d[/b] on #target#.', 'Note: creature items do not necessarily have an item template'], SAI_ACTION_TRIGGER_RANDOM_TIMED_EVENT => ['Trigger previously defined timed event in id range %7$s.', null], SAI_ACTION_REMOVE_ALL_GAMEOBJECTS => ['Remove all gameobjects owned by #target#.', null], - SAI_ACTION_STOP_MOTION => ['(%1$d)?Remove motion type #[b]%1$d[/b] from #target#. :;(%2$d)?Stop moving.:;', null], + SAI_ACTION_PAUSE_MOVEMENT => ['Pause movement from slot #[b]%1$d[/b] for %7$s.', 'Forced'], + null, // SAI_ACTION_PLAY_ANIMKIT = 128, // don't use on 3.3.5a + null, // SAI_ACTION_SCENE_PLAY = 129, // don't use on 3.3.5a +/*130*/ null, // SAI_ACTION_SCENE_CANCEL = 130, // don't use on 3.3.5a + SAI_ACTION_SPAWN_SPAWNGROUP => ['Spawn SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Cooldown: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_DESPAWN_SPAWNGROUP => ['Despawn SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Cooldown: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_RESPAWN_BY_SPAWNID => ['Respawn %7$s [small class=q0](GUID: %2$d)[/small]', null], // spawnType, spawnId + SAI_ACTION_INVOKER_CAST => ['Invoker casts [spell=%1$d] at #target#.', null], // spellID, castFlags + SAI_ACTION_PLAY_CINEMATIC => ['Play cinematic #[b]%1$d[/b] for #target#', null], // cinematic + SAI_ACTION_SET_MOVEMENT_SPEED => ['Set speed of MotionType #[b]%1$d[/b] to [b]%7$.2f[/b]', null], // movementType, speedInteger, speedFraction + null, // SAI_ACTION_PLAY_SPELL_VISUAL_KIT', // spellVisualKitId (RESERVED, PENDING CHERRYPICK) + SAI_ACTION_OVERRIDE_LIGHT => ['Change skybox in [zone=%1$d] to #[b]%2$d[/b].', 'Transition: %s'], // zoneId, overrideLightID, transitionMilliseconds + SAI_ACTION_OVERRIDE_WEATHER => ['Change weather in [zone=%1$d] to %7$s at %3$d%% intensity.', null], // zoneId, weatherId, intensity ), 'targetUNK' => '[span class=q10]unknown target #[b class=q1]%d[/b][/span]', 'targetTT' => '[b class=q1]TargetType %d[/b][br][table][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]X[/td][td=header]%.2f[/td][/tr][tr][td]Y[/td][td=header]%.2f[/td][/tr][tr][td]Z[/td][td=header]%.2f[/td][/tr][tr][td]O[/td][td=header]%.2f[/td][/tr][/table]', @@ -662,18 +674,18 @@ SAI_TARGET_HOSTILE_RANDOM_NOT_TOP => 'random non-tank target', SAI_TARGET_ACTION_INVOKER => 'Invoker', SAI_TARGET_POSITION => 'world coordinates', - SAI_TARGET_CREATURE_RANGE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %4$sm', -/*10*/ SAI_TARGET_CREATURE_GUID => '(%4$d)?[npc=%4$d]:NPC; with GUID #%1$d', - SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %4$sm', + SAI_TARGET_CREATURE_RANGE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %11$sm(%4$d)? (max. %4$d targets):;', +/*10*/ SAI_TARGET_CREATURE_GUID => '(%11$d)?[npc=%11$d]:NPC; with GUID #%1$d', + SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %11$sm(%3$d)? (max. %3$d targets):;', SAI_TARGET_STORED => 'previously stored targets', - SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %4$sm', - SAI_TARGET_GAMEOBJECT_GUID => '(%4$d)?[object=%4$d]:gameobject; with GUID #%1$d', - SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %4$sm', + SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %11$sm(%4$d)? (max. %4$d targets):;', + SAI_TARGET_GAMEOBJECT_GUID => '(%11$d)?[object=%11$d]:gameobject; with GUID #%1$d', + SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %11$sm(%3$d)? (max. %3$d targets):;', SAI_TARGET_INVOKER_PARTY => 'Invokers party', - SAI_TARGET_PLAYER_RANGE => 'random player within %4$sm', - SAI_TARGET_PLAYER_DISTANCE => 'random player within %4$sm', - SAI_TARGET_CLOSEST_CREATURE => 'closest (%3$d)?dead:alive; (%1$d)?[npc=%1$d]:arbitrary creature; within %4$sm', -/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'closest (%1$d)?[object=%1$d]:arbitrary gameobject; within %4$sm', + SAI_TARGET_PLAYER_RANGE => 'random player within %11$sm', + SAI_TARGET_PLAYER_DISTANCE => 'random player within %11$sm', + SAI_TARGET_CLOSEST_CREATURE => 'closest (%3$d)?dead:alive; (%1$d)?[npc=%1$d]:arbitrary creature; within %11$sm', +/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'closest (%1$d)?[object=%1$d]:arbitrary gameobject; within %11$sm', SAI_TARGET_CLOSEST_PLAYER => 'closest player within %1$dm', SAI_TARGET_ACTION_INVOKER_VEHICLE => 'Invokers vehicle', SAI_TARGET_OWNER_OR_SUMMONER => 'Invokers owner or summoner', @@ -682,7 +694,8 @@ SAI_TARGET_CLOSEST_FRIENDLY => 'closest friendly (%2$d)?player:creature; within %1$dm', SAI_TARGET_LOOT_RECIPIENTS => 'all players eligible for loot', SAI_TARGET_FARTHEST => 'furthest engaged (%2$d)?player:creature; within %1$dm(%3$d)? and line of sight:;', - SAI_TARGET_VEHICLE_ACCESSORY => 'accessory in Invokers vehicle in seat %1$d' + SAI_TARGET_VEHICLE_PASSENGER => 'accessory in Invokers vehicle in (%1$d)?seat %11$s:all seats;', +/*30*/ SAI_TARGET_CLOSEST_UNSPAWNED_GO => 'closest unspawned (%1$d)?[object=%1$d]:, arbitrary gameobject; within %11$sm' ), 'castFlags' => array( SAI_CAST_FLAG_INTERRUPT_PREV => 'Interrupt current cast', @@ -690,6 +703,11 @@ SAI_CAST_FLAG_AURA_MISSING => 'Aura missing', SAI_CAST_FLAG_COMBAT_MOVE => 'Combat movement' ), + 'spawnFlags' => array( + SAI_SPAWN_FLAG_IGNORE_RESPAWN => 'Override and reset respawn timer', + SAI_SPAWN_FLAG_FORCE_SPAWN => 'Force spawn if already in world', + SAI_SPAWN_FLAG_NOSAVE_RESPAWN => 'Remove respawn time on despawn' + ), 'GOStates' => ['active', 'ready', 'active alternative'], 'summonTypes' => [null, 'Despawn timed or when corpse disappears', 'Despawn timed or when dying', 'Despawn timed', 'Despawn timed out of combat', 'Despawn when dying', 'Despawn timed after death', 'Despawn when corpse disappears', 'Despawn manually'], 'aiTpl' => ['basic AI', 'spell caster', 'turret', 'passive creature', 'cage for creature', 'caged creature'], @@ -697,14 +715,18 @@ 'sheaths' => ['all', 'melee', 'ranged'], 'saiUpdate' => ['out of combat', 'in combat', 'always'], 'lootStates' => ['Not ready', 'Ready', 'Activated', 'Just Deactivated'], + 'weatherStates' => ['Fine', 'Fog', 'Drizzle', 'Light Rain', 'Medium Rain', 'Heavy Rain', 'Light Snow', 'Medium Snow', 'Heavy Snow', 22 => 'Light Sandstorm', 41=> 'Medium Sandstorm', 42 => 'Heavy Sandstorm', 86 => 'Thunders', 90 => 'Black Rain', 106 => 'Black Snow'], + + 'GOStateUNK' => '[span class=q10]unknown gameobject state #[b class=q1]%d[/b][/span]', + 'summonTypeUNK' => '[span class=q10]unknown SummonType #[b class=q1]%d[/b][/span]', + 'aiTplUNK' => '[span class=q10]unknown AI-Template #[b class=q1]%d[/b][/span]', + 'reactStateUNK' => '[span class=q10]unknown ReactState #[b class=q1]%d[/b][/span]', + 'sheathUNK' => '[span class=q10]unknown sheath #[b class=q1]%d[/b][/span]', + 'saiUpdateUNK' => '[span class=q10]unknown update condition #[b class=q1]%d[/b][/span]', + 'lootStateUNK' => '[span class=q10]unknown loot state #[b class=q1]%d[/b][/span]', + 'weatherStateUNK' => '[span class=q10]unknown weather state #[b class=q1]%d[/b][/span]', - 'GOStateUNK' => '[span class=q10]unknown gameobject state #[b class=q1]%d[/b][/span]', - 'summonTypeUNK' => '[span class=q10]unknown SummonType #[b class=q1]%d[/b][/span]', - 'aiTplUNK' => '[span class=q10]unknown AI-Template #[b class=q1]%d[/b][/span]', - 'reactStateUNK' => '[span class=q10]unknown ReactState #[b class=q1]%d[/b][/span]', - 'sheathUNK' => '[span class=q10]unknown sheath #[b class=q1]%d[/b][/span]', - 'saiUpdateUNK' => '[span class=q10]unknown update condition #[b class=q1]%d[/b][/span]', - 'lootStateUNK' => '[span class=q10]unknown loot state #[b class=q1]%d[/b][/span]', + 'entityUNK' => '[b class=q10]unknown entity[/b]', 'empty' => '[span class=q0][/span]' ), diff --git a/localization/locale_zhcn.php b/localization/locale_zhcn.php index e96262caf..eb0ba2f9b 100644 --- a/localization/locale_zhcn.php +++ b/localization/locale_zhcn.php @@ -431,27 +431,27 @@ 'eventUNK' => '[span class=q10]Unknwon event #[b class=q1]%d[/b] in use.[/span]', 'eventTT' => '[b class=q1]EventType %d[/b][br][table][tr][td]PhaseMask[/td][td=header]0x%04X[/td][/tr][tr][td]Chance[/td][td=header]%d%%%%[/td][/tr][tr][td]Flags[/td][td=header]0x%04X[/td][/tr][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]Param5[/td][td=header]%d[/td][/tr][/table]', 'events' => array( - SAI_EVENT_UPDATE_IC => ['(%7$d)?:When in combat, ;(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_UPDATE_OOC => ['(%7$d)?:When out of combat, ;(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_HEALT_PCT => ['At %6$s%% Health', 'Repeat every %s'], - SAI_EVENT_MANA_PCT => ['At %6$s%% Mana', 'Repeat every %s'], + SAI_EVENT_UPDATE_IC => ['(%12$d)?:When in combat, ;(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_UPDATE_OOC => ['(%12$d)?:When out of combat, ;(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_HEALTH_PCT => ['At %11$s%% Health', 'Repeat every %s'], + SAI_EVENT_MANA_PCT => ['At %11$s%% Mana', 'Repeat every %s'], SAI_EVENT_AGGRO => ['On Aggro', null], SAI_EVENT_KILL => ['On killing (%3$d)?player:;(%4$d)?[npc=%4$d]:any creature;', 'Cooldown: %s'], SAI_EVENT_DEATH => ['On death', null], SAI_EVENT_EVADE => ['When evading', null], - SAI_EVENT_SPELLHIT => ['When hit by (%6$s)?%6$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], - SAI_EVENT_RANGE => ['On target at %6$sm', 'Repeat every %s'], + SAI_EVENT_SPELLHIT => ['When hit by (%11$s)?%11$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], + SAI_EVENT_RANGE => ['On target at %11$sm', 'Repeat every %s'], /* 10*/ SAI_EVENT_OOC_LOS => ['While out of combat, (%1$d)?friendly:hostile; (%5$d)?player:unit; enters line of sight within %2$dm', 'Cooldown: %s'], SAI_EVENT_RESPAWN => ['On respawn', null], - SAI_EVENT_TARGET_HEALTH_PCT => ['On target at %6$s%% health', 'Repeat every %s'], + SAI_EVENT_TARGET_HEALTH_PCT => ['On target at %11$s%% health', 'Repeat every %s'], SAI_EVENT_VICTIM_CASTING => ['Current target is casting (%3$d)?[spell=%3$d]:any spell;', 'Repeat every %s'], SAI_EVENT_FRIENDLY_HEALTH => ['Friendly NPC within %2$dm is at %1$d health', 'Repeat every %s'], SAI_EVENT_FRIENDLY_IS_CC => ['Friendly NPC within %1$dm is crowd controlled', 'Repeat every %s'], SAI_EVENT_FRIENDLY_MISSING_BUFF => ['Friendly NPC within %2$dm is missing [spell=%1$d]', 'Repeat every %s'], SAI_EVENT_SUMMONED_UNIT => ['Just summoned (%1$d)?[npc=%1$d]:any creature;', 'Cooldown: %s'], - SAI_EVENT_TARGET_MANA_PCT => ['On target at %6$s%% mana', 'Repeat every %s'], - SAI_EVENT_ACCEPTED_QUEST => ['Giving (%1$d)?[quest=%1$d]:any quest;', null], -/* 20*/ SAI_EVENT_REWARD_QUEST => ['Rewarding (%1$d)?[quest=%1$d]:any quest;', null], + SAI_EVENT_TARGET_MANA_PCT => ['On target at %11$s%% mana', 'Repeat every %s'], + SAI_EVENT_ACCEPTED_QUEST => ['Giving (%1$d)?[quest=%1$d]:any quest;', 'Cooldown: %s'], +/* 20*/ SAI_EVENT_REWARD_QUEST => ['Rewarding (%1$d)?[quest=%1$d]:any quest;', 'Cooldown: %s'], SAI_EVENT_REACHED_HOME => ['Arriving at home coordinates', null], SAI_EVENT_RECEIVE_EMOTE => ['Being targeted with [emote=%1$d]', 'Cooldown: %s'], SAI_EVENT_HAS_AURA => ['(%2$d)?Having %2$d stacks of:Missing aura; [spell=%1$d]', 'Repeat every %s'], @@ -462,9 +462,9 @@ SAI_EVENT_PASSENGER_REMOVED => ['A passenger got off', 'Cooldown: %s'], SAI_EVENT_CHARMED => ['(%1$d)?On being charmed:On charm wearing off;', null], /* 30*/ SAI_EVENT_CHARMED_TARGET => ['When charming #target#', null], - SAI_EVENT_SPELLHIT_TARGET => ['When #target# gets hit by (%6$s)?%6$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], - SAI_EVENT_DAMAGED => ['After taking %6$s points of damage', 'Repeat every %s'], - SAI_EVENT_DAMAGED_TARGET => ['After #target# took %6$s points of damage', 'Repeat every %s'], + SAI_EVENT_SPELLHIT_TARGET => ['When #target# gets hit by (%11$s)?%11$s :;(%1$d)?[spell=%1$d]:Spell;', 'Cooldown: %s'], + SAI_EVENT_DAMAGED => ['After taking %11$s points of damage', 'Repeat every %s'], + SAI_EVENT_DAMAGED_TARGET => ['After #target# took %11$s points of damage', 'Repeat every %s'], SAI_EVENT_MOVEMENTINFORM => ['Started moving to point #[b]%2$d[/b](%1$d)? using MotionType #[b]%1$d[/b]:;', null], SAI_EVENT_SUMMON_DESPAWNED => ['Summoned [npc=%1$d] despawned', 'Cooldown: %s'], SAI_EVENT_CORPSE_REMOVED => ['On corpse despawn', null], @@ -484,20 +484,20 @@ /* 50*/ null, null, SAI_EVENT_TEXT_OVER => ['(%2$d)?[npc=%2$d]:any creature; is done talking TextGroup #[b]%1$d[/b]', null], - SAI_EVENT_RECEIVE_HEAL => ['Received %6$s points of healing', 'Cooldown: %s'], + SAI_EVENT_RECEIVE_HEAL => ['Received %11$s points of healing', 'Cooldown: %s'], SAI_EVENT_JUST_SUMMONED => ['On being summoned', null], SAI_EVENT_WAYPOINT_PAUSED => ['Pausing path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_RESUMED => ['Resuming path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_STOPPED => ['Stopping path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_WAYPOINT_ENDED => ['Ending current path on (%1$d)?waypoint #[b]%1$d[/b]:any waypoint;(%2$d)? on path #[b]%2$d[/b]:;', null], SAI_EVENT_TIMED_EVENT_TRIGGERED => ['Timed event #[b]%1$d[/b] is triggered', null], -/* 60*/ SAI_EVENT_UPDATE => ['(%6$s)?After %6$s:Instantly;', 'Repeat every %s'], - SAI_EVENT_LINK => ['After Event %6$s', null], - SAI_EVENT_GOSSIP_SELECT => ['Selecting Gossip Option:[br](%6$s)?[span class=q1]%6$s[/span]:Menu #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], +/* 60*/ SAI_EVENT_UPDATE => ['(%11$s)?After %11$s:Instantly;', 'Repeat every %s'], + SAI_EVENT_LINK => ['After Event %11$s', null], + SAI_EVENT_GOSSIP_SELECT => ['Selecting Gossip Option:[br](%11$s)?[span class=q1]%11$s[/span]:Menu #[b]%1$d[/b] - Option #[b]%2$d[/b];', null], SAI_EVENT_JUST_CREATED => ['On being spawned for the first time', null], - SAI_EVENT_GOSSIP_HELLO => ['Opening Gossip', null], + SAI_EVENT_GOSSIP_HELLO => ['Opening Gossip', '(%1$d)?onGossipHello:;(%2$d)?onReportUse:;'], SAI_EVENT_FOLLOW_COMPLETED => ['Finished following', null], - SAI_EVENT_EVENT_PHASE_CHANGE => ['Event Phase changed and matches %6$s', null], + SAI_EVENT_EVENT_PHASE_CHANGE => ['Event Phase changed and matches %11$s', null], SAI_EVENT_IS_BEHIND_TARGET => ['Facing the backside of #target#', 'Cooldown: %s'], SAI_EVENT_GAME_EVENT_START => ['[event=%1$d] started', null], SAI_EVENT_GAME_EVENT_END => ['[event=%1$d] ended', null], @@ -505,9 +505,9 @@ SAI_EVENT_GO_EVENT_INFORM => ['Taxi path event #[b]%1$d[/b] trigered', null], SAI_EVENT_ACTION_DONE => ['Executed action #[b]%1$d[/b] requested by script', null], SAI_EVENT_ON_SPELLCLICK => ['Spellclick triggered', null], - SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Health of #target# is at %6$s%%', 'Repeat every %s'], - SAI_EVENT_DISTANCE_CREATURE => ['[npc=%6$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], - SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%6$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], + SAI_EVENT_FRIENDLY_HEALTH_PCT => ['Health of #target# is at %12$s%%', 'Repeat every %s'], + SAI_EVENT_DISTANCE_CREATURE => ['[npc=%11$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], + SAI_EVENT_DISTANCE_GAMEOBJECT => ['[object=%11$d](%1$d)? with GUID #%1$d:; enters range at or below %2$dm', 'Repeat every %s'], SAI_EVENT_COUNTER_SET => ['Counter #[b]%1$d[/b] is equal to [b]%2$d[/b]', null], ), 'eventFlags' => array( @@ -525,7 +525,7 @@ null, SAI_ACTION_TALK => ['(%3$d)?Say:#target# says; (%7$d)?TextGroup:[span class=q10]unknown text[/span]; #[b]%1$d[/b] to #target#%8$s', 'Duration: %s'], SAI_ACTION_SET_FACTION => ['(%1$d)?Set faction of #target# to [faction=%7$d]:Reset faction of #target#;.', null], - SAI_ACTION_MORPH_TO_ENTRY_OR_MODEL => ['(%7$d)?Reset apperance.:Take the appearance of;(%1$d)?[npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], + SAI_ACTION_MORPH_TO_ENTRY_OR_MODEL => ['(%7$d)?Reset apperance.:Take the appearance of;(%1$d)? [npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], SAI_ACTION_SOUND => ['Play sound(%2$d)? to invoking player:;:[div float=right width=270px][sound=%1$d][/div]', 'Played by environment.'], SAI_ACTION_PLAY_EMOTE => ['Emote [emote=%1$d] to #target#.', null], SAI_ACTION_FAIL_QUEST => ['Fail [quest=%1$d] for #target#.', null], @@ -545,20 +545,20 @@ SAI_ACTION_ALLOW_COMBAT_MOVEMENT => ['(%1$d)?Enable:Disable; combat movement.', null], SAI_ACTION_SET_EVENT_PHASE => ['Set Event Phase of #target# to [b]%1$d[/b].', null], SAI_ACTION_INC_EVENT_PHASE => ['(%1$d)?Increment:Decrement; Event Phase of #target#.', null], - SAI_ACTION_EVADE => ['#target# enters Evade Mode.', null], + SAI_ACTION_EVADE => ['#target# evades to (%1$d)?last stored:respawn; position.', null], SAI_ACTION_FLEE_FOR_ASSIST => ['Flee for assistance.', 'Use default flee emote'], SAI_ACTION_CALL_GROUPEVENTHAPPENS => ['Satisfy objective of [quest=%1$d] for #target#.', null], SAI_ACTION_COMBAT_STOP => ['End current combat.', null], - SAI_ACTION_REMOVEAURASFROMSPELL => ['Remove (%1$d)?all auras:auras of [spell=%1$d]; from #target#.', null], + SAI_ACTION_REMOVEAURASFROMSPELL => ['Remove (%1$d)?all auras:auras of [spell=%1$d]; from #target#.', 'Only own auras'], SAI_ACTION_FOLLOW => ['Follow #target#(%1$d)? at %1$dm distance:;(%3$d)? until reaching [npc=%3$d]:;.', '(%7$d)?Angle: %7$.2f°:;(%8$d)? Some form of Quest Credit is given:;'], /* 30*/ SAI_ACTION_RANDOM_PHASE => ['Pick random Event Phase from %7$s.', null], SAI_ACTION_RANDOM_PHASE_RANGE => ['Pick random Event Phase between %1$d and %2$d.', null], SAI_ACTION_RESET_GOBJECT => ['Reset #target#.', null], SAI_ACTION_CALL_KILLEDMONSTER => ['A kill of [npc=%1$d] is credited to #target#.', null], SAI_ACTION_SET_INST_DATA => ['Set Instance (%3$d)?Boss State:Data Field; #[b]%1$d[/b] to [b]%2$d[/b].', null], - null, + null, // SMART_ACTION_SET_INST_DATA64 = 35 SAI_ACTION_UPDATE_TEMPLATE => ['Transform to become [npc=%1$d](%2$d)? with level [b]%2$d[/b]:;.', null], - SAI_ACTION_DIE => ['Die...   painfully.', null], + SAI_ACTION_DIE => ['Die…   painfully.', null], SAI_ACTION_SET_IN_COMBAT_WITH_ZONE => ['Set in combat with units in zone.', null], SAI_ACTION_CALL_FOR_HELP => ['Call for help.', 'Use default help emote'], /* 40*/ SAI_ACTION_SET_SHEATH => ['Sheath %7$s weapons.', null], @@ -567,7 +567,7 @@ SAI_ACTION_MOUNT_TO_ENTRY_OR_MODEL => ['(%7$d)?Dismount.:Mount ;(%1$d)?[npc=%1$d].:;(%2$d)?[model npc=%2$d border=1 float=right][/model]:;', null], SAI_ACTION_SET_INGAME_PHASE_MASK => ['Set visibility of #target# to phase %7$s.', null], SAI_ACTION_SET_DATA => ['[b]%2$d[/b] is stored in data field #[b]%1$d[/b] of #target#.', null], - null, + SAI_ACTION_ATTACK_STOP => ['Stop attacking.', null], SAI_ACTION_SET_VISIBILITY => ['#target# becomes (%1$d)?visible:invisible;.', null], SAI_ACTION_SET_ACTIVE => ['#target# becomes Grid (%1$d)?active:inactive;.', null], SAI_ACTION_ATTACK_START => ['Start attacking #target#.', null], @@ -606,7 +606,7 @@ SAI_ACTION_ADD_NPC_FLAG => ['Add %7$s npc flags to #target#.', null], SAI_ACTION_REMOVE_NPC_FLAG => ['Remove %7$s npc flags from #target#.', null], SAI_ACTION_SIMPLE_TALK => ['#target# says (%7$s)?TextGroup:[span class=q10]unknown text[/span]; #[b]%1$d[/b] to #target#%7$s', null], - SAI_ACTION_INVOKER_CAST => ['Invoker casts [spell=%1$d] at #target#.', null], + SAI_ACTION_SELF_CAST => ['Self casts [spell=%1$d] at #target#.', null], SAI_ACTION_CROSS_CAST => ['%7$s casts [spell=%1$d] at #target#.', null], SAI_ACTION_CALL_RANDOM_TIMED_ACTIONLIST => ['Call Timed Actionlist at random: [html]%7$s[/html]', null], SAI_ACTION_CALL_RANDOM_RANGE_TIMED_ACTIONLIST => ['Call Timed Actionlist at random from range: [html]%7$s[/html]', null], @@ -648,7 +648,19 @@ SAI_ACTION_LOAD_EQUIPMENT => ['(%2$d)?Unequip non-standard items:Equip %7$s; from equipment template #[b]%1$d[/b] on #target#.', 'Note: creature items do not necessarily have an item template'], SAI_ACTION_TRIGGER_RANDOM_TIMED_EVENT => ['Trigger previously defined timed event in id range %7$s.', null], SAI_ACTION_REMOVE_ALL_GAMEOBJECTS => ['Remove all gameobjects owned by #target#.', null], - SAI_ACTION_STOP_MOTION => ['(%1$d)?Remove motion type #[b]%1$d[/b] from #target#. :;(%2$d)?Stop moving.:;', null], + SAI_ACTION_PAUSE_MOVEMENT => ['Pause movement from slot #[b]%1$d[/b] for %7$s.', 'Forced'], + null, // SAI_ACTION_PLAY_ANIMKIT = 128, // don't use on 3.3.5a + null, // SAI_ACTION_SCENE_PLAY = 129, // don't use on 3.3.5a +/*130*/ null, // SAI_ACTION_SCENE_CANCEL = 130, // don't use on 3.3.5a + SAI_ACTION_SPAWN_SPAWNGROUP => ['Spawn SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Cooldown: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_DESPAWN_SPAWNGROUP => ['Despawn SpawnGroup [b]%7$s[/b] SpawnFlags: %8$s %9$s', 'Cooldown: %s'], // Group ID, min secs, max secs, spawnflags + SAI_ACTION_RESPAWN_BY_SPAWNID => ['Respawn %7$s [small class=q0](GUID: %2$d)[/small]', null], // spawnType, spawnId + SAI_ACTION_INVOKER_CAST => ['Invoker casts [spell=%1$d] at #target#.', null], // spellID, castFlags + SAI_ACTION_PLAY_CINEMATIC => ['Play cinematic #[b]%1$d[/b] for #target#', null], // cinematic + SAI_ACTION_SET_MOVEMENT_SPEED => ['Set speed of MotionType #[b]%1$d[/b] to [b]%7$.2f[/b]', null], // movementType, speedInteger, speedFraction + null, // SAI_ACTION_PLAY_SPELL_VISUAL_KIT', // spellVisualKitId (RESERVED, PENDING CHERRYPICK) + SAI_ACTION_OVERRIDE_LIGHT => ['Change skybox in [zone=%1$d] to #[b]%2$d[/b].', 'Transition: %s'], // zoneId, overrideLightID, transitionMilliseconds + SAI_ACTION_OVERRIDE_WEATHER => ['Change weather in [zone=%1$d] to %7$s at %3$d%% intensity.', null], // zoneId, weatherId, intensity ), 'targetUNK' => '[span class=q10]unknown target #[b class=q1]%d[/b][/span]', 'targetTT' => '[b class=q1]TargetType %d[/b][br][table][tr][td]Param1[/td][td=header]%d[/td][/tr][tr][td]Param2[/td][td=header]%d[/td][/tr][tr][td]Param3[/td][td=header]%d[/td][/tr][tr][td]Param4[/td][td=header]%d[/td][/tr][tr][td]X[/td][td=header]%.2f[/td][/tr][tr][td]Y[/td][td=header]%.2f[/td][/tr][tr][td]Z[/td][td=header]%.2f[/td][/tr][tr][td]O[/td][td=header]%.2f[/td][/tr][/table]', @@ -662,18 +674,18 @@ SAI_TARGET_HOSTILE_RANDOM_NOT_TOP => 'random non-tank target', SAI_TARGET_ACTION_INVOKER => 'Invoker', SAI_TARGET_POSITION => 'world coordinates', - SAI_TARGET_CREATURE_RANGE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %4$sm', -/*10*/ SAI_TARGET_CREATURE_GUID => '(%4$d)?[npc=%4$d]:NPC; with GUID #%1$d', - SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %4$sm', + SAI_TARGET_CREATURE_RANGE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %11$sm(%4$d)? (max. %4$d targets):;', +/*10*/ SAI_TARGET_CREATURE_GUID => '(%11$d)?[npc=%11$d]:NPC; with GUID #%1$d', + SAI_TARGET_CREATURE_DISTANCE => '(%1$d)?random instance of [npc=%1$d]:arbitrary creature; within %11$sm(%3$d)? (max. %3$d targets):;', SAI_TARGET_STORED => 'previously stored targets', - SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %4$sm', - SAI_TARGET_GAMEOBJECT_GUID => '(%4$d)?[object=%4$d]:gameobject; with GUID #%1$d', - SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %4$sm', + SAI_TARGET_GAMEOBJECT_RANGE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %11$sm(%4$d)? (max. %4$d targets):;', + SAI_TARGET_GAMEOBJECT_GUID => '(%11$d)?[object=%11$d]:gameobject; with GUID #%1$d', + SAI_TARGET_GAMEOBJECT_DISTANCE => '(%1$d)?random instance of [object=%1$d]:arbitrary object; within %11$sm(%3$d)? (max. %3$d targets):;', SAI_TARGET_INVOKER_PARTY => 'Invokers party', - SAI_TARGET_PLAYER_RANGE => 'random player within %4$sm', - SAI_TARGET_PLAYER_DISTANCE => 'random player within %4$sm', - SAI_TARGET_CLOSEST_CREATURE => 'closest (%3$d)?dead:alive; (%1$d)?[npc=%1$d]:arbitrary creature; within %4$sm', -/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'closest (%1$d)?[object=%1$d]:arbitrary gameobject; within %4$sm', + SAI_TARGET_PLAYER_RANGE => 'random player within %11$sm', + SAI_TARGET_PLAYER_DISTANCE => 'random player within %11$sm', + SAI_TARGET_CLOSEST_CREATURE => 'closest (%3$d)?dead:alive; (%1$d)?[npc=%1$d]:arbitrary creature; within %11$sm', +/*20*/ SAI_TARGET_CLOSEST_GAMEOBJECT => 'closest (%1$d)?[object=%1$d]:arbitrary gameobject; within %11$sm', SAI_TARGET_CLOSEST_PLAYER => 'closest player within %1$dm', SAI_TARGET_ACTION_INVOKER_VEHICLE => 'Invokers vehicle', SAI_TARGET_OWNER_OR_SUMMONER => 'Invokers owner or summoner', @@ -682,7 +694,8 @@ SAI_TARGET_CLOSEST_FRIENDLY => 'closest friendly (%2$d)?player:creature; within %1$dm', SAI_TARGET_LOOT_RECIPIENTS => 'all players eligible for loot', SAI_TARGET_FARTHEST => 'furthest engaged (%2$d)?player:creature; within %1$dm(%3$d)? and line of sight:;', - SAI_TARGET_VEHICLE_ACCESSORY => 'accessory in Invokers vehicle in seat %1$d' + SAI_TARGET_VEHICLE_PASSENGER => 'accessory in Invokers vehicle in (%1$d)?seat %11$s:all seats;', +/*30*/ SAI_TARGET_CLOSEST_UNSPAWNED_GO => 'closest unspawned (%1$d)?[object=%1$d]:, arbitrary gameobject; within %11$sm' ), 'castFlags' => array( SAI_CAST_FLAG_INTERRUPT_PREV => 'Interrupt current cast', @@ -690,6 +703,11 @@ SAI_CAST_FLAG_AURA_MISSING => 'Aura missing', SAI_CAST_FLAG_COMBAT_MOVE => 'Combat movement' ), + 'spawnFlags' => array( + SAI_SPAWN_FLAG_IGNORE_RESPAWN => 'Override and reset respawn timer', + SAI_SPAWN_FLAG_FORCE_SPAWN => 'Force spawn if already in world', + SAI_SPAWN_FLAG_NOSAVE_RESPAWN => 'Remove respawn time on despawn' + ), 'GOStates' => ['active', 'ready', 'active alternative'], 'summonTypes' => [null, 'Despawn timed or when corpse disappears', 'Despawn timed or when dying', 'Despawn timed', 'Despawn timed out of combat', 'Despawn when dying', 'Despawn timed after death', 'Despawn when corpse disappears', 'Despawn manually'], 'aiTpl' => ['basic AI', 'spell caster', 'turret', 'passive creature', 'cage for creature', 'caged creature'], @@ -697,14 +715,18 @@ 'sheaths' => ['all', 'melee', 'ranged'], 'saiUpdate' => ['out of combat', 'in combat', 'always'], 'lootStates' => ['Not ready', 'Ready', 'Activated', 'Just Deactivated'], + 'weatherStates' => ['Fine', 'Fog', 'Drizzle', 'Light Rain', 'Medium Rain', 'Heavy Rain', 'Light Snow', 'Medium Snow', 'Heavy Snow', 22 => 'Light Sandstorm', 41=> 'Medium Sandstorm', 42 => 'Heavy Sandstorm', 86 => 'Thunders', 90 => 'Black Rain', 106 => 'Black Snow'], + + 'GOStateUNK' => '[span class=q10]unknown gameobject state #[b class=q1]%d[/b][/span]', + 'summonTypeUNK' => '[span class=q10]unknown SummonType #[b class=q1]%d[/b][/span]', + 'aiTplUNK' => '[span class=q10]unknown AI-Template #[b class=q1]%d[/b][/span]', + 'reactStateUNK' => '[span class=q10]unknown ReactState #[b class=q1]%d[/b][/span]', + 'sheathUNK' => '[span class=q10]unknown sheath #[b class=q1]%d[/b][/span]', + 'saiUpdateUNK' => '[span class=q10]unknown update condition #[b class=q1]%d[/b][/span]', + 'lootStateUNK' => '[span class=q10]unknown loot state #[b class=q1]%d[/b][/span]', + 'weatherStateUNK' => '[span class=q10]unknown weather state #[b class=q1]%d[/b][/span]', - 'GOStateUNK' => '[span class=q10]unknown gameobject state #[b class=q1]%d[/b][/span]', - 'summonTypeUNK' => '[span class=q10]unknown SummonType #[b class=q1]%d[/b][/span]', - 'aiTplUNK' => '[span class=q10]unknown AI-Template #[b class=q1]%d[/b][/span]', - 'reactStateUNK' => '[span class=q10]unknown ReactState #[b class=q1]%d[/b][/span]', - 'sheathUNK' => '[span class=q10]unknown sheath #[b class=q1]%d[/b][/span]', - 'saiUpdateUNK' => '[span class=q10]unknown update condition #[b class=q1]%d[/b][/span]', - 'lootStateUNK' => '[span class=q10]unknown loot state #[b class=q1]%d[/b][/span]', + 'entityUNK' => '[b class=q10]unknown entity[/b]', 'empty' => '[span class=q0][/span]' ), diff --git a/pages/npc.php b/pages/npc.php index d48d4dd2c..0dc945463 100644 --- a/pages/npc.php +++ b/pages/npc.php @@ -961,79 +961,10 @@ private function getOnKillRep($dummyIds, $mapType) private function getQuotes() { - $nQuotes = 0; - $quotes = []; - $quoteSrc = DB::World()->select(' - SELECT - ct.GroupID AS ARRAY_KEY, ct.ID as ARRAY_KEY2, ct.`Type`, - ct.TextRange AS `range`, - IFNULL(bct.`LanguageID`, ct.`Language`) AS lang, - IFNULL(NULLIF(bct.Text, ""), IFNULL(NULLIF(bct.Text1, ""), IFNULL(ct.`Text`, ""))) AS text_loc0, - {IFNULL(NULLIF(bctl.Text, ""), IFNULL(NULLIF(bctl.Text1, ""), IFNULL(ctl.Text, ""))) AS text_loc?d,} - IF(bct.SoundEntriesID > 0, bct.SoundEntriesID, ct.Sound) AS soundId - FROM - creature_text ct - {LEFT JOIN - creature_text_locale ctl ON ct.CreatureID = ctl.CreatureID AND ct.GroupID = ctl.GroupID AND ct.ID = ctl.ID AND ctl.Locale = ?} - LEFT JOIN - broadcast_text bct ON ct.BroadcastTextId = bct.ID - {LEFT JOIN - broadcast_text_locale bctl ON ct.BroadcastTextId = bctl.ID AND bctl.locale = ?} - WHERE - ct.CreatureID = ?d', - User::$localeId ?: DBSIMPLE_SKIP, - User::$localeId ? Util::$localeStrings[User::$localeId] : DBSIMPLE_SKIP, - User::$localeId ? Util::$localeStrings[User::$localeId] : DBSIMPLE_SKIP, - $this->typeId - ); - - foreach ($quoteSrc as $grp => $text) - { - $group = []; - foreach ($text as $t) - { - if ($t['soundId']) - $this->soundIds[] = $t['soundId']; - - $msg = Util::localizedString($t, 'text'); - if (!$msg) - continue; - - // fixup .. either set %s for emotes or dont >.< - if (in_array($t['Type'], [2, 16]) && strpos($msg, '%s') === false) - $msg = '%s '.$msg; - - // fixup: bad case-insensivity - $msg = str_replace('%S', '%s', $msg); + [$quotes, $nQuotes, $soundIds] = Game::getQuotesForCreature($this->typeId, true, $this->subject->getField('name', true)); - $line = array( - 'range' => $t['range'], - 'type' => 2, // [type: 0, 12] say: yellow-ish - 'lang' => !empty($t['lang']) ? Lang::game('languages', $t['lang']) : null, - 'text' => sprintf(Util::parseHtmlText(htmlentities($msg)), $this->subject->getField('name', true)), - ); - - switch ($t['Type']) - { - case 1: // yell: - case 14: $line['type'] = 1; break; // - dark red - case 2: // emote: - case 16: // " - case 3: // boss emote: - case 41: $line['type'] = 4; break; // - orange - case 4: // whisper: - case 15: // " - case 5: // boss whisper: - case 42: $line['type'] = 3; break; // - pink-ish - } - - $nQuotes++; - $group[] = $line; - } - - if ($group) - $quotes[$grp] = $group; - } + if ($soundIds) + $this->soundIds = array_merge($this->soundIds, $soundIds); return [$quotes, $nQuotes]; } diff --git a/pages/spell.php b/pages/spell.php index 2b0bfa8d0..ba594b045 100644 --- a/pages/spell.php +++ b/pages/spell.php @@ -2238,19 +2238,18 @@ private function ubSmartScript(int $type) : array */ $ids = []; - if ($smartS = DB::World()->selectCol('SELECT entryOrGUID AS ARRAY_KEY, source_type FROM smart_scripts WHERE entryorguid > 0 AND source_type IN (?d, 9) AND action_type IN (11, 75, 85, 86) AND action_param1 = ?d', $type, $this->typeId)) + if ($smartS = DB::World()->selectCol('SELECT entryOrGUID AS ARRAY_KEY, source_type FROM smart_scripts WHERE entryorguid > 0 AND source_type IN (?d, 9) AND action_type IN (11, 75, 85, 86) AND action_param1 = ?d', $src, $this->typeId)) { // filter for timed action list if ($tal = array_filter($smartS, function($x) {return $x == 9;})) { if ($talIds = DB::World()->selectCol('SELECT entryOrGUID FROM smart_scripts WHERE entryorguid > 0 AND source_type = ?d AND action_type IN (80, 87, 88) AND (action_param1 IN (?a) OR action_param2 IN (?a) OR action_param3 IN (?a) OR action_param4 IN (?a) OR action_param5 IN (?a) OR action_param6 IN (?a))', $type, array_keys($tal), array_keys($tal), array_keys($tal), array_keys($tal), array_keys($tal), array_keys($tal))) - $conditions[] = ['id', $talIds]; + $ids[] = ['id', $talIds]; $smartS = array_diff($smartS, $tal); } - if ($smartS); - $ids = $smartS; + $ids = array_merge($ids, $smartS); } return $ids; diff --git a/template/pages/npc.tpl.php b/template/pages/npc.tpl.php index e27fd234a..13337c6ce 100644 --- a/template/pages/npc.tpl.php +++ b/template/pages/npc.tpl.php @@ -51,9 +51,7 @@ $last = end($group); foreach ($group as $itr): - $_ = ($itr['type'] != 4 ? $this->name.' '.Lang::npc('textTypes', $itr['type']).Lang::main('colon').($itr['lang'] ? '['.$itr['lang'].'] ' : null) : null).$itr['text']; - - echo '
'.($itr['range'] ? sprintf(Util::$dfnString, Lang::npc('textRanges', $itr['range']), $_) : $_).'
'; + echo sprintf(sprintf($itr['text'], $itr['prefix']), $this->name); echo ($itr == $last) ? null : "\n
  • "; endforeach;