When your script goes wrong, the system finds the wrong code, deletes it, and then restarts the server.
function ReloadServer()
{
local loaded=[];
for(local i=0;i<100;i++)
{
local plr=FindPlayer(i);
if(plr)
{
loaded.append(plr.ID);
if(plr.Vehicle) plr.Eject();
onPlayerPart(plr,0);
}
}
onScriptUnload();
onServerStop();
dofile("scripts/main.nut");
onScriptLoad();
onServerStart();
for(local i=0;i<loaded.len();i++)
{
local plr=FindPlayer(loaded[i]);
if(plr)
{
onPlayerJoin(plr);
onPlayerRequestClass(plr,plr.Class,plr.Team,plr.Skin);
if(plr.IsSpawned==true) onPlayerSpawn(plr);
}
}
AnnounceAll("~p~Server Reload!",3);
}
function ReadTextFromFile(path)
{
local f=file(path,"rb"),s ="",n=0;
f.seek(0,'e');
n=f.tell();
if(n==0) return s;
f.seek(0,'b');
local b=f.readblob(n+1);
f.close();
for(local i=0;i<n;++i) s+=format(@"%c",b.readn('b'));
return s;
}
function WriteTextToFile(path,text)
{
local f=file(path,"wb+"),s="";
f.seek(0,'e');
foreach(c in text) f.writen(c,'b');
f.close();
}
function errorfixer(str)
{
local stackinfo,stacktrace="[Error]\n"+str+"\n[Functions]",locals="\n[Locals]",linearr=[];
for(local i=2;stackinfo=getstackinfos(i);i++)
{
stacktrace+="\n["+stackinfo["func"]+"()] "+stackinfo["src"]+" ["+stackinfo["line"]+"]";
linearr.append(stackinfo["line"].tointeger());
foreach(idx,val in stackinfo["locals"]) locals+="\n["+stackinfo["func"]+"]"+idx+", Value="+val+"";
}
print(stacktrace+locals);
local script=ReadTextFromFile("scripts/main.nut");
local arr=split(script,"\n"),data="";
for(local i=1;i<arr.len()+1;i++)
{
local find=false;
for(local ii=0;ii<linearr.len();ii++)
{
if(i==linearr[ii].tointeger())
{
find=true;
break;
}
if(find==false)
{
data+=arr[i-1];
break;
}
}
}
WriteTextToFile("scripts/main.nut",data);
ReloadServer();
}
seterrorhandler(errorfixer);