Merge pull request #383 from nonameShijian/PR-Branch

lib.init.jsSync,lib.init.reqSync,lib.init.jsonSync,change window.onerror change lib.init.req, change HTMLDivElement.prototype.listenTransition
This commit is contained in:
Spmario233 2023-09-25 17:27:28 +08:00 committed by GitHub
commit 082038a5aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 373 additions and 72 deletions

View File

@ -478,11 +478,11 @@
]),
characterDialogGroup:{
'收藏':function(name,capt){
return lib.config.favouriteCharacter.contains(name)?capt:null;
return lib.config.favouriteCharacter.includes(name)?capt:null;
},
'最近':function(name,capt){
var list=get.config('recentCharacter')||[];
return list.contains(name)?capt:null;
return list.includes(name)?capt:null;
}
},
listenEnd:function(node){
@ -7598,16 +7598,14 @@
return this;
};
HTMLDivElement.prototype.listenTransition=function(func,time){
var that=this;
var done=false;
var callback=function(){
if(!done){
func.call(that);
done=true;
}
const callback=()=>{
func.call(this);
clearTimeout(timer);
this.removeEventListener('webkitTransitionEnd',callback);
};
this.addEventListener('webkitTransitionEnd',callback);
return setTimeout(callback,time||1000);
const timer=setTimeout(callback,time||1000);
this.addEventListener('webkitTransitionEnd',callback,{once:true});
return timer;
};
HTMLDivElement.prototype.setPosition=function(){
var position;
@ -8016,36 +8014,230 @@
_status.windowLoaded=true;
}
};
window.onerror=function(msg, src, line, column, err){
var str=msg;
function getErrorTip(msg) {
if (typeof msg!='string') throw '传参错误:'+msg;
if (msg.startsWith('Uncaught ')) msg=msg.slice(9);
let newMessage=msg;
if (/RangeError/.test(newMessage)){
if(newMessage.includes("Maximum call stack size exceeded")){
newMessage="堆栈溢出";
}else if(/argument must be between 0 and 20/.test(newMessage)){
let funName=newMessage.slice(newMessage.indexOf('RangeError: ')+12,newMessage.indexOf(')')+1);
newMessage=funName+"参数必须在0和20之间";
} else {
newMessage="传递错误值到数值计算方法";
}
}else if(/ReferenceError/.test(newMessage)){
let messageName;
if (newMessage.includes("is not defined")){
messageName=newMessage.replace('ReferenceError: ', '').replace(' is not defined', '');
newMessage="引用了一个未定义的变量:"+messageName;
}else if(newMessage.includes("invalid assignment left-hand side")){
newMessage = "赋值运算符或比较运算符不匹配";
}else if(newMessage.includes("Octal literals are not allowed in strict mode")){
newMessage = "八进制字面量与八进制转义序列语法已经被废弃";
}else if(newMessage.includes("Illegal 'use strict' directive in function with non-simple parameter list")){
newMessage = "'use strict'指令不能使用在带有‘非简单参数’列表的函数";
}else if(newMessage.includes("Invalid left-hand side in assignment")){
newMessage = "赋值中的左侧无效即numberstring等不可赋值的非变量数据";
}
}else if(/SyntaxError/.test(newMessage)){
let messageName;
if(newMessage.includes("Unexpected token ")){
messageName=newMessage.replace('SyntaxError: Unexpected token ','');
newMessage="使用了未定义或错误的语法 : ("+messageName+")";
}else if(newMessage.includes(
"Block-scoped declarations (let, const, function, class) not yet supported outside strict mode")){
newMessage="请在严格模式下运行letconstclass";
}else if(newMessage.includes("for-of loop variable declaration may not have an initializer.")){
newMessage="for...of 循环的头部包含有初始化表达式";
}else if(newMessage.includes("for-in loop variable declaration may not have an initializer.")){
newMessage="for...in 循环的头部包含有初始化表达式";
}else if(newMessage.includes("Delete of an unqualified identifier in strict mode.")){
newMessage="普通变量不能通过 delete 操作符来删除";
}else if(newMessage.includes("Unexpected identifier")){
newMessage="不合法的标识符或错误的语法";
}else if(newMessage.includes("Invalid or unexpected token")){
newMessage="非法的或者不期望出现的标记符号出现在不该出现的位置";
}else if(newMessage.includes("Invalid regular expression flags")){
newMessage="无效的正则表达式的标记";
}else if(newMessage.includes("missing ) after argument list")){
newMessage="参数列表后面缺少 \')\' (丢失运算符或者转义字符等)";
}else if(newMessage.includes("Invalid shorthand property initializer")){
newMessage="在定义一个{}对象时,应该使用\':\'而不是\'=\'";
}else if(newMessage.includes("Missing initializer in const declaration")){
newMessage="在使用const定义一个对象时必须指定初始值";
}else if(newMessage.includes("Unexpected number")||newMessage.includes("Unexpected string")){
newMessage="在定义函数时,函数参数必须为合法标记符";
}else if(newMessage.includes("Unexpected end of input")){
newMessage="遗漏了符号或符号顺序不对(小括号,花括号等)";
}else if(newMessage.includes("has already been declared")){
messageName=newMessage.replace('SyntaxError: Identifier ', '').replace(' has already been declared', '');
newMessage=messageName +"变量已经被声明过,不能被重新声明";
}else if(newMessage.includes("Invalid or unexpected token")){
newMessage="查询无效或意外的标记,可能是字符串的引号不成对,错误使用了转义序列,字符串在多行中解析异常";
}else if(newMessage.includes("Duplicate parameter name not allowed in this context")) {
newMessage="参数名不允许重复";
}else if(newMessage.includes("Unexpected reserved word")||newMessage.includes(
"Unexpected strict mode reserved word")){
newMessage = "保留字被用作标记符";
}
}else if(/TypeError/.test(newMessage)){
let messageName;
if(newMessage.includes(" is not a function")){
messageName=newMessage.replace('TypeError: ', '').replace(' is not a function', '');
newMessage=messageName+"不是一个函数";
}else if(newMessage.includes(" is not a constructor")){
messageName=newMessage.replace('TypeError: ', '').replace(' is not a constructor', '');
newMessage=messageName+"不是一个构造函数";
}else if(newMessage.includes("Cannot read property")){
messageName=newMessage.replace('TypeError: Cannot read property ', '').replace(' of null', '').replace(' of undefined', '');
let ofName=newMessage.slice(newMessage.indexOf(" of ")+4);
newMessage="无法读取\'"+ofName+"\'的属性值"+messageName;
}else if(newMessage.includes("Cannot read properties")){
messageName=newMessage.slice(newMessage.indexOf("reading '")+9,-2);
let ofName=newMessage.slice(newMessage.indexOf(" of ")+4,newMessage.indexOf("(")-1);
newMessage="无法读取\'"+ofName+"\'的属性值"+messageName;
}else if(newMessage.includes("Property description must be an object")){
messageName=newMessage.replace('TypeError: Property description must be an object: ', '');
newMessage=messageName+"是非对象类型的值";
}else if(newMessage.includes("Cannot assign to read only property ")){
messageName=newMessage.slice(47,newMessage.lastIndexOf(' of ')+1);
newMessage=messageName+"属性禁止写入";
}else if(newMessage.includes("Object prototype may only be an Object or null")){
newMessage=messageName+"对象原型只能是对象或null";
}else if(newMessage.includes("Cannot create property")){
messageName=newMessage.slice(newMessage.indexOf('\'')+1);
messageName=messageName.slice(0,messageName.indexOf('\''));
let obj=newMessage.slice(newMessage.indexOf(messageName)+16);
newMessage=obj+"不能添加或修改\'"+messageName+"\'属性,任何 Primitive 值都不允许有property";
}else if(newMessage.includes("Can't add property")&&newMessage.includes("is not extensible")){
newMessage="对象不可添加属性(不可扩展)";
}else if(newMessage.includes("Cannot redefine property")){
messageName=newMessage.slice(37);
newMessage=messageName+"不可配置";
}else if(newMessage.includes("Converting circular structure to JSON")){
messageName=newMessage.slice(37);
newMessage="JSON.stringify() 方法处理循环引用结构的JSON会失败";
}else if(newMessage.includes("Cannot use 'in' operator to search for ")){
newMessage="in不能用来在字符串、数字或者其他基本类型的数据中进行检索";
}else if(newMessage.includes("Right-hand side of 'instanceof' is not an object")){
newMessage="instanceof 操作符 希望右边的操作数为一个构造对象,即一个有 prototype 属性且可以调用的对象";
}else if(newMessage.includes("Assignment to constant variable")){
newMessage="const定义的变量不可修改";
}else if(newMessage.includes("Cannot delete property")){
newMessage="不可配置的属性不能删除";
}else if(newMessage.includes("which has only a getter")){
newMessage="仅设置了getter特性的属性不可被赋值";
}else if(newMessage.includes("called on incompatible receiver undefined")){
newMessage="this提供的绑定对象与预期的不匹配";
}
}else if(/URIError/.test(newMessage)){
newMessage="一个不合法的URI";
}else if(/EvalError/.test(newMessage)){
newMessage="非法调用 eval()";
}else if(/InternalError/.test(newMessage)){
if(newMessage.includes("too many switch cases")){
newMessage="过多case子句";
}else if(newMessage.includes("too many parentheses in regular expression")){
newMessage="正则表达式中括号过多";
}else if(newMessage.includes("array initializer too large")){
newMessage="超出数组大小的限制";
}else if(newMessage.includes("too much recursion")){
newMessage="递归过深";
}
}
if(newMessage!=msg){
return newMessage;
}
};
window.onerror=function(msg,src,line,column,err){
const winPath=window.__dirname?('file:///'+(__dirname.replace(new RegExp('\\\\','g'),'/')+'/')):'';
let str=`错误文件: ${typeof src=='string'?decodeURI(src).replace(lib.assetURL,'').replace(winPath,''):'未知文件'}`;
str+=`\n错误信息: ${msg}`;
const tip=getErrorTip(msg);
if(tip) str+=`\n错误提示: ${tip}`;
str+=`\n行号: ${line}`;
str+=`\n列号: ${column}`;
const version=lib.version||'';
const reg=/[^\d\.]/;
const match=version.match(reg)!=null;
str+='\n'+`${match?'游戏':'无名杀'}版本: ${version||'未知版本'}`;
if(match) str+='\n⚠您使用的游戏代码不是源于libccy/noname无名杀官方仓库请自行寻找您所使用的游戏版本开发者反馈';
if(_status&&_status.event){
var evt=_status.event;
str+=('\n'+evt.name+': '+evt.step);
if(evt.parent) str+='\n'+evt.parent.name+': '+evt.parent.step;
if(evt.parent&&evt.parent.parent) str+='\n'+evt.parent.parent.name+': '+evt.parent.parent.step;
let evt=_status.event;
str+=`\nevent.name: ${evt.name}\nevent.step: ${evt.step}`;
if(evt.parent) str+=`\nevent.parent.name: ${evt.parent.name}\nevent.parent.step: ${evt.parent.step}`;
if(evt.parent&&evt.parent.parent) str+=`\nevent.parent.parent.name: ${evt.parent.parent.name}\nevent.parent.parent.step: ${evt.parent.parent.step}`;
if(evt.player||evt.target||evt.source||evt.skill||evt.card){
str+='\n-------------'
}
if(evt.player){
str+='\nplayer: ' + evt.player.name;
if(lib.translate[evt.player.name]) str+=`\nplayer: ${lib.translate[evt.player.name]}[${evt.player.name}]`;
else str+='\nplayer: '+evt.player.name;
let distance=get.distance(_status.roundStart,evt.player,'absolute');
if (distance!=Infinity) {
str+=`\n座位号: ${distance+1}`;
}
}
if(evt.target){
str+='\ntarget: ' + evt.target.name;
if(lib.translate[evt.target.name]) str+=`\ntarget: ${lib.translate[evt.target.name]}[${evt.target.name}]`;
else str+='\ntarget: '+evt.target.name;
}
if(evt.source){
str+='\nsource: ' + evt.source.name;
if(lib.translate[evt.source.name]) str+=`\nsource: ${lib.translate[evt.source.name]}[${evt.source.name}]`;
else str+='\nsource: '+evt.source.name;
}
if(evt.skill){
str+='\nskill: ' + evt.skill.name;
if(lib.translate[evt.skill]) str+=`\nskill: ${lib.translate[evt.skill]}[${evt.skill}]`;
else str+='\nskill: '+evt.skill;
}
if(evt.card){
str+='\ncard: ' + evt.card.name;
if(lib.translate[evt.card.name]) str+=`\ncard: ${lib.translate[evt.card.name]}[${evt.card.name}]`;
else str+='\ncard: '+evt.card.name;
}
}
str+='\n-------------';
str+='\n'+line;
str+='\n'+column;
if(err&&err.stack) str+='\n'+decodeURI(err.stack);
if(typeof line=='number'&&(typeof game.readFile=='function'||location.origin!='file://')){
function createShowCode(lines){
let showCode='';
if(lines.length>=10){
if(line>4){
for(let i=line-5;i<line+6&&i<lines.length;i++){
showCode+=`${i}| ${line==i+1?'⚠️':''}${lines[i]}\n`;
}
}else{
for(let i=0;i<line+6&&i<lines.length;i++){
showCode+=`${i}| ${line==i+1?'⚠️':''}${lines[i]}\n`;
}
}
}else{
showCode=lines.map((_line,i)=>`${i}| ${line==i+1?'⚠️':''}${_line}\n`).toString();
}
return showCode;
}
//协议名须和html一致(网页端防跨域)且文件是js
if (typeof src=='string'&&src.startsWith(location.protocol)&&src.endsWith('.js')){
//获取代码
const codes=lib.init.reqSync('local:'+decodeURI(src).replace(lib.assetURL,'').replace(winPath,''));
const lines=codes.split("\n");
str+='\n'+createShowCode(lines);
str+='\n-------------';
}
//解析parsex里的content fun内容(通常是技能content)
else if(err&&err.stack&&err.stack.split('\n')[1].trim().startsWith('at Object.eval [as content]')){
const codes=_status.event.content;
if(typeof codes=='function'){
const lines=codes.toString().split("\n");
str+='\n'+createShowCode(lines);
str+='\n-------------';
}
}
}
if(err&&err.stack) str+='\n'+decodeURI(err.stack).replace(new RegExp(lib.assetURL,'g'),'').replace(new RegExp(winPath,'g'),'');
alert(str);
window.ea=Array.from(arguments);
window.em=msg;
@ -8081,6 +8273,7 @@
}
lib.assetURL=noname_inited;
}
if(lib.assetURL.indexOf('com.widget.noname.qingyao')!='-1'){
alert('您正在一个不受信任的闭源客户端上运行《无名杀》。建议您更换为其他开源的无名杀客户端,避免给您带来不必要的损失。');
}
@ -9885,12 +10078,7 @@
if(lib.config.all.stockmode.indexOf(lib.config.all.mode[i])!=-1){
// 初始启动页设置
if(lib.config.splash_style==undefined){
if(lib.device){
var item='style2';
}else{
var item='style1';
}
lib.configMenu.appearence.config.splash_style.onclick(item);
lib.configMenu.appearence.config.splash_style.onclick('style1');
}
splash.dataset.splash_style=lib.config.splash_style;
// 扩展可通过window.splashurl设置素材读取路径
@ -10072,58 +10260,171 @@
if(!file) script_src=path;
else script_src=`${path}/${file}.js`;
if(path.indexOf('http')==0) script_src+=`?rand=${get.id()}`;
else if(game.readFile&&lib.config.fuck_sojson&&script_src.includes('extension')!=-1&&script_src.indexOf(lib.assetURL)==0){
else if(lib.config.fuck_sojson&&script_src.includes('extension')!=-1&&script_src.indexOf(lib.assetURL)==0){
const path_to_read=script_src.slice(lib.assetURL.length);
game.readFileAsText(path_to_read,result=>{
if(result.includes('sojson')||result.includes('jsjiami')||result.includes('var _0x')) alert(`检测到您安装了使用免费版sojson进行加密的扩展。请谨慎使用这些扩展避免游戏数据遭到破坏。\n扩展文件:${path_to_read}`);
},()=>void 0);
const alertMsg=`检测到您安装了使用免费版sojson进行加密的扩展。请谨慎使用这些扩展避免游戏数据遭到破坏。\n扩展文件:${path_to_read}`;
if(typeof game.readFileAsText=='function'){
game.readFileAsText(path_to_read,result=>{
if(result.includes('sojson')||result.includes('jsjiami')||result.includes('var _0x')) alert(alertMsg);
},()=>void 0);
}else if(location.origin!='file://'){
lib.init.reqSync(path_to_read,function(){
var result = this.responseText;
if(result.includes('sojson')||result.includes('jsjiami')||result.includes('var _0x')) alert(alertMsg);
},e=>{});
}
}
const script=document.createElement('script');
script.src=script_src;
if(path.indexOf('http')==0) script.addEventListener('load',()=>script.remove());
document.head.appendChild(script);
if(typeof onload=='function'){
script.addEventListener('load',onload);
script.addEventListener('error',onerror);
}
if(typeof onload=='function') script.addEventListener('load',onload);
if(typeof onerror=='function') script.addEventListener('error',onerror);
return script;
},
req:function(str,onload,onerror,master){
var sScriptURL;
if(str.indexOf('http')==0){
sScriptURL=str;
/**
* 同步lib.init.js
* @returns { void }
*/
jsSync:(path,file,onload,onerror)=>{
if(lib.assetURL.length==0&&location.origin=='file://'&&typeof game.readFile=='undefined'){
const e=new Error('浏览器file协议下无法使用此api请在http/https协议下使用此api');
if(typeof onerror=='function') onerror(e);
else throw e;
return;
}
else{
var url=get.url(master);
if(url[url.length-1]!='/'){
url+='/';
if(path[path.length-1]=='/') path=path.slice(0,path.length-1);
if(path==`${lib.assetURL}mode`&&lib.config.all.stockmode.indexOf(file)==-1){
lib.genAwait(lib.init[`setMode_${file}`]()).then(onload);
return;
}
if(Array.isArray(file)){
return file.forEach(value=>lib.init.js(path,value,onload,onerror));
}
let script_src;
if(!file) script_src=path;
else script_src=`${path}/${file}.js`;
if(path.indexOf('http')==0) script_src+=`?rand=${get.id()}`;
const xhr=new XMLHttpRequest();
let data;
xhr.addEventListener("load",()=>{
data=xhr.responseText;
if(!data) {
if(typeof onerror=='function') onerror(new Error(script_src + '加载失败!'));
return;
}
if(lib.config.fuck_sojson&&script_src.includes('extension')!=-1&&script_src.indexOf(lib.assetURL)==0){
const path_to_read=script_src.slice(lib.assetURL.length);
if(data.includes('sojson')||data.includes('jsjiami')||data.includes('var _0x')) alert(`检测到您安装了使用免费版sojson进行加密的扩展。请谨慎使用这些扩展避免游戏数据遭到破坏。\n扩展文件:${path_to_read}`);
}
sScriptURL=url+str;
}
var oReq=new XMLHttpRequest();
if(onload) oReq.addEventListener("load",onload);
if(onerror) oReq.addEventListener("error",onerror);
oReq.open("GET", sScriptURL);
oReq.send();
},
json:function(url,onload,onerror){
var oReq=new XMLHttpRequest();
if(onload) oReq.addEventListener("load",function(){
var result;
try{
result=JSON.parse(this.responseText);
if(!result){
throw('err');
window.eval(data);
if(typeof onload=='function'){
onload();
}
}catch(error){
if(typeof onerror=='function'){
onerror(error);
}
}
});
if(typeof onerror=='function') xhr.addEventListener("error",onerror);
xhr.open("GET",script_src,false);
xhr.send();
},
req:(str,onload,onerror,master)=>{
let sScriptURL;
if(str.indexOf('http')==0) sScriptURL=str;
else if(str.startsWith('local:')){
if(lib.assetURL.length==0&&location.origin=='file://'&&typeof game.readFile=='undefined'){
const e=new Error('浏览器file协议下无法使用此api请在http/https协议下使用此api');
if(typeof onerror=='function') onerror(e);
else throw e;
return;
}
sScriptURL=lib.assetURL+str.slice(6);
}
else{
let url=get.url(master);
if(url[url.length-1]!='/') url+='/';
sScriptURL=url+str;
}
const oReq=new XMLHttpRequest();
if(typeof onload=='function') oReq.addEventListener("load",onload);
if(typeof onerror=='function') oReq.addEventListener("error",onerror);
oReq.open("GET",sScriptURL);
oReq.send();
},
/**
* 同步lib.init.req
*/
reqSync:(str,onload,onerror,master)=>{
let sScriptURL;
if(str.indexOf('http')==0) sScriptURL=str;
else if(str.startsWith('local:')){
if(lib.assetURL.length==0&&location.origin=='file://'&&typeof game.readFile=='undefined'){
const e=new Error('浏览器file协议下无法使用此api请在http/https协议下使用此api');
if(typeof onerror=='function') onerror(e);
else throw e;
return;
}
sScriptURL=lib.assetURL+str.slice(6);
}
else{
let url=get.url(master);
if(url[url.length-1]!='/')url+='/';
sScriptURL=url+str;
}
const oReq=new XMLHttpRequest();
if(typeof onload=='function') oReq.addEventListener("load",onload);
if(typeof onerror=='function') oReq.addEventListener("error",onerror);
oReq.open("GET",sScriptURL,false);
oReq.send();
if(typeof onload!=='function') return oReq.responseText;
},
json:(url,onload,onerror)=>{
const oReq=new XMLHttpRequest();
if(typeof onload=='function') oReq.addEventListener("load",()=>{
let result;
try{
result=JSON.parse(oReq.responseText);
if(!result) throw('err');
}
catch(e){
onerror();
if(typeof onerror=='function') onerror(e);
return;
}
onload(result);
});
if(onerror) oReq.addEventListener("error",onerror);
oReq.open("GET", url);
if(typeof onerror=='function') oReq.addEventListener("error",onerror);
oReq.open("GET",url);
oReq.send();
},
/**
* 同步lib.init.json
*/
jsonSync:(url,onload,onerror)=>{
if(lib.assetURL.length==0&&location.origin=='file://'&&typeof game.readFile=='undefined'){
const e=new Error('浏览器file协议下无法使用此api请在http/https协议下使用此api');
if(typeof onerror=='function') onerror(e);
else throw e;
return;
}
const oReq=new XMLHttpRequest();
if(typeof onload=='function') oReq.addEventListener("load",()=>{
let result;
try{
result=JSON.parse(oReq.responseText);
if(!result) throw('err');
}
catch(e){
if(typeof onerror=='function') onerror(e);
return;
}
onload(result);
});
if(typeof onerror=='function') oReq.addEventListener("error",onerror);
oReq.open("GET",url,false);
oReq.send();
},
cssstyles:function(){
@ -28823,7 +29124,7 @@
lib.element.content[item]._parsed=true;
}
}
catch{
catch(_){
throw new Error(`Content ${item} may not exist.\nlib.element.content[${item}] = ${lib.element.content[item]}`);
}
this.content=lib.element.content[item];
@ -33819,7 +34120,7 @@
if(typeof player=='string') player={name:player};
else{
if(info.direct&&!directaudio) return;
if(lib.skill.global.contains(skill)&&!lib.skill[skill].forceaudio) return;
if(lib.skill.global.includes(skill)&&!lib.skill[skill].forceaudio) return;
}
var audioname=skill;
var audioinfo=info.audio;
@ -33840,7 +34141,7 @@
}
var history=[];
for(;;){//可以嵌套引用了
if(history.contains(audioname)) break;
if(history.includes(audioname)) break;
history.push(audioname);
if(typeof audioinfo=='string'&&lib.skill[audioinfo]){
audioname=audioinfo;
@ -33856,9 +34157,9 @@
break;
}
if(Array.isArray(info.audioname)&&player){
if(info.audioname.contains(player.name)&&!info.audioname2[player.name]) audioname+='_'+player.name;
else if(info.audioname.contains(player.name1)&&!info.audioname2[player.name1]) audioname+='_'+player.name1;
else if(info.audioname.contains(player.name2)&&!info.audioname2[player.name2]) audioname+='_'+player.name2;
if(info.audioname.includes(player.name)&&!info.audioname2[player.name]) audioname+='_'+player.name;
else if(info.audioname.includes(player.name1)&&!info.audioname2[player.name1]) audioname+='_'+player.name1;
else if(info.audioname.includes(player.name2)&&!info.audioname2[player.name2]) audioname+='_'+player.name2;
}
if(typeof audioinfo=='string'){
if(audioinfo.indexOf('ext:')!=0) return;
@ -33881,7 +34182,7 @@
},
playSkillAudio:function(name,index){
if(_status.video&&arguments[1]!='video') return;
if(!lib.config.repeat_audio&&_status.skillaudio.contains(name)) return;
if(!lib.config.repeat_audio&&_status.skillaudio.includes(name)) return;
game.addVideo('playSkillAudio',null,name);
if(name.indexOf('|')<name.lastIndexOf('|')){
name=name.slice(name.lastIndexOf('|')+1);